diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..9cf107aa94 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*~ +*.bak + +Build +*.user +*.suo +*.ipch +*.sdf +*.opensdf +*.DS_Store + +# Meson +/build +/_build +/subprojects diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..c61aa7a529 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1 @@ +include: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/master/gitlab/ci_template.yml" diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000000..5cef5a371e --- /dev/null +++ b/AUTHORS @@ -0,0 +1,21 @@ +Erik Walthinsen +Matt Howell +Brent Bradburn +Wim Taymans +Richard Boulton +Zaheer Abbas Merali +David I. Lehn +Chris Emerson +Jens Thiele +Thomas Nyberg +Bastien Nocera +Christian Fredrik Kalager Schaller +Thomas Vander Stichele +Andy Wingo +Cameron Hutchison +David Schleef +Benjamin Otte +Ronald Bultje +Julien MOUTTE +Jan Schmidt +Arwed v. Merkatz diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..8add30ad59 --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000000..b747f21ea5 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,25034 @@ +=== release 1.19.2 === + +2021-09-23 01:34:00 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.19.2 + +2021-09-21 15:05:58 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Strip trailing whitespace from x264's log messages + x264 has linebreaks at the end of its log messages that we should + ignore. + Add G_GNUC_PRINTF to the callback to make sure GCC lets us forward the + format string to another function marked as printf (g_strdup_vprintf) + without triggering -Wformat-nonliteral. + Part-of: + +2021-09-21 14:57:29 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Add the func/line info to the log callback + It looks awkward when it's missing. At least point us at the callback + function. + Part-of: + +2021-09-21 14:56:23 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Reduce log spam about bit depth support + Part-of: + +2021-07-28 11:49:16 +0200 Stéphane Cerveau + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: drop B-frame on open gop + Enhance open gop detection to drop B-frame which are invalid + before the first reference frame. + In stream such + gst-integration-testsuites/medias/defaults/mxf/op2b-mpeg2-wave_hd.mxf, + the two first frames must be dropped as we detect an open GOP situation + but in another media, such as http://col.la/1920X1080IXDCAMEX5MIN, the + first frames should not be dropped as we are in a closed GOP situation. + Part-of: + +2021-05-22 01:53:43 +0100 Tim-Philipp Müller + + * ext/x264/gstencoderbitrateprofilemanager.c: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rtspreal.c: + * meson.build: + Use g_memdup2() where available and add fallback for older GLib versions + - x264 encoder bitrate profile manager: alloc size is based + on existing allocation + - asfdemux: change length var to 64-bit and check for G_MAXUINT + - realmedia: opaque_data_len is read from 32 bits and then + only subtracted upon. + g_memdup() is deprecated since GLib 2.68 and we want to avoid + deprecation warnings with recent versions of GLib. + Part-of: + +2021-06-01 15:28:40 +0100 Tim-Philipp Müller + + * meson.build: + Back to development + +=== release 1.19.1 === + +2021-06-01 00:12:09 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * README: + * RELEASE: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.19.1 + +2018-02-26 17:28:25 +0100 David Fernandez + + * docs/gst_plugins_cache.json: + * ext/x264/gstx264enc.c: + x264enc: Change accepted caps width and height from [16, MAX] to [1, MAX] + There are cases where the video size might be less than 16x16. + This change allows the x264 encoder to accept this cases. + Part-of: + +2021-04-20 18:48:38 -0400 Doug Nazar + + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + realmedia: Drop duplicate seek events. + Also use seek seqnum for flush & segment events/messages. + Part-of: + +2021-04-20 18:47:31 -0400 Doug Nazar + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Drop duplicate seek events. + Part-of: + +2021-03-29 13:41:07 +0200 Stéphane Cerveau + + * gst/xingmux/gstxingmux.c: + * gst/xingmux/gstxingmux.h: + * gst/xingmux/plugin.c: + xingmux: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 13:39:20 +0200 Stéphane Cerveau + + * gst/realmedia/pnmsrc.c: + * gst/realmedia/pnmsrc.h: + * gst/realmedia/rademux.c: + * gst/realmedia/rademux.h: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtdepay.h: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rdtmanager.h: + * gst/realmedia/realmedia.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + * gst/realmedia/rtspreal.c: + * gst/realmedia/rtspreal.h: + realmedia: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 13:23:51 +0200 Stéphane Cerveau + + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + * gst/dvdsub/gstdvdsubparse.c: + * gst/dvdsub/gstdvdsubparse.h: + dvdsub: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 13:15:32 +0200 Stéphane Cerveau + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 13:11:23 +0200 Stéphane Cerveau + + * gst/asfdemux/gstasf.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstasfelement.c: + * gst/asfdemux/gstasfelements.h: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtspwms.c: + * gst/asfdemux/meson.build: + asfdemux: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 12:39:36 +0200 Stéphane Cerveau + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 12:33:00 +0200 Stéphane Cerveau + + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + sidplay: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 12:31:26 +0200 Stéphane Cerveau + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 12:28:28 +0200 Stéphane Cerveau + + * ext/dvdread/dvdreadsrc.c: + * ext/dvdread/dvdreadsrc.h: + dvdread: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 12:28:04 +0200 Stéphane Cerveau + + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + cdio: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 10:39:46 +0200 Stéphane Cerveau + + * ext/amrwbdec/amrwb.c: + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + amrwbdec: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 10:38:07 +0200 Stéphane Cerveau + + * ext/amrnb/amrnb.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbenc.h: + amrnb: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-29 10:37:26 +0200 Stéphane Cerveau + + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + a52dec: allow per feature registration + Split plugin into features including + dynamic types which can be indiviually + registered during a static build. + More details here: + https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 + Part-of: + +2021-03-19 15:16:06 +1100 Matthew Waters + + * ext/x264/gstencoderbitrateprofilemanager.c: + gst: don't use volatile to mean atomic + volatile is not sufficient to provide atomic guarantees and real atomics + should be used instead. GCC 11 has started warning about using volatile + with atomic operations. + https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1719 + Discovered in https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/868 + Part-of: + +2021-03-03 11:05:14 +0200 Sebastian Dröge + + * gst/realmedia/rmdemux.c: + rmdemux: Make sure we have enough data available when parsing audio/video packets + Otherwise there will be out-of-bounds reads and potential crashes. + Thanks to Natalie Silvanovich for reporting. + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly/-/issues/37 + Part-of: + +2020-11-04 18:44:07 +0530 Nirbheek Chauhan + + * meson.build: + meson: Enable some MSVC warnings for parity with GCC/Clang + This makes it easier to do development with MSVC by making it warn + on common issues that GCC/Clang error out for in our CI configuration. + Continuation from https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/223 + Part-of: + +2020-10-31 04:52:14 +0900 Seungha Yang + + * tests/check/elements/mpeg2dec.c: + tests: mpeg2dec: Don't expect BT601 color space + If it's required, mpeg2dec should set it explicitly. + Part-of: + +2020-09-08 17:30:39 +0100 Tim-Philipp Müller + + * .gitlab-ci.yml: + ci: include template from gst-ci master branch again + +2020-09-08 16:58:40 +0100 Tim-Philipp Müller + + * meson.build: + Back to development + +=== release 1.18.0 === + +2020-09-08 00:05:39 +0100 Tim-Philipp Müller + + * .gitlab-ci.yml: + * ChangeLog: + * NEWS: + * README: + * RELEASE: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.18.0 + +2020-09-07 22:40:46 +0100 Tim-Philipp Müller + + * meson.build: + * scripts/dist-translations.py: + * scripts/meson.build: + meson: dist pot file in tarball + Part-of: + +2020-09-07 12:14:13 +0300 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264: Update for gst_video_transfer_function_*() function renaming + Part-of: + +2020-08-21 10:35:11 +0300 Sebastian Dröge + + * docs/gst_plugins_cache.json: + * ext/x264/gstx264enc.c: + x264enc: Allow maximum quantizer value of 63 instead of 51 + QP_MAX_SPEC in x264 is set to 63 nowadays and in theory it allows even + up to 81 (QP_MAX) but that seems to be outside the spec. + Part-of: + +=== release 1.17.90 === + +2020-08-20 16:12:23 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.17.90 + +2020-07-15 10:49:03 +0300 Jordan Petridis + + * tests/check/elements/amrnbenc.c: + amrnbenc: remove global variables + gstcheck is declaring its own buffers glist which ends up + overwritten, loks like the code meant to use that already + gcc 10 is also complaining about this, but only on static + builds for some reason + ``` + FAILED: subprojects/gst-plugins-ugly/tests/check/elements_amrnbenc + /usr/bin/ld: subprojects/gstreamer/libs/gst/check/libgstcheck-1.0.a(gstcheck.c.o):(.bss+0x38): multiple definition of `buffers'; subprojects/gst-plugins-ugly/tests/check/708af1f@@elements_amrnbenc@exe/elements_amrnbenc.c.o:(.bss+0x18): first defined here + collect2: error: ld returned 1 exit status + ``` + also remove unused var `current_buf` + Part-of: + +2020-04-02 03:27:26 +1100 Jan Schmidt + + * gst/realmedia/rmdemux.c: + rmdemux: Don't ignore the return value of gst_segment_do_seek() + If gst_segment_do_seek() fails, fail the seek. + Part-of: + +2020-04-01 19:34:30 +1100 Jan Schmidt + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't ignore the return result of gst_segment_do_seek() + gst_segment_do_seek() can fail, and our seek should fail + accordingly. + Part-of: + +2020-04-17 11:34:16 -0500 Derek Lesho + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Only forward SEEK event when in push mode. + Part-of: + +2020-07-25 21:19:20 +0100 Stéphane Cerveau + + * meson.build: + meson: add a plugin summary + This summary displays a list of plugins which + have been enabled. + Part-of: + +2018-10-03 13:32:11 +0200 Thibault Saunier + + * ext/x264/GstX264Enc.prs: + x264enc: Add a 'Zero Latency' profile + Part-of: + +2020-07-22 17:31:37 +0200 Mathieu Duponchelle + + * tests/check/elements/x264enc.c: + tests/x264enc: Don't declare variables inside the for loop header + This is a C99 feature + Part-of: + +2020-07-21 15:40:26 +0200 Jan Alexander Steffens (heftig) + + * tests/check/elements/x264enc.c: + tests: x264enc: Test formats are compatible with profile + Part-of: + +2020-07-01 16:11:09 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Separate high-10 video formats from 8-bit formats + If downstream is constrained to an 8-bit profile, caps queries would + still allow I420_10LE as input. If upstream actually sends such a caps + event, downstream would fail to accept the high-10 profile. + The following pipeline now fails earlier, during the negotiation phase + instead of the stream start: + gst-launch-1.0 videotestsrc ! video/x-raw,format=I420_10LE \ + ! x264enc ! video/x-h264,profile=constrained-baseline \ + ! fakesink + Part-of: + +2020-07-21 15:39:31 +0200 Jan Alexander Steffens (heftig) + + * tests/check/elements/x264enc.c: + tests: x264enc: Test 10-bit formats + Part-of: + +2020-07-21 15:33:57 +0200 Jan Alexander Steffens (heftig) + + * tests/check/elements/x264enc.c: + tests: x264enc: Test all (8-bit) video formats + Part-of: + +2020-07-06 22:13:55 -0400 Thibault Saunier + + * ext/x264/gstx264enc.c: + x264enc: Forward downstream colorimetry and chroma-site upstream + So that the value can be used by upstream converters when necessary. + This whole logic has been copied from `__gst_video_element_proxy_caps` + but those 2 fields were missing. + Part-of: + +2020-07-08 17:07:35 +0100 Tim-Philipp Müller + + * meson.build: + * scripts/extract-release-date-from-doap-file.py: + meson: set release date from .doap file for releases + Part-of: + +2020-07-03 02:03:37 +0100 Tim-Philipp Müller + + * meson.build: + Back to development + +=== release 1.17.2 === + +2020-07-03 00:29:25 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.17.2 + +2020-06-23 00:03:04 +0200 Mathieu Duponchelle + + * docs/meson.build: + meson: mark plugins cache target as always stale + +2020-06-19 22:55:28 -0400 Thibault Saunier + + * docs/gst_plugins_cache.json: + doc: Stop documenting properties from parents + +2020-06-20 00:28:13 +0100 Tim-Philipp Müller + + * meson.build: + Back to development + +=== release 1.17.1 === + +2020-06-19 19:20:41 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * docs/gst_plugins_cache.json: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.17.1 + +2020-06-09 15:13:47 -0400 Thibault Saunier + + * docs/gst_plugins_cache.json: + docs: Update plugins cache + +2020-06-08 09:37:10 -0400 Thibault Saunier + + * docs/gst_plugins_cache.json: + docs: Update plugins cache + +2020-06-06 10:15:25 +0100 Philippe Normand + + * ext/sidplay/gstsiddec.cc: + siddec: update gst_type_mark_as_plugin_api() calls + This was left behind in commit bc1ab5e8e00a7ed6ac5e192af9310bd2146e446a. + Part-of: + +2020-06-06 00:41:38 +0200 Mathieu Duponchelle + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/x264/gstx264enc.c: + plugins: uddate gst_type_mark_as_plugin_api() calls + +2020-06-03 18:38:28 -0400 Thibault Saunier + + * docs/meson.build: + doc: Require hotdoc >= 0.11.0 + +2020-05-27 16:02:02 +0300 Sebastian Dröge + + * docs/gst_plugins_cache.json: + docs: Update gst_plugins_cache.json + +2020-05-30 23:16:50 +0300 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + plugins: Use gst_type_mark_as_plugin_api() for all non-element plugin types + +2020-06-02 00:41:23 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: extract WM/PartOfSet disc number and count metadata + Fixes #30 + Part-of: + +2020-06-02 00:40:48 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: sprinkle some INDENT-OFF + Part-of: + +2020-05-27 14:42:20 +0100 Tim-Philipp Müller + + * tests/check/meson.build: + tests: fix meson test env setup to make sure we use the right gst-plugin-scanner + If core is built as a subproject (e.g. as in gst-build), make sure to use + the gst-plugin-scanner from the built subproject. Without this, gstreamer + might accidentally use the gst-plugin-scanner from the install prefix if + that exists, which in turn might drag in gst library versions we didn't + mean to drag in. Those gst library versions might then be older than + what our current build needs, and might cause our newly-built plugins + to get blacklisted in the test registry because they rely on a symbol + that the wrongly-pulled in gst lib doesn't have. + This should fix running of unit tests in gst-build when invoking + meson test or ninja test from outside the devenv for the case where + there is an older or different-version gst-plugin-scanner installed + in the install prefix. + In case no gst-plugin-scanner is installed in the install prefix, this + will fix "GStreamer-WARNING: External plugin loader failed. This most + likely means that the plugin loader helper binary was not found or + could not be run. You might need to set the GST_PLUGIN_SCANNER + environment variable if your setup is unusual." warnings when running + the unit tests. + In the case where we find GStreamer core via pkg-config we use + a newly-added pkg-config var "pluginscannerdir" to get the right + directory. This has the benefit of working transparently for both + installed and uninstalled pkg-config files/setups. + Part-of: + +2020-05-27 09:13:17 +0200 Guillaume Desmottes + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: fix uninitialized warning + Variable is always set in actual code paths but let's keep gcc happy. + Part-of: + +2020-05-12 05:07:47 +0530 Nirbheek Chauhan + + * ext/sidplay/meson.build: + * meson.build: + meson: Pass native: false to add_languages() + This is needed for cross-compiling without a build machine compiler + available. The option was added in 0.54, but we only need this in + Cerbero and it doesn't affect older versions so it should be ok. + Will just cause a spurious warning. + Part-of: + +2020-04-03 14:24:46 -0500 Derek Lesho + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Always re-initialize metadata and global_metadata + When transitioning from the PAUSED state, to the READY state, and back, + metadata and global_metadata are left uninitialized, unlike when the + demxuer transitions from NULL to READY, then to PAUSED. I have found + this to cause a segmentation fault when fields in these structures are + set. + +2020-04-02 16:18:00 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Fix 'ref' property range and default + The --ref option indicate the size of the DPB, hence should be in the range of + 0 to 16. This patch also fix the default to match x264enc default 3. This + change isn't a behaviour change since we don't enforce the reported default. + +2020-03-19 18:05:43 -0300 Thibault Saunier + + * ext/a52dec/gsta52dec.c: + a52dec: Mark as converter + It is able to do channel downminxing, so technically it is also a + converter + This is also important so validate knows about that when doing its + checks + +2019-10-17 14:55:51 +0200 Thibault Saunier + + * ext/x264/gstencoderbitrateprofilemanager.c: + * ext/x264/gstencoderbitrateprofilemanager.h: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + * ext/x264/meson.build: + x264enc: Respect Youtube bitrate recommandation + Properly follow google recommendations[0] concerning bitrate when the + user wants to use the youtube profile. + [0]: https://support.google.com/youtube/answer/1722171?hl=en + +2019-12-18 16:09:42 +0100 Stéphane Cerveau + + * ext/dvdread/dvdreadsrc.c: + ugly: use of g_value_dup_string + Use helper method to get string from GValue. + +2019-12-14 18:49:54 +0700 Dmitry Shusharin + + * ext/x264/gstx264enc.c: + x264enc: fixed codestyle + +2019-12-14 17:15:21 +0700 Dmitry Shusharin + + * ext/x264/gstx264enc.c: + x264enc: corrected em_data value in CEA-708 CC SEI message (fixes #28) + Section 4.4 of CEA-708-D specification (table 2) requires all bits to be + set inside em_data field. h264parse element (and possible third-party + decoders such as libav) also follows this requirement. + https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly/issues/28 + +2019-06-09 00:30:53 +0100 Tim-Philipp Müller + + * .gitignore: + * .gitmodules: + * Makefile.am: + * README: + * autogen.sh: + * common: + * configure.ac: + * docs/.gitignore: + * docs/version.entities.in: + * ext/Makefile.am: + * ext/a52dec/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/mpeg2dec/.gitignore: + * ext/mpeg2dec/Makefile.am: + * ext/sidplay/Makefile.am: + * ext/x264/Makefile.am: + * gst-libs/Makefile.am: + * gst-libs/gst/Makefile.am: + * gst/Makefile.am: + * gst/asfdemux/.gitignore: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/realmedia/.gitignore: + * gst/realmedia/Makefile.am: + * gst/xingmux/Makefile.am: + * m4/.gitignore: + * m4/Makefile.am: + * m4/README: + * m4/a52.m4: + * m4/aalib.m4: + * m4/as-ffmpeg.m4: + * m4/as-slurp-ffmpeg.m4: + * m4/check-libheader.m4: + * m4/freetype2.m4: + * m4/gconf-2.m4: + * m4/glib.m4: + * m4/gst-fionread.m4: + * m4/gst-ivorbis.m4: + * m4/gst-sdl.m4: + * m4/gst-shout2.m4: + * m4/gst-sid.m4: + * m4/gtk.m4: + * m4/libfame.m4: + * m4/libmikmod.m4: + * m4/lrint.m4: + * m4/lrintf.m4: + * pkgconfig/.gitignore: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-plugins-ugly-uninstalled.pc.in: + * po/.gitignore: + * po/Makevars: + * po/POTFILES: + * tests/Makefile.am: + * tests/check/.gitignore: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/generic/.gitignore: + * tests/files/Makefile.am: + Remove autotools build system + +2019-09-02 09:33:15 -0400 Aaron Boxer + + * NEWS: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/realmedia/rdtjitterbuffer.c: + * gst/realmedia/rtspreal.c: + * hooks/pre-commit.hook: + documentation: fix some typos + +2019-08-23 19:06:59 +0200 Mathieu Duponchelle + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + docstrings: port ulinks to markdown links + +2019-08-23 16:25:25 +1000 Matthew Waters + + * docs/meson.build: + meson: Don't generate doc cache when no plugins are enabled + Fixes gst-build with -Dauto-features=disabled -Dugly=enabled + +2019-07-15 21:56:57 +0900 Seungha Yang + + * ext/x264/gstx264enc.c: + x264enc: Port to color_{primaries,transfer,matrix}_to_iso + ... with more color value mapping + +2019-07-15 22:38:35 +0900 Seungha Yang + + * tests/check/elements/x264enc.c: + * tests/check/meson.build: + tests: x264enc: Enable test on Windows + ... with removal of pointless unistd.h dependency. + Note that full dependency listing is required to run unit test + executable binary on Windows uninstalled environment. + +2019-05-31 23:07:58 +0200 Niels De Graef + + * configure.ac: + * meson.build: + meson: Bump minimal GLib version to 2.44 + This means we can use some newer features and get rid of some + boilerplate code using the G_DECLARE_* macros. + As discussed on IRC, 2.44 is old enough by now to start depending on it. + +2019-05-29 23:00:48 +0200 Mathieu Duponchelle + + * ext/sidplay/gstsiddec.cc: + doc: remove xml from comments + +2019-05-25 14:19:54 +0200 Tim-Philipp Müller + + * gst/asfdemux/asfheaders.h: + asfdemux: remove some unused cruft in internal headers + +2019-05-16 09:15:52 -0400 Thibault Saunier + + * docs/gst_plugins_cache.json: + * docs/meson.build: + docs: Stop building the doc cache by default + And update the cache + Fixes https://gitlab.freedesktop.org/gstreamer/gst-docs/issues/36 + +2019-05-13 22:54:16 -0400 Thibault Saunier + + * docs/gst_plugins_cache.json: + docs: Update plugins documentation cache + +2018-10-22 11:47:37 +0200 Thibault Saunier + + * Makefile.am: + * configure.ac: + * docs/Makefile.am: + * docs/all_index.md: + * docs/gst_api_version.in: + * docs/gst_plugins_cache.json: + * docs/index.md: + * docs/meson.build: + * docs/plugins/.gitignore: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/gst-plugins-ugly-plugins.types: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * docs/sitemap.txt: + * ext/a52dec/meson.build: + * ext/amrnb/meson.build: + * ext/amrwbdec/meson.build: + * ext/cdio/meson.build: + * ext/dvdread/meson.build: + * ext/mpeg2dec/meson.build: + * ext/sidplay/meson.build: + * ext/x264/meson.build: + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/meson.build: + * gst/dvdlpcmdec/meson.build: + * gst/dvdsub/meson.build: + * gst/realmedia/meson.build: + * gst/xingmux/meson.build: + * meson.build: + * meson_options.txt: + docs: Port documentation to hotdoc + +2018-10-22 11:47:32 +0200 Thibault Saunier + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstrtspwms.c: + * gst/realmedia/gstrdtbuffer.h: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rtspreal.c: + * gst/xingmux/gstxingmux.c: + docs: Port all docstring to gtk-doc markdown + +2019-04-26 18:28:04 +0100 Tim-Philipp Müller + + * ext/sidplay/meson.build: + meson: sidplay: use library() instead of shared_module() + Like we do for other plugins, and also install a .pc file + if we build the plugin statically. + +2019-04-22 12:51:33 +0300 Sebastian Dröge + + * ext/dvdread/meson.build: + * meson.build: + meson: Always require the gmodule dependency + It's needed by the dvdread plugin but also by the x264 plugin in certain + circumstances. As it's part of GLib and always available, simply move it + as a hard dependency to the top-level meson.build. + +2019-04-19 10:28:17 +0100 Tim-Philipp Müller + + * README: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * meson.build: + Back to development + +=== release 1.16.0 === + +2019-04-19 00:24:40 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * README: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.16.0 + +2019-04-19 00:24:40 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2019-04-19 00:24:38 +0100 Tim-Philipp Müller + + * po/id.po: + * po/sv.po: + Update translations + +=== release 1.15.90 === + +2019-04-11 00:28:18 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.15.90 + +2019-04-11 00:28:18 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2019-03-27 21:59:45 +0530 Nirbheek Chauhan + + * ext/x264/meson.build: + meson: Add a subproject fallback for x264 + +2019-03-10 19:33:31 +0000 Piotr Drąg + + * po/LINGUAS: + Update LINGUAS + +2019-03-21 11:23:07 +0000 Tim-Philipp Müller + + * meson.build: + meson: add -Wno-unused also to C++ args when gst debug system is disabled + +2019-03-04 09:08:07 +0000 Tim-Philipp Müller + + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * meson.build: + Back to development + +2019-02-28 11:03:31 +0100 Mathieu Duponchelle + + * ext/x264/gstx264enc.c: + x264enc: inject CEA708 closed captions + +=== release 1.15.2 === + +2019-02-26 11:48:50 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.15.2 + +2019-02-26 11:48:50 +0000 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2019-02-26 11:48:47 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/fur.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/ta.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update translations + +2019-02-22 23:54:30 +0000 Tim-Philipp Müller + + * ext/sidplay/gstsiddec.cc: + sidplay: fix indentation + +2019-02-12 17:58:19 +0200 Sebastian Dröge + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: Work around GCC9 compiler warning + It's technically true but not for this specific type. + dvdreadsrc.c:394:65: error: taking address of packed member of ‘struct ’ may result in an unaligned pointer value [-Werror=address-of-packed-member] + 394 | gst_dvd_read_src_make_clut_change_event (src, src->cur_pgc->palette); + | ~~~~~~~~~~~~^~~~~~~~~ + +2019-01-30 19:50:30 +0900 Seungha Yang + + * meson.build: + meson: Add support orc fallback + Allow fallback to orc subproject if any. + +2019-01-25 14:38:05 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264: Only enable dynamic loading code for x264 < 253 + Otherwise we get some compiler warnings: + ../subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c:200:1: warning: ‘unload_x264’ defined but not used [-Wunused-function] + unload_x264 (GstX264EncVTable * vtable) + ^~~~~~~~~~~ + ../subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c:154:1: warning: ‘load_x264’ defined but not used [-Wunused-function] + load_x264 (const gchar * filename) + ^~~~~~~~~ + +2019-01-25 14:36:55 +0200 Sebastian Dröge + + * ext/x264/meson.build: + x264: Link to gmodule in the meson build if extra x264 libraries are provided + We would dynamically load additional x264 libraries then. + +2019-01-17 17:29:38 +0200 Helmut Grohne + + * m4/gst-sid.m4: + sid: Fix cross-compilation by using AC_TRY_LINK instead of AC_TRY_RUN + https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=917899 + +=== release 1.15.1 === + +2019-01-17 02:02:30 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.15.1 + +2019-01-17 02:02:30 +0000 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2019-01-17 02:02:22 +0000 Tim-Philipp Müller + + * po/af.po: + * po/ast.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/fur.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update translations + +2018-12-30 22:48:42 +0900 Seungha Yang + + * tests/check/generic/states.c: + * tests/check/meson.build: + tests: Enable test generic_states on Windows + ... and drop needless unistd.h dependency + +2018-12-18 22:48:42 +0900 Seungha Yang + + * meson.build: + * tests/check/meson.build: + meson: Use join_paths() instead '/' + +2018-12-07 23:39:01 +0900 Seungha Yang + + * meson.build: + * tests/check/meson.build: + * tests/meson.build: + tests: Enable unit test on Windows + Remove hard-coded ':' whitelist separator since it varies with OS + +2018-12-05 17:24:25 -0300 Thibault Saunier + + * common: + Automatic update of common submodule + From ed78bee to 59cb678 + +2018-11-24 19:28:19 +0900 Seungha Yang + + * meson.build: + meson: Specify encoding to UTF-8 when building with MSVC + Use build arguments consistent with core and -base. This can also + remove noisy "C4819" warning of non-us locale MSVC. + +2018-11-12 13:30:59 +0200 Jordan Petridis + + * .gitlab-ci.yml: + Add Gitlab CI configuration + This commit adds a .gitlab-ci.yml file, which uses a feature + to fetch the config from a centralized repository. The intent is + to have all the gstreamer modules use the same configuration. + The configuration is currently hosted at the gst-ci repository + under the gitlab/ci_template.yml path. + Part of https://gitlab.freedesktop.org/gstreamer/gstreamer-project/issues/29 + +2018-11-05 05:38:33 +0000 Matthew Waters + + * .gitmodules: + Update common submodule location + Remove the git directory + +2018-11-05 12:52:46 +0800 Haihao Xiang + + * .gitmodules: + * gst-plugins-ugly.doap: + Clone the code from gitlab + This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly/issues/22 + +2018-10-08 20:45:52 +0100 Tim-Philipp Müller + + * meson.build: + meson: use new 'python' module instead of deprecated + https://github.com/mesonbuild/meson/pull/4169 + +2018-09-22 17:33:35 +0100 Tim-Philipp Müller + + * tests/check/elements/x264enc.c: + tests: x264enc: fix leak in unit test + The static pad templates weren't static so their + contents were leaked. valgrind was not happy. + Also rename confusing define. + +2018-09-18 21:43:14 +0900 Seungha Yang + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Avoid format decision per frame + Avoid switch/case per frame for format decision and detect the format + only if where it could be changed. Note that, whenever encoder->input_state + is changed, gst_x264_enc_init_encoder() is called. + https://bugzilla.gnome.org/show_bug.cgi?id=797164 + +2018-09-19 12:00:32 +0100 Tim-Philipp Müller + + * meson.build: + * meson_options.txt: + meson: add glib-checks option to disable API guards and such + We want this enabled by default, also in releases, but people + may want to disable this for performance-critical workloads or + on embedded devices. + +2018-09-19 11:58:54 +0100 Tim-Philipp Müller + + * meson_options.txt: + meson: fix missing closing bracket in option descriptions + +2018-08-18 21:22:42 +0100 Tim-Philipp Müller + + * meson.build: + * meson_options.txt: + * tests/meson.build: + meson: add option to disable tests + +2018-08-18 21:20:20 +0100 Tim-Philipp Müller + + * meson.build: + meson: clean up some cruft + +2018-08-18 21:15:23 +0100 Tim-Philipp Müller + + * meson.build: + * meson_options.txt: + meson: add options to disable gobject cast checks and glib asserts + ... and define G_DISABLE_DEPRECATED for development versions, + like we do in autotools. + +2018-08-16 13:17:58 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Set bit depth for x264 ≥ 153 + https://bugzilla.gnome.org/show_bug.cgi?id=796975 + +2018-08-16 14:55:04 +0200 Jan Alexander Steffens (heftig) + + * ext/x264/gstx264enc.c: + x264enc: Remove superfluous x264_param_default + https://bugzilla.gnome.org/show_bug.cgi?id=796973 + +2018-07-27 19:29:01 +0530 Nirbheek Chauhan + + * ext/a52dec/meson.build: + * ext/amrnb/meson.build: + * ext/amrwbdec/meson.build: + * ext/cdio/meson.build: + * ext/dvdread/meson.build: + * ext/mpeg2dec/meson.build: + * ext/sidplay/meson.build: + * ext/x264/meson.build: + * gst/meson.build: + * meson.build: + * meson_options.txt: + Add feature options for all plugins + The only automagic dependency left is C++ availability detection. + https://bugzilla.gnome.org/show_bug.cgi?id=795107 + +2018-07-25 17:17:21 +0530 Nirbheek Chauhan + + * meson.build: + * meson_options.txt: + meson: Convert common options to feature options + The rest will be converted later, these are necessary for gst-build to + set options correctly. + https://bugzilla.gnome.org/show_bug.cgi?id=795107 + +2018-06-11 14:43:20 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Remove 0.10 code + This was used to "close" a segment. It's no longer needed anymore + in 1.x (it was essentially sending the same thing again) + +2018-05-11 09:21:09 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Only send flush event on seeking flushes + And not on all the time + +2018-05-21 11:54:50 +0100 Tim-Philipp Müller + + * meson.build: + * meson_options.txt: + meson: add 'nls' option to disable translations + And enable by default. Was implicitly disabled because + ENABLE_NLS was not defined. Also use .set_quoted(). + +2018-05-05 19:32:00 +0530 Nirbheek Chauhan + + * meson.build: + * meson_options.txt: + meson: Update option names to omit disable_ and with- prefixes + Also yield common options to the outer project (gst-build in our case) + so that they don't have to be set manually. + +2018-05-04 22:54:01 +1000 Jan Schmidt + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Take the highlight event from the structure. + Don't use GST_EVENT_TIMESTAMP to transfer any PTS + associated with a highlight event, instead store + it in the event structure directly, as + GstEvent::timestamp will disappear in GStreamer 2.0 + https://bugzilla.gnome.org/show_bug.cgi?id=761477 + +2018-04-24 14:06:20 -0400 Xavier Claessens + + * ext/a52dec/meson.build: + * ext/amrnb/meson.build: + * ext/amrwbdec/meson.build: + * ext/cdio/meson.build: + * ext/dvdread/meson.build: + * ext/mpeg2dec/meson.build: + * ext/x264/meson.build: + * gst/asfdemux/meson.build: + * gst/dvdlpcmdec/meson.build: + * gst/dvdsub/meson.build: + * gst/realmedia/meson.build: + * gst/xingmux/meson.build: + * meson.build: + Meson: Generate pc file for all plugins in ugly + https://bugzilla.gnome.org/show_bug.cgi?id=794568 + +2018-04-25 10:59:11 +0100 Tim-Philipp Müller + + * meson.build: + meson: use -Wl,-Bsymbolic-functions where supported + Just like the autotools build. + +2018-04-16 20:13:05 +0300 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Set the stream-format field of H264 streams + If we have codec_data it will be AVC, otherwise assume byte-stream. + +2018-04-16 10:53:12 +0100 Tim-Philipp Müller + + * README: + * common: + Automatic update of common submodule + From 3fa2c9e to ed78bee + +2018-03-20 09:26:15 +0000 Tim-Philipp Müller + + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * meson.build: + Back to development + +=== release 1.14.0 === + +2018-03-19 20:19:43 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.14.0 + +2018-03-19 20:19:43 +0000 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +=== release 1.13.91 === + +2018-03-13 19:17:58 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.13.91 + +2018-03-13 19:17:58 +0000 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2018-03-12 20:19:19 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + docs: plugins: minor addition to plugins list + +2018-03-08 10:12:16 +0100 Michael Tretter + + * configure.ac: + configure.ac: enable largefile support if possible + https://bugzilla.gnome.org/show_bug.cgi?id=793103 + +=== release 1.13.90 === + +2018-03-03 22:24:28 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.13.90 + +2018-03-03 22:24:28 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + Update docs + +2018-03-01 19:07:42 +0100 Mathieu Duponchelle + + * meson.build: + * tests/check/meson.build: + meson: enable more warnings + +2018-02-28 10:07:13 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: fix build with newer x264 with support for multiple bit depths + libx264 used to be built for one specific bit depth, and if we + wanted to support multiple bit depths we would have to dynamically + load the right .so from different paths. That has changed now, and + libx264 can include support for multiple depths in the same lib, + so we don't need to do the dlopen() dance any more. We'll keep + the vtable stuff around until we can drop support for older x264. + gstx264enc.c:2927:36: error: ‘x264_bit_depth’ undeclared + https://bugzilla.gnome.org/show_bug.cgi?id=792111 + +2018-02-27 15:42:32 +0100 Alicia Boya García + + * ext/x264/gstx264enc.c: + x264enc: Add format example for option-string + https://bugzilla.gnome.org/show_bug.cgi?id=793879 + +2018-02-21 19:47:36 +0000 Tim-Philipp Müller + + * meson.build: + meson: simplify GST_DISABLE_GST_DEBUG check and don't use add_global_* + add_global_arguments() can't be used in subprojects. It's + entirely possible that -ugly is a subproject but gstreamer + is picked up from an installed location, so we should + really use add_project_arguments() in both cases. + +2018-02-15 19:44:21 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * meson.build: + Back to development + +=== release 1.13.1 === + +2018-02-15 17:10:13 +0000 Tim-Philipp Müller + + * NEWS: + * configure.ac: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.13.1 + +2018-02-15 17:07:42 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-sid.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + docs: update plugin docs + +2018-02-15 14:52:29 +0000 Tim-Philipp Müller + + * po/id.po: + * po/it.po: + * po/nl.po: + * po/sv.po: + po: update translations + +2018-02-08 19:09:45 +0000 Tim-Philipp Müller + + * meson.build: + meson: make version numbers ints and fix int/string comparison + WARNING: Trying to compare values of different types (str, int). + The result of this is undefined and will become a hard error + in a future Meson release. + +2018-02-04 12:03:36 +0100 Tim-Philipp Müller + + * configure.ac: + autotools: use -fno-strict-aliasing where supported + https://bugzilla.gnome.org/show_bug.cgi?id=769183 + +2018-01-30 20:34:52 +0000 Tim-Philipp Müller + + * ext/sidplay/meson.build: + * meson.build: + meson: use -fno-strict-aliasing where supported + https://bugzilla.gnome.org/show_bug.cgi?id=769183 + +2018-01-03 16:02:08 +0100 Edward Hervey + + * ext/amrnb/amrnbdec.c: + amrnbdec: Don't use g_return_*_if_fail() on data parsing + Those functions can be disabled. Instead just use the (existing) + function. + CID #1427121 + +2018-01-03 16:02:08 +0100 Edward Hervey + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: Don't use g_return_*_if_fail() on data parsing + Those functions can be disabled. Instead just use the (existing) + function. + CID #1427093 + +2017-12-26 13:51:37 +0100 Tim-Philipp Müller + + * meson.build: + meson: skip translations if gettext is not available + +2017-12-14 14:49:17 +1100 Matthew Waters + + * common: + Automatic update of common submodule + From e8c7a71 to 3fa2c9e + +2017-12-07 15:52:58 +0900 Justin Kim + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: add 'insert-vui' property for users to choose + VUI(Video Usability Information) parameters should be set + according to the specification. However, some of the existing + hardware decoders refuse to decode in certain combinations of + the resolution and VUI parameters. To support the legacy + decoders, this patch provides 'insert-vui' to skip the settings. + https://bugzilla.gnome.org/show_bug.cgi?id=791331 + +2017-12-06 13:01:39 +0200 Sebastian Dröge + + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + cdio: Fix build with cdio >= 1.0 + LIBCDIO_VERSION_NUM was defined as e.g. 94 for 0.94 but is now defined + as 1 for 1.0. We had various checks for < 83, which of course succeeded + now although we are >= 0.83. + Fix this by checking for < 76 (0.76) too, as that is the minimum version + we currently support and everything < 76 is going to be >= 1.0. + https://bugzilla.gnome.org/show_bug.cgi?id=791301 + +2017-11-27 20:11:56 +1100 Matthew Waters + + * common: + Automatic update of common submodule + From 3f4aa96 to e8c7a71 + +2017-11-26 15:05:14 +0000 Tim-Philipp Müller + + * configure.ac: + configure: actually use -fvisibility if supported + Fix up for previous commit. + +2017-11-26 14:49:21 +0000 Tim-Philipp Müller + + * configure.ac: + autotools: stop controlling symbol visibility with -export-symbols-regex + Instead, use -fvisibility=hidden and explicit exports via GST_EXPORT. + This should result in consistent behaviour for the autotools and + Meson builds. + +2017-11-13 11:13:30 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix prerolling files with "empty" streams + This is a regression that was introduced by + commit 1803b3c18530cb0100d140c2b8e49a8dfe41f941 + " asfdemux: Add support for dvr-ms" + The problem is that some files/streams might contain stream definition + but there is no actual packets for those streams. + This was used to "define" streams with different bitrates for example. + The first_ts calculation resulted in never ever finding a valid first_ts + since some streams were empty, and therefore never "activating" itself. + Instead of that we first check if we are prerolled. And if we are we + unconditionally get the "first_ts" + The preroll check has been adapted to check whether streams of + each defined type (i.e. audio/video/sub) has been prerolled. This solves + the problem of having different streams of a particular type where only + one stream actually has data. + +2017-11-13 11:09:31 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Store the stream type in streams + The field was present but never set :) + +2017-09-26 10:11:24 +0530 Ponnam Srinivas + + * ext/a52dec/gsta52dec.c: + a52dec: Fix out buffer memory leak in error code path + https://bugzilla.gnome.org/show_bug.cgi?id=788119 + +2017-09-15 17:06:58 +0530 Deepak Srivastava + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix buffer memory leak in error code path + https://bugzilla.gnome.org/show_bug.cgi?id=787817 + +2017-09-07 13:27:26 +0530 Satya Prakash Gupta + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Unmap output video frame if copying to it fails + https://bugzilla.gnome.org/show_bug.cgi?id=787398 + +2017-08-31 11:33:14 +0530 Satya Prakash Gupta + + * gst/realmedia/asmrules.c: + realmedia: fix leak in asmrules error code path + https://bugzilla.gnome.org/show_bug.cgi?id=787056 + +2017-08-30 18:41:28 +0530 Satya Prakash Gupta + + * gst/realmedia/rtspreal.c: + realmedia: Fix Memory leak in error case + https://bugzilla.gnome.org/show_bug.cgi?id=787014 + +2017-08-26 13:02:26 +0100 Tim-Philipp Müller + + * tests/files/Makefile.am: + * tests/files/cbr_stream.mp3: + * tests/files/stream.mp2: + * tests/files/vbr_stream.mp3: + tests: remove files that were used by the mpg123 unit test + +2017-08-26 09:35:20 +0100 Tim-Philipp Müller + + * Makefile.am: + * REQUIREMENTS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-twolame.xml: + * ext/Makefile.am: + * ext/meson.build: + * ext/twolame/Makefile.am: + * ext/twolame/gsttwolamemp2enc.c: + * ext/twolame/gsttwolamemp2enc.h: + * ext/twolame/meson.build: + * po/POTFILES.in: + Remove twolame plugin, moved to -good + https://bugzilla.gnome.org/show_bug.cgi?id=774252 + +2017-08-26 08:51:01 +0100 Tim-Philipp Müller + + * Makefile.am: + * REQUIREMENTS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-lame.xml: + * ext/Makefile.am: + * ext/lame/Makefile.am: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + * ext/lame/meson.build: + * ext/lame/plugin.c: + * ext/meson.build: + * m4/Makefile.am: + * m4/as-liblame.m4: + * po/POTFILES.in: + * tests/check/Makefile.am: + * tests/check/gst-plugins-ugly.supp: + * tests/check/meson.build: + * tests/check/pipelines/.gitignore: + * tests/check/pipelines/lame.c: + Remove lame plugin, moved to -good + https://bugzilla.gnome.org/show_bug.cgi?id=774252 + +2017-08-20 14:31:02 +0100 Tim-Philipp Müller + + * Makefile.am: + * REQUIREMENTS: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-mpg123.xml: + * ext/Makefile.am: + * ext/meson.build: + * ext/mpg123/Makefile.am: + * ext/mpg123/gstmpg123audiodec.c: + * ext/mpg123/gstmpg123audiodec.h: + * ext/mpg123/meson.build: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/mpg123audiodec.c: + * tests/check/meson.build: + Remove mpg123 plugin, moved to -good + https://bugzilla.gnome.org/show_bug.cgi?id=774252 + +2017-08-17 12:23:43 +0100 Tim-Philipp Müller + + * README: + * common: + Automatic update of common submodule + From 48a5d85 to 3f4aa96 + +2017-08-10 15:48:27 +0100 Tim-Philipp Müller + + * ext/sidplay/meson.build: + sidplay: hide symbols in meson for this c++ plugin too + Keep things local, as this is the only c++ plugin + in ugly currently. + +2017-08-10 11:55:58 +0100 Tim-Philipp Müller + + * meson.build: + meson: don't export symbols by default + Only plugin entry points should be exported. + Currently plugins might export more symbols with + the meson build, as we don't have the exports + regexp there that we pass to libtool. + +2017-08-09 19:31:56 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: add FIXME note for future configuration cleanup + +2017-07-25 13:36:17 +0530 Satya Prakash Gupta + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: Fix string memory leak + https://bugzilla.gnome.org/show_bug.cgi?id=785388 + +2017-07-15 15:01:09 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: fix indentation + +2017-07-15 14:59:42 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: fix caps leak + Move creation of supported sink pads into class_init function + which is also the only place where they're used. Unref the + caps when no longer needed, the pad template will take its + own ref. + https://bugzilla.gnome.org/show_bug.cgi?id=784982 + +2017-07-15 14:57:49 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + mpg123audiodec: fix caps leak + The pad template takes its own ref, so we should unref the caps. + https://bugzilla.gnome.org/show_bug.cgi?id=784982 + +2017-07-15 12:49:19 +0100 Tim-Philipp Müller + + * po/meson.build: + meson: po: use glib preset and read language list from LINGUAS + Supported since meson 0.37, so we can use it now. + +2017-07-11 14:21:41 +0300 Vivia Nikolaidou + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpmdec: Fix overrun from coverity + CID #1414801 + +2017-07-07 11:58:36 +0100 Tim-Philipp Müller + + * meson.build: + meson: find python3 via python3 module + https://bugzilla.gnome.org/show_bug.cgi?id=783198 + +2017-07-05 18:58:35 +0300 Vivia Nikolaidou + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: Added support for Blu-Ray audio + https://bugzilla.gnome.org/show_bug.cgi?id=784552 + +2017-06-27 11:48:08 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: More index handling + In the same vein as the previous commit, the end of the file might have been + cut and therefore contains bogus data. + If the object is too short, consider it as garbage and return a non-fatal + flow. + Regression introduced in 97294eb8bbed1b9dad7d3f2c52dd69eb1812cc06 + +2017-06-27 10:25:42 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux; Don't assume index is present at end of file + Some files have garbage at the end of the file, don't error out if we don't + find the index there. + Reverts back to previous behaviour (where corrupted/missing indexex were + not a fatal error). + Regression introduced in 97294eb8bbed1b9dad7d3f2c52dd69eb1812cc06 + +2017-06-26 09:49:22 +0100 Tim-Philipp Müller + + * meson.build: + meson: fix with-package-name option + https://bugzilla.gnome.org/show_bug.cgi?id=784082 + +2017-06-14 21:08:31 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: adjust segment start to a keyframe ts only for a KEYUNIT seek + ... which is how it has always been until changed coincidentally in commit + 9ee60482b265481d0e3b397044f560eb736e5429 which then prompted commit + dba14178ce6115b406ef86e356b1201463af5e2a to consider ACCURATE as well + to compensate for that in a lateral way + +2017-06-14 20:56:16 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: relax bframes upper limit count to maximum encoder supported + +2017-06-23 23:44:18 +0100 Tim-Philipp Müller + + * ext/sidplay/meson.build: + meson: don't error out if sidplay library is not found + +2017-06-23 18:33:24 +0100 Tim-Philipp Müller + + * ext/meson.build: + * ext/sidplay/meson.build: + meson: build sid plugin + https://bugzilla.gnome.org/show_bug.cgi?id=784135 + +2017-06-21 21:23:29 +0200 Víctor Manuel Jáquez Leal + + * ext/x264/gstx264enc.c: + x264: fix memory leak + When the allowed caps are the same of template caps the allowed + caps are not unrefed, leaking memory. + https://bugzilla.gnome.org/show_bug.cgi?id=784060 + +2017-06-07 12:08:43 -0400 Thibault Saunier + + * tests/check/meson.build: + meson: Do not use path separator in test names + Avoiding warnings like: + WARNING: Target "elements/audioamplify" has a path separator in its name. + +2017-06-06 21:48:19 -0700 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix checking for header objects + The if 'and' condition was mixed up with the last parameter of the + function and would lead to wrong results + +2017-05-21 17:49:59 +0100 Tim-Philipp Müller + + * Makefile.am: + * config.h.meson: + * meson.build: + meson: don't need config.h.meson any longer + +2017-05-20 14:58:37 +0100 Tim-Philipp Müller + + * meson.build: + * meson_options.txt: + meson: add options to set package name and origin + https://bugzilla.gnome.org/show_bug.cgi?id=782172 + +2017-05-19 20:05:02 +0200 Jan Schmidt + + * tests/check/meson.build: + Add gstvideo_dep for meson mpeg2dec test build + +2017-05-19 18:59:17 +0200 Jan Schmidt + + * tests/check/Makefile.am: + * tests/check/elements/mpeg2dec.c: + mpeg2dec test: Fix expected output caps + In the absence of explicit info, video decoders + now output mono multiview caps by default, so make + the expected caps match that + +2017-05-16 14:07:56 -0400 Nicolas Dufresne + + * config.h.meson: + * configure.ac: + * ext/a52dec/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/lame/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * ext/mpg123/Makefile.am: + * ext/sidplay/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/realmedia/Makefile.am: + * gst/xingmux/Makefile.am: + Remove plugin specific static build option + Static and dynamic plugins now have the same interface. The standard + --enable-static/--enable-shared toggle are sufficient. + +2017-05-09 09:45:27 -0400 Nicolas Dufresne + + * ext/sidplay/gstsiddec.cc: + sid: Make plugin name match plugin file name + +2017-05-04 18:59:14 +0300 Sebastian Dröge + + * configure.ac: + * meson.build: + Back to development + +=== release 1.12.0 === + +2017-05-04 15:39:25 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.12.0 + +2017-05-04 15:12:50 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/fur.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2017-05-04 13:47:56 +0300 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +=== release 1.11.91 === + +2017-04-27 17:33:23 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.11.91 + +2017-04-27 16:08:13 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/fur.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2017-04-27 15:29:48 +0300 Sebastian Dröge + + * po/LINGUAS: + * po/fur.po: + * po/id.po: + * po/sv.po: + po: Update translations + +2017-04-27 12:42:34 +0530 Nirbheek Chauhan + + * ext/x264/gstx264enc.h: + x264: Use __declspec(dllimport) with MinGW too + x264.h says this isn't needed with MinGW, but it looks like it is. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=779249 + +2017-04-24 20:28:15 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 60aeef6 to 48a5d85 + +2017-04-10 23:49:25 +0100 Tim-Philipp Müller + + * autogen.sh: + * common: + Automatic update of common submodule + From 39ac2f5 to 60aeef6 + +=== release 1.11.90 === + +2017-04-07 16:34:22 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * meson.build: + Release 1.11.90 + +2017-04-07 15:33:31 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2017-04-07 15:07:50 +0300 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2017-03-28 14:18:38 -0300 Thibault Saunier + + * tests/check/meson.build: + meson: test: Fix environment object usage + And use get_pkgconfig_variable instead of calling pkg-config ourself + +2017-03-20 17:06:16 +0000 Tim-Philipp Müller + + * REQUIREMENTS: + REQUIREMENTS: update for mad mp3 decoder removal + https://bugzilla.gnome.org/show_bug.cgi?id=776140 + +2017-03-12 11:57:23 -0400 Nicolas Dufresne + + * Makefile.am: + Add libgstrmdemux.so to cruft list + This was renamed to libgstrealmedia.so, this fixes helps fixing + uninstalled setup. + https://bugzilla.gnome.org/show_bug.cgi?id=779344 + +2017-03-04 11:09:33 -0500 Nicolas Dufresne + + * docs/plugins/inspect/plugin-realmedia.xml: + * gst/realmedia/Makefile.am: + * gst/realmedia/meson.build: + Rename plugin filenames to match plugin names + libgstrmdemux.so becomes libgstrealmedia.so + https://bugzilla.gnome.org/show_bug.cgi?id=779344 + +2017-03-01 23:00:55 +1100 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix latency calculation + The latency calculation was missing a scaling by GST_SECOND, + so it would always report a tiny latency. Fix that. + Spotted by Guillaume Desmottes. + +2017-02-27 20:55:34 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix compilation with gcc 7 + gstasfdemux.c: In function 'gst_asf_demux_parse_stream_object': + gstasfdemux.c:3001:39: error: '<<' in boolean context, did you mean '<' ? [-Werror=int-in-bool-context] + is_encrypted = ! !((flags & 0x8000) << 15); + ~~~~~~~~~~~~~~~~~~^~~~~~ + https://bugzilla.gnome.org/show_bug.cgi?id=779329 + +2017-02-25 21:48:46 -0300 Edgard Lima + + * ext/amrwbdec/amrwb.c: + * ext/amrwbdec/amrwbdec.h: + Update Edgard Lima's email + https://bugzilla.gnome.org/show_bug.cgi?id=779230 + +2017-02-24 15:59:47 +0200 Sebastian Dröge + + * meson.build: + meson: Update version + +2017-02-24 15:37:43 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.11.2 === + +2017-02-24 15:07:54 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + Release 1.11.2 + +2017-02-24 12:57:00 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2017-02-24 12:45:43 +0200 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2017-02-14 19:56:13 +0000 Tim-Philipp Müller + + * Makefile.am: + meson: dist meson build files + Ship meson build files in tarballs, so people who use tarballs + in their builds can start playing with meson already. + +2017-02-01 03:08:10 +0530 Nirbheek Chauhan + + * ext/x264/gstx264enc.c: + x264: Initialize function vtable in plugin_init() + These values are defined in the x264.h header and are not const on + Windows due to the way DLLs work. See: + https://msdn.microsoft.com/en-us/library/619w14ds.aspx + https://msdn.microsoft.com/en-us/library/zw3za17w.aspx + https://bugzilla.gnome.org/show_bug.cgi?id=777903 + +2017-01-31 13:50:21 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Check that we have enough data available before parsing bool/uint extended content descriptors + https://bugzilla.gnome.org/show_bug.cgi?id=777955 + +2017-01-30 15:39:59 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Reset number of languages to 0 when freeing the array because of errors + Otherwise we will happily index into the array at NULL if the requested + index is smaller than the number of languages that were previously + allocated. + https://bugzilla.gnome.org/show_bug.cgi?id=777937 + +2017-01-24 19:24:10 -0300 Thibault Saunier + + * tests/check/meson.build: + meson: Properly use ':' for defining keywords + +2017-01-13 12:39:09 +0000 Tim-Philipp Müller + + * meson.build: + meson: bump version + +2017-01-12 16:32:52 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.11.1 === + +2017-01-12 16:10:25 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + Release 1.11.1 + +2017-01-12 14:45:56 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2017-01-12 14:37:02 +0200 Sebastian Dröge + + * po/hr.po: + * po/id.po: + * po/sv.po: + po: Update translations + +2016-12-16 16:52:00 -0300 Thibault Saunier + + * ext/amrnb/meson.build: + * ext/x264/meson.build: + * meson.build: + meson: Install presets files + +2015-06-26 20:22:47 +0200 Mathieu Duponchelle + + * ext/x264/GstX264Enc.prs: + x264enc: Add a youtube preset. + Based on https://support.google.com/youtube/answer/1722171 + https://bugzilla.gnome.org/show_bug.cgi?id=751560 + +2016-12-28 10:42:15 +0000 Tim-Philipp Müller + + * config.h.meson: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-mad.xml: + * ext/Makefile.am: + * ext/mad/Makefile.am: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + * ext/mad/meson.build: + * ext/meson.build: + mad: remove plugin + We have better replacements such as the mpg123 plugin. + The main reason to keep around mad was for 'freeform' + mp3 support, but mpg123 can handle those too nowadays. + Also, mad is GPL and has been unmaintained for years. + https://bugzilla.gnome.org/show_bug.cgi?id=776140 + +2016-12-16 19:07:51 +0000 Tim-Philipp Müller + + * Makefile.am: + * configure.ac: + * win32/MANIFEST: + * win32/common/.gitignore: + * win32/common/config.h: + win32: remove platform-specific copies of generated headers + Unused and no longer needed. + +2016-12-14 10:24:26 +0000 Tim-Philipp Müller + + * .gitignore: + * Makefile.am: + * configure.ac: + * gst-plugins-ugly.spec.in: + Remove generated .spec file + Likely extremely bitrotten, and we should not ship this anyway. + +2016-12-09 17:45:34 -0300 Thibault Saunier + + * meson.build: + meson: Support building without Gst debug + +2016-12-03 08:19:44 +0100 Edward Hervey + + * README: + * common: + Automatic update of common submodule + From f980fd9 to 39ac2f5 + +2016-12-02 14:06:21 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix memory leak of payload extensions for unusable/unsupported streams + https://bugzilla.gnome.org/show_bug.cgi?id=775515 + +2016-11-30 18:11:30 +0200 Vivia Nikolaidou + + * ext/x264/gstx264enc.c: + x264enc: Add information for mixed mode + https://bugzilla.gnome.org/show_bug.cgi?id=775411 + +2016-11-30 17:30:33 +0200 Vivia Nikolaidou + + * ext/x264/gstx264enc.c: + x264enc: Correctly pass interlacing/TFF information + Give the interlacing information correctly to the encoder. Also parse + TFF/BFF information from the caps and pass it too. + https://bugzilla.gnome.org/show_bug.cgi?id=775411 + +2016-11-28 15:14:18 +0200 Vivia Nikolaidou + + * ext/x264/gstx264enc.c: + x264enc: Auto-detect interlace mode from caps + If the caps are interlaced, interlacing is always enabled on the + encoder. If the interlace-mode field is missing or if it's progressive, + the encoder uses the "interlaced" property. + https://bugzilla.gnome.org/show_bug.cgi?id=775228 + +2016-11-26 11:20:51 +0000 Tim-Philipp Müller + + * .gitmodules: + common: use https protocol for common submodule + https://bugzilla.gnome.org/show_bug.cgi?id=775110 + +2016-11-25 23:51:00 +0200 Sebastian Dröge + + * gst/realmedia/realhash.c: + real: Fix compiler warnings with latest clang + realhash.c:295:11: error: implicit conversion from 'int' to 'char' changes value from 128 to -128 [-Werror,-Wconstant-conversion] + *buf1 = 128; + ~ ^~~ + https://bugzilla.gnome.org/show_bug.cgi?id=775112 + +2016-11-25 12:41:03 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Allow 64bit sizes for DATA object + we *can* have files greater than 4GB, any other object should be + smaller than that + +2016-11-25 10:07:35 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Add sanity check for asf_stream_audio + We should have enough bytes for the specified codec_data + https://bugzilla.gnome.org/show_bug.cgi?id=775070 + +2016-11-25 09:45:04 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Add sanity checks when reading asf_stream_video_format + It should report a size of at least 40 bytes + Also check for the size of the remaining data (i.e. codec_data) + https://bugzilla.gnome.org/show_bug.cgi?id=775070 + +2016-11-25 09:44:05 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Add check for invalid/corrupt asf object + An asf object can't realistically be bigger than 2**32 bytes. + If it reports a size bigger than that, consider it corrupt and properly + propagate the error back. + https://bugzilla.gnome.org/show_bug.cgi?id=775070 + +2016-11-22 17:14:44 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Handle EOS in push-mode on corrupted files + It is possible no streams were activated when receiving EOS, if so + handled it as if we hadn't seen the header + https://bugzilla.gnome.org/show_bug.cgi?id=774846 + +2016-11-22 16:56:04 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: FILE headers are mandatory in the header + As per the specification, also avoids ending up trying to play a + file with plenty of un-initialized values. + https://bugzilla.gnome.org/show_bug.cgi?id=774846 + +2016-11-22 16:54:26 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Handle incomplete header in pull mode + pulling headers is meant to complete as a whole. If we don't have + enough data, it's an error. + Avoids pipeline hangs on corrupted files + https://bugzilla.gnome.org/show_bug.cgi?id=774846 + +2016-11-22 16:22:49 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Handle issues with "empty" files + In some corrupted files, we could end up with no actual streams + being exposed. + In those cases, make sure we properly propagate the failure all + the way to the loop function. This avoids ending up in cases where + we are neither EOS'd nor ERROR'd out from a pipeline point of view. + https://bugzilla.gnome.org/show_bug.cgi?id=774846 + +2016-11-20 20:54:25 +0100 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: dvd-spu-clut-change is a sticky custom event + +2016-11-17 17:20:03 -0800 Scott D Phillips + + * meson.build: + meson: Add ignored warnings for MSVC + https://bugzilla.gnome.org/show_bug.cgi?id=774656 + +2016-11-11 14:15:17 +0200 Sebastian Dröge + + * configure.ac: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + * ext/x264/meson.build: + * meson_options.txt: + x264enc: Add configure parameter to specify additional x264 libraries with e.g. different depth configuration + x264 has to be compiled specifically for a target bit depth. + Distributions currently ship various libraries in their packages, with + different bit depths. + This change now allows to provide them all at configure time and have + the x264enc element dynamically switch between them based on the bit + depth of the input format. + https://bugzilla.gnome.org/show_bug.cgi?id=763297 + +2016-11-01 18:09:25 +0000 Tim-Philipp Müller + + * meson.build: + meson: update version + +=== release 1.11.0 === + +2016-11-01 18:53:15 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.10.0 === + +2016-11-01 18:05:31 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.10.0 + +2016-11-01 17:54:16 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-11-01 17:43:01 +0200 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2016-10-25 08:54:52 -0700 Scott D Phillips + + * meson.build: + * tests/meson.build: + meson: Don't depend on gstreamer-check-1.0 on windows + https://bugzilla.gnome.org/show_bug.cgi?id=773114 + +2016-10-25 10:51:08 +0530 Nirbheek Chauhan + + * meson.build: + * tests/check/meson.build: + * tests/meson.build: + Revert "meson: move gstreamer-check-1.0 dependency to tests/check" + This reverts commit 0555c09607e548b6c45d029ab31dbb3042195ae3. + Does not actually work. See: + https://bugzilla.gnome.org/show_bug.cgi?id=773114#c31 + +2016-10-24 00:35:23 +0100 Tim-Philipp Müller + + * tests/check/meson.build: + meson: fix build outside of gst-all + +2016-10-21 00:47:14 -0700 Scott D Phillips + + * meson.build: + * tests/check/meson.build: + * tests/meson.build: + meson: move gstreamer-check-1.0 dependency to tests/check + https://bugzilla.gnome.org/show_bug.cgi?id=773114 + +2016-10-15 22:20:05 +0530 Nirbheek Chauhan + + * meson.build: + meson: Don't set c_std to gnu99 + Use the default for each compiler on every platform instead. This + improves our compatibility with compilers that don't have gnu99 as + a c_std. + +2016-10-04 18:06:09 -0300 Thibault Saunier + + * meson.build: + * tests/check/getpluginsdir: + * tests/check/meson.build: + meson: Make use of new environment object and set plugin path to builddir + Workaround source_root being the root directory of all projects + in the subproject case and remove now unneeded getpluginsdir + Bump meson requirement to 0.35 + +2016-09-30 11:35:40 -0300 Thibault Saunier + + * hooks/pre-commit.hook: + * meson.build: + * tests/check/getpluginsdir: + meson: Setup pre commit hook and fix getpluginsdir for standalone case + +2016-09-30 11:41:28 +0100 Tim-Philipp Müller + + * meson.build: + meson: update version + +=== release 1.9.90 === + +2016-09-30 13:03:26 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.9.90 + +2016-09-30 12:23:17 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-09-30 11:44:22 +0300 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2016-09-29 12:39:34 +0300 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Set colorimetry and chroma-site information + https://bugzilla.gnome.org/show_bug.cgi?id=772159 + +2016-09-24 09:08:00 +0100 Tim-Philipp Müller + + * meson.build: + * po/meson.build: + meson: hook up translations + +2016-09-24 08:59:55 +0100 Tim-Philipp Müller + + * meson.build: + * tests/check/getpluginsdir: + * tests/check/meson.build: + * tests/meson.build: + meson: hook up unit tests + +2016-09-14 11:30:58 +0200 Sebastian Dröge + + * configure.ac: + configure: Depend on gstreamer 1.9.2.1 + +2016-09-10 20:51:36 +1000 Jan Schmidt + + * autogen.sh: + * common: + Automatic update of common submodule + From b18d820 to f980fd9 + +2016-09-10 09:54:15 +1000 Jan Schmidt + + * autogen.sh: + * common: + Automatic update of common submodule + From f49c55e to b18d820 + +2016-09-05 12:22:56 -0300 Thibault Saunier + + * meson.build: + meson: Bump version to 1.9.2 + +2016-09-01 12:28:57 +0300 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.9.2 === + +2016-09-01 12:28:45 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.9.2 + +2016-09-01 11:24:13 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + po: Update translations + +2016-09-01 10:57:46 +0300 Sebastian Dröge + + * ext/sidplay/gstsiddec.cc: + siddec: Fix compilation with debugging disabled + gstsiddec.o + gstsiddec.cc: In function ‘void play_loop(GstPad*)’: + gstsiddec.cc:446:18: error: unused variable ‘reason’ [-Werror=unused-variable] + const gchar *reason = gst_flow_get_name (ret); + ^ + +2016-08-19 11:11:14 -0700 Thibault Saunier + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rmdemux.c: + Use the new API to post flow ERROR messages on the bus + https://bugzilla.gnome.org/show_bug.cgi?id=770158 + +2016-08-24 09:45:05 -0300 Thibault Saunier + + * gst/asfdemux/meson.build: + meson: Link asfdemux against the gstsdp library + +2016-08-23 15:29:10 -0300 Thibault Saunier + + * meson.build: + meson: Add support for fallback subprojects + +2016-08-12 21:25:34 +0530 Nirbheek Chauhan + + * .gitignore: + * config.h.meson: + * ext/a52dec/meson.build: + * ext/amrnb/meson.build: + * ext/amrwbdec/meson.build: + * ext/cdio/meson.build: + * ext/dvdread/meson.build: + * ext/lame/meson.build: + * ext/mad/meson.build: + * ext/meson.build: + * ext/mpeg2dec/meson.build: + * ext/mpg123/meson.build: + * ext/twolame/meson.build: + * ext/x264/meson.build: + * gst/asfdemux/meson.build: + * gst/dvdlpcmdec/meson.build: + * gst/dvdsub/meson.build: + * gst/meson.build: + * gst/realmedia/meson.build: + * gst/xingmux/meson.build: + * meson.build: + Add support for Meson as alternative/parallel build system + https://github.com/mesonbuild/meson + With contributions from: + Tim-Philipp Müller + Jussi Pakkanen (original port) + Highlights of the features provided are: + * Faster builds on Linux (~40-50% faster) + * The ability to build with MSVC on Windows + * Generate Visual Studio project files + * Generate XCode project files + * Much faster builds on Windows (on-par with Linux) + * Seriously fast configure and building on embedded + ... and many more. For more details see: + http://blog.nirbheek.in/2016/05/gstreamer-and-meson-new-hope.html + http://blog.nirbheek.in/2016/07/building-and-developing-gstreamer-using.html + Building with Meson should work on both Linux and Windows, but may + need a few more tweaks on other operating systems. + +2016-08-12 21:41:39 +0530 Nirbheek Chauhan + + * ext/a52dec/gsta52dec.c: + * ext/dvdread/dvdreadsrc.c: + * ext/x264/gstx264enc.h: + * gst/realmedia/realhash.c: + * gst/realmedia/rtspreal.c: + plugins: Use instead of _stdint.h + _stdint.h is generated by Autotools and we don't really need it. All + supported platforms now ship with stdint.h. The only stickler was MSVC, + and since Visual Studio 2015 it also ships stdint.h now. + +2016-08-19 13:01:39 +0100 Tim-Philipp Müller + + * ext/mpeg2dec/perftest.c: + mpeg2dec: remove file no longer used or needed + +2016-08-08 09:58:20 +0100 Tim-Philipp Müller + + * gst/dvdlpcmdec/Makefile.am: + dvdlpcmdec: add libgstbase CFLAGS as well + For consistency. + https://bugzilla.gnome.org/show_bug.cgi?id=769610 + +2016-08-07 00:10:24 +0000 xlazom00 + + * gst/dvdlpcmdec/Makefile.am: + dvdlpcmdec: link libgstbase-1.0 + https://bugzilla.gnome.org/show_bug.cgi?id=769610 + +2016-08-02 13:38:25 +0200 Carlos Rafael Giani + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Add byte rate based bitrate tag in case there are no audio props + https://bugzilla.gnome.org/show_bug.cgi?id=769418 + +2016-04-28 16:42:43 +0200 Michael Olbrich + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: add support for another format + The format specification can be found here: + http://www.dvdforum.org/images/Guideline1394V10R0_20020911.pdf + Note: This format is also used for Wifi-Display. + https://bugzilla.gnome.org/show_bug.cgi?id=765807 + +2016-04-28 16:32:53 +0200 Michael Olbrich + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: rewrite to use GstAudioDecoder + https://bugzilla.gnome.org/show_bug.cgi?id=765807 + +2016-07-24 10:00:48 +0200 Josep Torra + + * ext/sidplay/gstsiddec.cc: + sidplay: fix compiler warnings when building with -O3 + Avoid compiler warnings "‘foo’ may be used uninitialized in this + function" when building with -O3 by checking the return bool value + of format conversion function. + https://bugzilla.gnome.org/show_bug.cgi?id=769116 + +2016-07-11 21:14:06 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From f363b32 to f49c55e + +2016-07-06 13:51:09 +0300 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.9.1 === + +2016-07-06 13:15:28 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.9.1 + +2016-07-06 11:54:01 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-07-06 10:19:44 +0300 Sebastian Dröge + + * po/hr.po: + po: Update translations + +2016-06-21 11:46:53 -0400 Nicolas Dufresne + + * common: + Automatic update of common submodule + From ac2f647 to f363b32 + +2015-05-12 11:08:55 +0300 Vootele Vesterblom + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix seeking back after EOS has been reached in push mode + Fix seeking when demuxer is in INDEX state. This happens when we + reached the end of the stream. It should still be possible to do + a flushing seek and seek back to any other position though. Instead + the demuxer would just go straight to EOS again instead of going + back to processing packets again from the new position. + https://bugzilla.gnome.org/show_bug.cgi?id=749066 + +2016-05-17 16:00:29 +0300 Guillaume Desmottes + + * gst/realmedia/rdtmanager.c: + rdtmanager: fix clock leak + The clock returned by gst_system_clock_obtain() was never unreffed. + https://bugzilla.gnome.org/show_bug.cgi?id=766565 + +2016-05-15 13:33:30 +0300 Sebastian Dröge + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + docs: Update for git master + +2016-04-16 09:15:43 +0100 Tim-Philipp Müller + + * ext/amrnb/amrnbdec.c: + * ext/mad/gstmad.c: + amrnbec, mad: fix two more parse function declarations + +2016-04-15 20:46:37 +0100 Tim-Philipp Müller + + * ext/a52dec/gsta52dec.c: + * ext/amrwbdec/amrwbdec.c: + a52dec, amrwbec: fix parse function declaration mismatch + Fixes MSVC compiler warning: + amrwbdec.c(99): warning C4133: '=': incompatible types + - from 'gboolean (__cdecl *)(GstAudioDecoder *,GstAdapter *,gint *,gint *)' to + 'GstFlowReturn (__cdecl *)(GstAudioDecoder *,GstAdapter *,gint *,gint *)' + gsta52dec.c(156): warning C4133: '=': incompatible types + - from 'gboolean (__cdecl *)(GstAudioDecoder *,GstAdapter *,gint *,gint *)' to + 'GstFlowReturn (__cdecl *)(GstAudioDecoder *,GstAdapter *,gint *,gint *)' + +2016-04-15 19:55:03 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.h: + mpg123: fix build with msvc + Fix syntax errors when compiling against cerbero-provided libmpg123 + headers. We do the same as the libmpg123 internal visual studio + build here. + mpg123.h(1378): error C2143: syntax error: missing ')' before '(' + mpg123.h(1378): error C2081: 'ssize_t': name in formal parameter list illegal + mpg123.h(1378): error C2143: syntax error: missing ')' before '*' + mpg123.h(1378): error C2091: function returns function + mpg123.h(1378): error C2143: syntax error: missing '{' before '*' + mpg123.h(1378): error C2059: syntax error: ')' + mpg123.h(1379): error C2143: syntax error: missing ')' before '*' + mpg123.h(1379): error C2365: 'off_t': redefinition; previous definition was 'typedef' + ... + +2016-04-15 18:37:42 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: bump libmpeg2 requirement to 0.5.1 and fix msvc build + libmpeg2 0.5.1 was released in mid-2008, let's bump the requirement + and get rid of version-dependent code paths. There's still + avdec_mpeg2video for those who are stuck on ancient distros which + we don't target any more. + Also fixes build with MSVC, which doesn't like #if #else #endif + inside macro arguments (like the GST_DEBUG_OBJECT in line 941). + +2016-04-14 10:02:50 +0100 Julien Isorce + + * README: + * common: + Automatic update of common submodule + From 6f2d209 to ac2f647 + +2016-03-04 16:14:44 +0900 Vineeth TM + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolamemp2enc.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + * gst/xingmux/gstxingmux.c: + ugly: use new gst_element_class_add_static_pad_template() + https://bugzilla.gnome.org/show_bug.cgi?id=763082 + +2016-03-24 13:33:22 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.8.0 === + +2016-03-24 12:43:04 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.8.0 + +2016-03-24 12:18:09 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +=== release 1.7.91 === + +2016-03-15 12:21:07 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.7.91 + +2016-03-15 12:03:34 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-03-08 12:26:01 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Don't modify segment values on accurate seeks + When dealing with accurate seeks, we want to return exactly the segment + that was requested by the seek event, and not adjust the values. + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +=== release 1.7.90 === + +2016-03-01 18:42:01 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.7.90 + +2016-03-01 17:18:01 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-03-01 16:54:07 +0200 Sebastian Dröge + + * po/bg.po: + po: Update translations + +2016-02-27 20:17:31 +0100 Jens Georg + + * ext/dvdread/dvdreadsrc.c: + dvdread: Fix seek starting at 0 for title != 1 + Otherwise the playback would start at title 0 + https://bugzilla.gnome.org/show_bug.cgi?id=762787 + +2016-02-26 12:41:18 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From b64f03f to 6f2d209 + +2016-02-22 22:08:12 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix adding bitrate to stream tags + https://bugzilla.gnome.org/show_bug.cgi?id=699586 + +2016-02-21 10:11:12 +0000 Tim-Philipp Müller + + * gst/asfdemux/asf.vcproj: + * gst/realmedia/rmdemux.vcproj: + * win32/MANIFEST: + * win32/gst.sln: + * win32/vs6/gst_plugins_ugly.dsw: + * win32/vs6/libgstasfdemux.dsp: + * win32/vs6/libgstdvdlpcmdec.dsp: + * win32/vs6/libgstdvdsub.dsp: + * win32/vs6/libgstlame.dsp: + * win32/vs6/libgstmad.dsp: + * win32/vs6/libgstrealmedia.dsp: + * win32/vs6/libgstsynaesthesia.dsp: + win32: remove outdated build cruft + This hasn't been touched for generations, doesn't work, + and is just causing confusion. We also don't want to + maintain these files manually. + +2016-02-20 11:55:37 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: don't use exported but undeclared core debug category symbols + It's not right and won't work on Windows with MSVC. + +2016-02-19 12:38:34 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.7.2 === + +2016-02-19 11:58:13 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.7.2 + +2016-02-19 11:21:03 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2016-02-19 10:32:06 +0200 Sebastian Dröge + + * po/fr.po: + * po/pt_BR.po: + po: Update translations + +2016-02-18 00:25:56 +0200 Sebastian Dröge + + * ext/sidplay/gstsiddec.cc: + sidplay: Fix compiler warning about C++11 compatibility + gstsiddec.cc:78:17: error: invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix] + #define FORMATS "{ "GST_AUDIO_NE(S16)","GST_AUDIO_NE(U16)", S8, U8 }" + ^ + gstsiddec.cc:78:38: error: invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix] + #define FORMATS "{ "GST_AUDIO_NE(S16)","GST_AUDIO_NE(U16)", S8, U8 }" + ^ + +2016-02-16 14:46:11 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpg123.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + docs: update inspection to git and fix mpg123 inspect location + +2016-02-16 12:23:33 +0000 Tim-Philipp Müller + + * tests/files/Makefile.am: + * tests/files/stream.mp2: + tests: fix distcheck + +2016-02-16 10:38:18 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/xml/plugin-mpg123.xml: + * ext/Makefile.am: + * gst-plugins-ugly.spec.in: + * tests/check/Makefile.am: + mpg123: move from -bad to -ugly + Hook up to build system, add to docs + +2016-02-16 10:55:01 +0000 Tim-Philipp Müller + + * configure.ac: + * tests/Makefile.am: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/files/Makefile.am: + * tests/files/cbr_stream.mp3: + * tests/files/vbr_stream.mp3: + tests: add test data for mpg123 plugin + +2016-02-16 10:41:07 +0000 Tim-Philipp Müller + + Merge branch 'plugin-move-mpg123' + Move mpg123 plugin from -bad to -ugly. + https://bugzilla.gnome.org/show_bug.cgi?id=719849 + +2015-12-14 11:09:46 +0900 Vineeth TM + + * ext/mpg123/gstmpg123audiodec.c: + plugins-bad: Fix example pipelines + rename gst-launch --> gst-launch-1.0 + replace old elements with new elements(ffmpegcolorspace -> videoconvert, ffenc_** -> avenc_**) + fix caps in examples + https://bugzilla.gnome.org/show_bug.cgi?id=759432 + +2015-08-17 11:50:28 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: still reset pending audio info on hard flush + Follow-up to previous commit. + https://bugzilla.gnome.org/show_bug.cgi?id=752431 + +2015-07-15 10:44:02 -0600 Jason Litzinger + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: fix handling of sample rate change during playback + If the sample rate of the media changes, the resulting flush will + clear the has_next_audioinfo flag, and the caps won't be sent + downstream. + https://bugzilla.gnome.org/show_bug.cgi?id=752431 + +2015-08-15 12:58:40 -0300 Thiago Santos + + * ext/mpg123/gstmpg123audiodec.c: + audiodecoders: use default pad accept-caps handling + Avoids useless check of downstream caps when handling an + accept-caps query + Elements: dtsdec, faad, gsmdec, mpg123audiodec, opusdec, + sbcdec, adpcmdec, sirendec + +2015-04-26 18:04:16 +0100 Tim-Philipp Müller + + * ext/mpg123/Makefile.am: + Remove obsolete Android build cruft + This is not needed any longer. + +2015-01-11 01:08:08 +0000 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: fix compiler warning and simplify checks in set_caps + https://bugzilla.gnome.org/show_bug.cgi?id=740195 + +2015-01-03 13:06:45 +0100 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: rework set_format code so mpg123audiodec works with decodebin/playbin + The old code was using gst_caps_normalize() and was generally overly + complex. Simplify by picking sample rate and number of channels from + upstream and the sample format from the allowed caps. If the format caps + is a list of strins, just pick the first one. And if the srcpad isn't + linked yet, use the default format (S16). + https://bugzilla.gnome.org/show_bug.cgi?id=740195 + +2014-09-10 17:24:39 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + Fix up one-element lists in template caps + +2014-03-05 00:51:04 +0000 Tim-Philipp Müller + + * tests/check/elements/mpg123audiodec.c: + tests: fix mpg123audiodec test for big-endian architectures + +2014-02-04 17:22:27 +0100 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: improved error report and checks + Signed-off-by: Carlos Rafael Giani + +2013-12-05 12:04:39 +0100 Sebastian Dröge + + * ext/mpg123/gstmpg123audiodec.c: + mpg123audiodec: Require caps to be set before any data processing + +2013-07-26 17:25:42 +0200 Edward Hervey + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: Remove dead assignment + harder ? :) + +2013-05-15 11:25:07 +0200 Sebastian Dröge + + * tests/check/elements/mpg123audiodec.c: + mpg123audiodec: Fix event handling in unit test + +2012-10-24 12:16:39 +0200 Sebastian Dröge + + * ext/mpg123/Makefile.am: + gst: Add better support for static plugins + +2013-04-15 00:22:39 -0700 David Schleef + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: Add conditional on API version for new enum + +2016-02-05 19:11:38 -0300 Thiago Santos + + * tests/check/Makefile.am: + tests: extend the AM_TESTS_ENVIRONMENT from check.mak + To get the CK_DEFAULT_TIMEOUT defined for all tests + https://bugzilla.gnome.org/show_bug.cgi?id=761472 + +2016-02-05 18:07:02 -0300 Thiago Santos + + * autogen.sh: + * common: + Automatic update of common submodule + From 86e4663 to b64f03f + +2016-01-25 20:00:26 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.h: + * ext/amrwbdec/amrwbdec.h: + amrnb, amrwb: unconditionally depend on opencore-amr*b >= 0.1.3 + We don't really need to cater for older versions any more. + +2016-01-21 17:34:38 +0100 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Demote rank to SECONDARY + https://bugzilla.gnome.org/show_bug.cgi?id=574461 + +2016-01-08 21:40:53 -0300 Thiago Santos + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: use query caps instead of accept-caps + accept-caps does only a shallow check and a full downstream + caps query is needed to check if ARGB is possible + +2015-10-30 11:06:11 +0530 Ravi Kiran K N + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Support reverse playback + Support reverse playback for ASF format. + Parse packets and queue the payloads, then push + the payload buffer to decoder in reverse order. + Video buffers are pushed from KeyFrame to next + Keyframe. + https://bugzilla.gnome.org/show_bug.cgi?id=757341 + +2015-12-24 15:28:46 +0100 Sebastian Dröge + + * configure.ac: + Back to development + +2015-12-24 14:48:50 +0100 Sebastian Dröge + + * tests/check/elements/amrnbenc.c: + amrnbenc: Fix various compiler warnings in the test + +2015-12-24 14:48:38 +0100 Sebastian Dröge + + * tests/check/elements/x264enc.c: + x264enc: Fix various compiler warnings in the test + +=== release 1.7.1 === + +2015-12-24 14:41:21 +0100 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.7.1 + +2015-12-24 14:10:29 +0100 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2015-12-24 12:23:27 +0100 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2015-12-21 12:32:32 +0100 Sebastian Dröge + + * configure.ac: + configure: Use -Bsymbolic-functions if available + While this is more useful for libraries, some of our plugins with multiple + files and some internal API can also benefit from this. + +2015-12-16 09:36:08 +0100 Sebastian Dröge + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + docs: update to git + +2015-12-07 09:08:18 -0500 Nicolas Dufresne + + * autogen.sh: + * common: + Automatic update of common submodule + From b319909 to 86e4663 + +2015-11-26 15:49:47 +0000 Arjen Veenhuizen + + * ext/x264/gstx264enc.c: + x264enc: increase bitrate limit from 100Mbps to 2Gbps + Don't artificially limit the bitrate, x264enc allows much + higher bitrates, and for intra-only 4k AVC they are needed. + x264 clips to 2Gbps internally, so use that as limit for now. + https://bugzilla.gnome.org/show_bug.cgi?id=758620 + +2015-11-18 23:20:59 -0800 Reynaldo H. Verdejo Pinochet + + * ext/x264/gstx264enc.c: + x264enc: drop unnecessary NULL check before g_free + +2015-10-21 14:35:17 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From b99800a to b319909 + +2015-10-20 17:29:42 +0300 Sebastian Dröge + + * configure.ac: + Use new GST_ENABLE_EXTRA_CHECKS #define + https://bugzilla.gnome.org/show_bug.cgi?id=756870 + +2015-10-21 14:26:07 +0300 Sebastian Dröge + + * README: + * common: + Automatic update of common submodule + From 9aed1d7 to b99800a + +2015-10-02 22:24:46 +0300 Sebastian Dröge + + * configure.ac: + Update GLib dependency to 2.40.0 + +2015-09-29 14:16:07 -0700 Reynaldo H. Verdejo Pinochet + + * ext/dvdread/README: + dvdread: remove broken link + Removing instead of updating as previously pointed-to page + (now http://dvd.sourceforge.net/dvdinfo/) is already linked + from dvd.sourceforge.net's homepage as: "Collection of + information on file formats/data structures relating to DVD + navigation/SPUs." + +2015-09-26 09:23:05 +0100 Tim-Philipp Müller + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: fix invalid read beyond channel position array + We would always copy sizeof(sorted_position) bytes, which is + for 8 channels, but if we have less than 8 channels the + position array we copy from will only have allocated space + for channel channels, so we would read beyond the input + array in some cases. + +2015-08-25 10:08:46 +0900 HoonHee Lee + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: factor out common code to set output format into new function + When caps event is recieved and header is changed, reordering channel + and setting the default output format for audio are processed. These 2 of + code are same. Thus, It is better to make a new function for these common + code in terms of removing duplicated code, maintenance and expansion. + https://bugzilla.gnome.org/show_bug.cgi?id=753920 + +2015-09-23 20:45:34 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't push any data on pads after the segment.stop + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +2015-09-23 20:30:21 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Only change segment start to a keyframe for KEYUNIT seeks + Not for accurate seeks, which should accurately start at the requested + position. + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +2015-09-23 20:23:40 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Update segment.position when pushing buffers + Without this, non-flushing seeks are not going to work well. + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +2015-09-23 19:37:43 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Only push EOS event if we're not doing a segment seek + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +2015-09-23 16:31:28 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: If pushing buffers returned EOS, go into the EOS and not failure code path + We don't want to unconditionally send an EOS event downstream, but might want + to send a SEGMENT_DONE message/event instead if a segment seek was done + before. + https://bugzilla.gnome.org/show_bug.cgi?id=755469 + +2015-09-25 23:51:12 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.6.0 === + +2015-09-25 23:32:02 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.6.0 + +2015-09-25 23:04:56 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +=== release 1.5.91 === + +2015-09-18 20:01:17 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.5.91 + +2015-09-18 19:34:50 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2015-09-18 11:53:57 +0200 Sebastian Dröge + + * po/zh_CN.po: + po: Update translations + +2015-09-05 23:34:45 +1000 Jan Schmidt + + * ext/x264/gstx264enc.c: + x264: Add bitrate info to the tags output. + Makes it possible for muxers to know the target bitrate as soon + as encoding starts, which flvmux now uses. + +2015-08-28 19:18:32 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: fix file mode of some source files + +=== release 1.5.90 === + +2015-08-19 14:05:27 +0300 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.5.90 + +2015-08-19 12:55:35 +0300 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2015-08-19 11:33:01 +0300 Sebastian Dröge + + * po/id.po: + * po/sv.po: + po: Update translations + +2015-08-18 02:23:55 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + x264enc: actually return TRUE from accept-caps handler + The query was handled + +2015-08-16 14:27:44 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + x264enc: implement accept-caps handling + Implement accept-caps handling without doing caps queries downstream + +2015-08-15 22:15:26 -0300 Thiago Santos + + * ext/amrnb/amrnbenc.c: + * ext/lame/gstlamemp3enc.c: + * ext/twolame/gsttwolamemp2enc.c: + audioencoders: use template subset check for accept-caps + It is faster than doing a query that propagates downstream and + should be enough + Elements: amrnbenc, lamemp3enc, twolamemp2enc + +2015-08-15 11:46:59 -0300 Thiago Santos + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: use default pad accept-caps handling + Avoids useless check of downstream caps when handling an + accept-caps query + +2015-08-15 11:46:13 -0300 Thiago Santos + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrwbdec/amrwbdec.c: + * ext/mad/gstmad.c: + audiodecoders: use default pad accept-caps handling + Avoids useless check of downstream caps when handling an + accept-caps query + Elements: a52dec, amrnbdec, amrwbdec, mad + +2015-08-14 11:14:31 +0200 Edward Hervey + + * tests/check/generic/states.c: + check: Rename states unit test + Makes it easier to differentiate from other modules states unit test + +2015-08-06 10:05:53 +0900 Vineeth TM + + * gst/realmedia/rmdemux.c: + rmdemux: fix assertion error when freeing old tags. + Check if old_tags is present before calling gst_tag_list_unref + https://bugzilla.gnome.org/show_bug.cgi?id=753301 + +2015-07-24 10:08:34 +0900 Vineeth TM + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix assertion error when codec_data is not present in structure + When discovering a particular asf file, caps structure doesn't have + codec_data, and this was not being checked before using the same, + resulting in assertion error + https://bugzilla.gnome.org/show_bug.cgi?id=752803 + +2015-07-29 15:55:14 +0100 Luis de Bethencourt + + * gst/asfdemux/gstasfdemux.c: + asfdemux: remove unread value + Init value of idx2 is never used. First usage sets it to idx + 1. Removing + initial value. + +2015-07-25 04:55:15 -0400 Olivier Crête + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't post error on flushing while reading headers + +2015-07-21 11:13:27 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + rmdemux: mark tag list as global scope + +2015-07-21 11:10:04 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + rmdemux: fix taglist leak + merge doesn't take ownership, so must unref the + old tags if we do merge. + +2015-07-21 12:44:55 +0900 Vineeth TM + + * gst/realmedia/rmdemux.c: + rmdemux: fix wrong unref when there are no tags + Tags should be appended to pending tags and unref'ed only if tags + are present. Else there is no need to append. + https://bugzilla.gnome.org/show_bug.cgi?id=752404 + +2015-07-16 18:11:37 +0900 Vineeth T M + + * gst/realmedia/rmdemux.c: + rmdemux: fix memory leaks during error cases + while adding stream, during error cases, only stream is + being freed. Adapter, pad, tags, subpackets, index are not being + freed resulting in memory leaks + https://bugzilla.gnome.org/show_bug.cgi?id=752404 + +2015-07-16 17:23:15 +0100 Tim-Philipp Müller + + * gst-plugins-ugly.doap: + Update mailing list in doap file as well + +2015-07-16 17:19:37 +0100 Tim-Philipp Müller + + * ext/amrnb/amrnbdec.c: + Update mailing list address from sourceforge to freedesktop + +2015-07-16 09:49:17 +0900 Vineeth T M + + * gst/realmedia/rmdemux.c: + rmdemux: fix tag memory leak + tags is not being freed after being merged to the + pending_tags. + https://bugzilla.gnome.org/show_bug.cgi?id=752404 + +2015-07-03 21:58:33 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From f74b2df to 9aed1d7 + +2015-06-25 00:04:19 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.5.2 === + +2015-06-24 23:39:37 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.5.2 + +2015-06-24 23:14:52 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2015-06-24 11:15:22 +0200 Sebastian Dröge + + * po/nl.po: + po: Update translations + +2015-06-15 16:33:26 +1000 Jan Schmidt + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Use gst_video_multiview_guess_half_aspect() function + Use gst_video_multiview_guess_half_aspect() to guess if frame-packed + stereoscopic video is full-frame per view or not. + +2015-06-16 17:49:05 -0400 Nicolas Dufresne + + * common: + Automatic update of common submodule + From 6015d26 to f74b2df + +2014-11-26 22:15:43 +0100 Matej Knopp + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Use gst_video_encoder_set_min_pts + This method replace the manual adjustment of PTS and DTS to avoid + negative DTS issues. Using this method will also update the segment so + we don't loos sync. + https://bugzilla.gnome.org/show_bug.cgi?id=740575 + +2015-06-10 14:28:05 +1000 Jan Schmidt + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Add support for stereoscopic video metadata. + Add parsing of stereoscopic metadata, and place into the caps to + the decoder. + Fix parsing of Advanced Mutual Exclustion objects. + https://bugzilla.gnome.org/show_bug.cgi?id=711190 + Based on a patch by HyeJin Choi + +2014-10-05 00:54:59 +1000 Jan Schmidt + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Add support for stereoscopic video + Provide new frame-packing property to directly set + x264enc frame packing, or pass through upstream settings + The explicit layout from the frame-packing property is + preferred over any info from the caps. + +2015-06-10 15:32:44 +0100 Chris Clayton + + * gst/xingmux/gstxingmux.c: + xingmux: fix compiler warnings + https://bugzilla.gnome.org/show_bug.cgi?id=750596 + +2015-06-09 15:28:46 +0200 Stefan Sauer + + * Makefile.am: + cruft: add the obsolete tmpl dir to cruft-dirs + +2015-06-09 11:30:34 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From d9a3353 to 6015d26 + +2015-06-08 23:08:11 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From d37af32 to d9a3353 + +2015-06-07 23:06:47 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From 21ba2e5 to d37af32 + +2015-06-07 17:32:12 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From c408583 to 21ba2e5 + +2015-06-07 17:02:31 +0200 Stefan Sauer + + * docs/plugins/Makefile.am: + docs: remove variables that we define in the snippet from common + This is syncing our Makefile.am with upstream gtkdoc. + +2015-06-07 17:16:30 +0200 Stefan Sauer + + * autogen.sh: + * common: + Automatic update of common submodule + From d676993 to c408583 + +2015-06-07 16:44:43 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.5.1 === + +2015-06-07 11:05:29 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.5.1 + +2015-06-07 11:05:22 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2015-06-07 09:36:00 +0200 Sebastian Dröge + + * po/eo.po: + * po/fr.po: + po: Update translations + +2015-06-02 16:31:10 +0200 Edward Hervey + + * tests/check/elements/amrnbenc.c: + * tests/check/elements/mpeg2dec.c: + * tests/check/elements/x264enc.c: + * tests/check/elements/xingmux.c: + * tests/check/pipelines/lame.c: + check: Use GST_CHECK_MAIN () macro everywhere + Makes source code smaller, and ensures we go through common initialization + path (like the one that sets up XML unit test output ...) + +2015-05-26 17:58:18 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: don't artificially limit max allowed value of "threads" property + In auto mode it will happily chose much higher values anyway, + and a limit of 4 seems a bit low these days. + +2015-05-12 22:05:02 +1000 Jan Schmidt + + * ext/dvdread/dvdreadsrc.c: + dvdread: Also reset the first_seek var in start() + Make the initial chapter seek work across reuse. + https://bugzilla.gnome.org/show_bug.cgi?id=453322 + +2015-05-12 21:52:24 +1000 Jan Schmidt + + * ext/dvdread/dvdreadsrc.c: + * ext/dvdread/dvdreadsrc.h: + dvdread: Work around basesrc initial seek + Ignore the initial seek basesrc sends, as it + breaks starting from another chapter by + immediately seeking back to the start of the title + +2015-05-10 11:34:33 +0100 Tim-Philipp Müller + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolamemp2enc.c: + * ext/x264/gstx264enc.c: + * gst/realmedia/rademux.c: + * gst/xingmux/gstxingmux.c: + docs: update example pipelines in element docs + Mostly gst-launch -> gst-launch-1.0, but also + use autoaudiosink/autovideosink in more places + and update pipelines a little or flesh out + descriptions. + +2015-04-27 10:57:12 +0100 Luis de Bethencourt + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/realmedia/rdtdepay.c: + Rename property enums from ARG_ to PROP_ + Property enum items should be nameed PROP_ for consistency and readability. + +2015-04-26 17:56:22 +0100 Tim-Philipp Müller + + * Android.mk: + * ext/mad/Makefile.am: + * ext/x264/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/realmedia/Makefile.am: + * gst/xingmux/Makefile.am: + Remove obsolete Android build cruft + This is not needed any longer. + +2015-04-24 17:05:20 +0100 Luis de Bethencourt + + * gst/realmedia/pnmsrc.c: + realmedia: remove unused enum item PROP_LAST + +2015-04-23 16:23:01 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: define GST_CHECK_TEST_ENVIRONMENT_BEACON + Make sure the test environment is set up. + https://bugzilla.gnome.org//show_bug.cgi?id=747624 + +2015-04-23 16:22:39 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump automake requirement to 1.14 and autoconf to 2.69 + This is only required for builds from git, people can still + build tarballs if they only have older autotools. + https://bugzilla.gnome.org//show_bug.cgi?id=747624 + +2015-04-23 16:22:30 +0100 Tim-Philipp Müller + + * .gitignore: + Update .gitignore + +2015-04-22 10:37:54 +0200 Sebastian Dröge + + * LICENSE_readme: + Remove LICENSE_readme + It's completely outdated and just confusing, better if people are + forced to look at the actual code in question than trusting this file. + +2015-04-22 10:37:43 +0200 Sebastian Dröge + + * INSTALL: + Remove INSTALL file + autotools automatically generate this, and when using different versions + for autogen.sh there will always be changes to a file tracked by git. + +2015-04-20 14:35:30 +0900 Cliff Han + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix a seek failure due to out-of-range in push mode + A seek in push mode failed for big offsets which are beyond + the range of guint32. + https://bugzilla.gnome.org/show_bug.cgi?id=748162 + +2015-04-08 16:52:06 +0200 Edward Hervey + + * common: + * tests/check/Makefile.am: + tests: Use AM_TESTS_ENVIRONMENT + Needed by the new automake test runner + +2015-04-03 18:58:03 +0100 Tim-Philipp Müller + + * autogen.sh: + * common: + Automatic update of common submodule + From bc76a8b to c8fb372 + +2015-04-02 17:24:05 +0100 Vincent Penquerc'h + + * ext/a52dec/gsta52dec.c: + a52dec: fix race in liba52dec lookup table initialization + a52_init initializes the IMDCT global state as well as creating + a new state. When two A52 decoders are created (eg, when two AC3 + tracks are contained in a video), calls to a52_init may happen + at the same time, and the IMDCT initialization is not reentrant. + https://bugzilla.gnome.org/show_bug.cgi?id=746781 + +2015-03-27 14:41:51 +0100 Guillaume Desmottes + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix buffer leak in crop_buffer() + gst_buffer_pool_acquire_buffer() gives us a new owned buffer while + gst_buffer_replace() reffed it as well so we were one reference extra. + https://bugzilla.gnome.org/show_bug.cgi?id=746887 + +2015-03-28 16:58:26 +0100 Mark Nauwelaerts + + * gst/realmedia/rmdemux.c: + rmdemux: resurrect some flow return handling + https://bugzilla.gnome.org/show_bug.cgi?id=744572 + +2015-03-28 16:57:06 +0100 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: resurrect some flow return handling + https://bugzilla.gnome.org/show_bug.cgi?id=744572 + +2015-03-24 12:50:43 +0000 Luis de Bethencourt + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix memory leak + CID #1291630 + +2015-03-24 10:29:48 +0000 Luis de Bethencourt + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: initialize buffer + Buffer needs to be null before passing it to gst_buffer_pool_acquire_buffer() + CID #1291634 + +2015-03-13 17:00:03 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Add stride support + This allow using external pools that have different strides from the + default. These strides need to respect certain rules, which we check + and if these are not met, we fallback to generic pool. + https://bugzilla.gnome.org/show_bug.cgi?id=735379 + +2015-03-10 16:45:01 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Re-implement pool handling + This is a rewrite of the pool negotiation and configuration. Direct + to output decoding is now achieved by configuring the pool using + video-alignment. This removes copies when dealing with any elements that + supports VideoAlignment, and enable usage of generic video buffer pool, + XVImagePool and GLPool. It drops the crop meta implementation for now. + https://bugzilla.gnome.org/show_bug.cgi?id=735379 + +2015-03-10 09:33:15 +0000 Tim-Philipp Müller + + * gst/dvdsub/gstdvdsubdec.c: + dvbsub: fix indentation + +2015-03-10 09:32:51 +0000 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + * gst/dvdsub/gstdvdsubdec.c: + Fix double semicolons + +2015-03-09 19:11:51 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + Revert "mpeg2dec: Fix handling of stride" + This reverts commit f3e8dcb9de4d546e7d80ccc1754ed13dd4e7ac81. + +2015-03-09 19:11:44 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + Revert "mpeg2dec: Use propose unref method for buffer" + This reverts commit 63b43d3bee832aec353d02575da543f3c73f6893. + +2015-03-09 18:43:43 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Use propose unref method for buffer + +2015-01-21 18:29:22 +0000 Simon Farnsworth + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix handling of stride + A pipeline like: + gst-launch-1.0 filesrc location=file.ts ! tsdemux ! mpegvideoparse ! mpeg2dec ! vaapisink + would look bad when file.ts contains 704x576 video, because vaapisink would + give you buffers of stride 768, but libmpeg2 was not told about this and + used a stride of 704. + Tell libmpeg2 about the stride from downstream; in the process, teach it to + reject buffer pools that don't meet libmpeg2's chroma stride requirements + Signed-off-by: Simon Farnsworth + +2015-02-11 13:56:48 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + Improve and fix LATENCY query handling + This now follows the design docs everywhere, especially the maximum latency + handling. + https://bugzilla.gnome.org/show_bug.cgi?id=744106 + +2015-02-06 19:04:32 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Don't set max latency to the same value as the encoder latency + The meaning of the max latency is *not* the maximum latency this element will + introduce. It is the maximum latency this element can endure without + overflowing any buffers, which is infinite for x264enc. + Fixes latency configuration in zero latency mode, where max latency was + becoming 0... which usually won't work well if something else introduces + latency as then max < min in the end, and latency configuration just fails. + +2015-02-02 14:13:10 +0000 Vincent Penquerc'h + + * ext/x264/gstx264enc.c: + x264enc: set annexb=1 in byte stream mode when downstream has ANY caps + This matches what is done when downstream caps are not ANY, and fixes + prerolling in byte stream mode when typefind is downstream. + +2015-01-21 09:56:41 +0100 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + * ext/twolame/gsttwolamemp2enc.c: + Constify some static arrays everywhere + +2015-01-18 16:53:41 +0000 Tim-Philipp Müller + + * configure.ac: + configure: remove non-ported plugins stuff + It's not needed any longer, all plugins in -ugly + have been ported. + +2015-01-18 11:07:43 -0500 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Don't set an allocation maximum + There is no reason x264enc should enforce a maximum allocation size. + The maximum is normally set by buffer pool which cannot grow, but we + don't offer a buffer pool. This would lead to stall when used with + element that don't implement allocation query. + Related to: https://bugzilla.gnome.org/show_bug.cgi?id=738302 + +2015-01-12 16:10:45 +0100 Stefan Sauer + + * common: + Automatic update of common submodule + From f2c6b95 to bc76a8b + +2014-12-22 11:46:27 +0100 Sebastian Dröge + + * MAINTAINERS: + MAINTAINERS: Update my mail address + +2014-12-18 10:54:30 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From ef1ffdc to f2c6b95 + +2014-11-27 17:11:30 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 7bb2bce to ef1ffdc + +2014-06-06 13:59:57 +0100 Vincent Penquerc'h + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: set channel positions using the appropriate API + https://bugzilla.gnome.org/show_bug.cgi?id=731038 + +2014-11-05 23:34:56 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix comment + +2014-11-05 13:45:29 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Send duration query upstream first + An upstream element (like mms or some dlna source) might be able to + answer the query. Try that first, else fallback to standard logic + +2014-11-02 17:31:05 +0000 Tim-Philipp Müller + + * gst/asfdemux/asfpacket.c: + asf: fix up file mode + +2014-10-27 17:58:14 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 84d06cd to 7bb2bce + +2014-10-21 19:46:03 +0100 Tim-Philipp Müller + + * Makefile.am: + tests: parallelise 'make check-valgrind' + +2014-10-21 13:02:03 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From a8c8939 to 84d06cd + +2014-10-21 12:58:58 +0200 Stefan Sauer + + * README: + * common: + Automatic update of common submodule + From 36388a1 to a8c8939 + +2014-08-22 10:46:35 +0200 Guillaume Desmottes + + * gst/asfdemux/gstasfdemux.c: + asfdemux: first try to delegate TIME seek events upstream + We should give a chance to upstream to handle TIME seek events before trying + to handle it in asfdemux. + Fix a bug where fast backward seeks where discarded right away because they + were not supported by asfdemux. + https://bugzilla.gnome.org/show_bug.cgi?id=734471 + +2014-09-04 16:57:02 +0200 Guillaume Desmottes + + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: + asfdemux: add ASF_OBJ_METADATA_LIBRARY_OBJECT + We can safely ignore those but best to claim to understand this object type so + we don't raise a warning. + https://bugzilla.gnome.org/show_bug.cgi?id=736060 + +2014-08-21 12:09:23 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: if video is h264, check the codec_data for bytestream data + For bytestream we don't want to expose it as codec_data but rather as + streamheader as it is not out-of-band data but data that should be + prepended to the beginning of the stream before the other buffers. + https://bugzilla.gnome.org/show_bug.cgi?id=735070 + +2014-08-10 19:13:10 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + docs: update for git master + +2014-08-06 12:07:09 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: simplify log statement + Use the GST_PTR_FORMAT to print the buffer + +2014-08-05 19:47:26 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264: fix colour inversion with YV12 format + It's the same as I420 but with the U/V planes swapped. + +2014-08-01 10:37:44 +0200 Edward Hervey + + * Makefile.am: + * common: + Makefile: Add usage of build-checks step + Allows building checks without running them + +2014-07-08 16:45:45 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Request buffers in allocation query + https://bugzilla.gnome.org/show_bug.cgi?id=732288 + +2014-06-06 20:23:15 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Shift both PTS and DTS to ensure positive timestamp + Currently we only shift DTS to compensate that we don't support negative + timestamp. This cause a problem that PTS is no longer >= DTS and may + make muxers live much harder. Instead, shift both PTS/DTS forward. Also + remove all the hack to handle this which seems the result of thinking libx264 + is bugged. + https://bugzilla.gnome.org/show_bug.cgi?id=731351 + +2014-07-19 18:04:46 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.4.0 === + +2014-07-19 17:44:06 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.4.0 + +2014-07-19 16:50:04 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-07-19 12:48:11 +0200 Sebastian Dröge + + * po/sv.po: + po: Update translations + +=== release 1.3.91 === + +2014-07-11 11:44:28 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.3.91 + +2014-07-11 11:13:39 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-07-11 08:53:12 +0200 Sebastian Dröge + + * po/vi.po: + po: Update translations + +2014-07-04 03:22:00 +0200 Sebastian Rasmussen + + * gst/realmedia/rademux.c: + rademux: Print invalid fourcc in error message in hex + Previously this was printed as characters which caused later processing + of the error message to sometimes warn about non-UTF-8 characters. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732716 + +=== release 1.3.90 === + +2014-06-28 11:39:14 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.3.90 + +2014-06-28 11:39:01 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-06-22 21:48:28 +0100 Tim-Philipp Müller + + * .gitignore: + Ignore autotools test-driver temp files from 'make check' + +2014-06-22 19:36:14 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.3.3 === + +2014-06-22 18:13:53 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.3.3 + +2014-06-22 17:40:40 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-06-22 14:25:18 +0200 Sebastian Dröge + + * po/de.po: + * po/nl.po: + po: Update translations + +2014-05-26 17:55:43 -0300 Thiago Santos + + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + rmdemux: use GstFlowCombiner + Removes flow return combination code to use the newly added GstFlowCombiner + https://bugzilla.gnome.org/show_bug.cgi?id=709224 + +2014-05-23 18:17:11 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: use GstFlowCombiner + Removes flow return combination code to use the newly added GstFlowCombiner + https://bugzilla.gnome.org/show_bug.cgi?id=709224 + +2014-05-28 09:49:59 +0200 Aurélien Zanelli + + * ext/x264/gstx264enc.c: + x264enc: fix caps leak in set_format() + https://bugzilla.gnome.org/show_bug.cgi?id=730865 + +2013-12-01 20:53:03 +0100 Matej Knopp + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Handle initial 0 timestamp that should have been -1 + https://bugzilla.gnome.org/show_bug.cgi?id=719660 + +2014-05-21 13:23:33 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.3.2 === + +2014-05-21 13:06:35 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * docs/plugins/inspect-build.stamp: + * docs/plugins/inspect.stamp: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.3.2 + +2014-05-21 12:53:52 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-05-21 10:51:38 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 211fa5f to 1f5d3c3 + +2014-05-16 16:24:46 +0100 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: remove unused struct members + +2014-05-16 12:21:06 +0200 Sebastian Dröge + + * gst/realmedia/rtspreal.c: + rtspreal: Fix some memory leaks in an error path + CID 1212165. + +2014-05-09 14:54:54 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Release codec state on negotiation failures + Else it leaks + CID #1212169 + +2014-05-03 20:48:37 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.3.1 === + +2014-05-03 18:29:23 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.3.1 + +2014-05-03 18:21:01 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2014-05-03 17:23:39 +0200 Sebastian Dröge + + * po/de.po: + * po/id.po: + * po/lv.po: + * po/sk.po: + * po/sr.po: + po: Update translations + +2014-05-03 10:15:28 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From bcb1518 to 211fa5f + +2014-04-27 00:29:16 +0100 Tim-Philipp Müller + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstrtspwms.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rtspreal.c: + docs: remove outdated and pointless 'Last reviewed' lines from docs + They are very confusing for people, and more often than not + also just not very accurate. Seeing 'last reviewed: 2005' in + your docs is not very confidence-inspiring. Let's just remove + those comments. + +2014-04-10 17:29:30 +0100 Vincent Penquerc'h + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: fix spurious rejection of 0 time offset commands + Coverity 206168 + +2014-04-10 16:53:25 +0100 Vincent Penquerc'h + + * ext/dvdread/dvdreadsrc.c: + dvdread: avoid intermediate promotion to signed + We should not reach the dangerous range here, though. + Coverity 206491, 206492, 1139856 + +2014-01-17 10:46:50 +0000 Vincent Penquerc'h + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: do not reset the whole video info when setting size + New changes to gstvideo will reset all the video info state + when calling _set_format, overwriting what was previously set + in the preceding code. + The comment says the following code is meant to preserve the + pre-crop size, so let's just keep the size and related data + as this does not seem to break anything else (this is what + the _set_format call would have set before the change that + reset all data, except the colorimetry). + +2014-04-03 15:06:22 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix payloads check + Don't iterate stream->payloads if ... it doesn't exist + CID #1139846 + +2014-03-02 05:11:10 +0100 Sebastian Rasmussen + + * .gitignore: + .gitignore: Ignore gcov intermediate files + https://bugzilla.gnome.org/show_bug.cgi?id=725483 + +2014-02-28 09:35:10 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From fe1672e to bcb1518 + +2014-02-26 22:12:50 +0100 Stefan Sauer + + * common: + Automatic update of common submodule + From 1a07da9 to fe1672e + +2014-02-26 11:31:03 +0100 Stefan Sauer + + * docs/Makefile.am: + docs: install prebuilt plugin docs if gtk-doc is disabled + Sync to the Makefile.am from gst-plugin-base where it is done right. + Fixes #725034 + +2014-02-13 09:39:04 +0100 Stefan Sauer + + * gst/xingmux/gstxingmux.c: + * gst/xingmux/plugin.c: + xingmux: add muxer category and make element plugable + This is required to make encodebin consider the element. Yet it is not enough to + have it plugged it has a lower priority than most mp3encoders and no different + caps. + +2014-02-24 11:42:00 +0100 Dirk Van Haerenborgh + + * ext/x264/gstx264enc.c: + x264enc: allow lossless compression (qp=0) + https://bugzilla.gnome.org/show_bug.cgi?id=725051 + +2014-02-20 21:08:08 +0100 Edward Hervey + + * m4/a52.m4: + m4: Remove extra check for 11+ year old a52 release + You deserve a build failure if you still have that version + If someone wants to completely remove this m4 to replace it with the + generic AS_GST_CHECK_LIBHEADER() it would be appreciated. + +2014-02-19 21:11:55 +0100 Rico Tzschichholz + + * m4/a52.m4: + m4: Fix multiple tests in AC_CHECK_A52DEC + +2014-02-09 23:41:36 +0100 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Remove unused function + +2014-02-06 19:22:47 +0100 Edward Hervey + + * tests/check/Makefile.am: + check: Fix test location + +2014-02-03 02:06:11 +0100 Sebastian Rasmussen + + * tests/check/Makefile.am: + tests: Don't build disabled plugins' check tests + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=723505 + +2014-01-30 10:44:29 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From d48bed3 to 1a07da9 + +2014-01-03 16:20:11 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: only add "format" field with fourcc to WMV caps + Doesn't make sense for e.g. H264 or MJPEG. + +2013-12-22 22:34:03 +0000 Tim-Philipp Müller + + * autogen.sh: + * common: + Automatic update of common submodule + From dbedaa0 to d48bed3 + +2013-12-22 21:56:03 +0000 Tim-Philipp Müller + + * po/Makevars: + po: set gettext domain in Makevars so we don't have to patch the generated Makefile.in.in + https://bugzilla.gnome.org/show_bug.cgi?id=705455 + +2013-12-05 12:16:45 +0100 Sebastian Dröge + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: Remove some dead code + +2013-12-05 12:16:38 +0100 Sebastian Dröge + + * ext/amrnb/amrnbdec.c: + amrnbdec: Remove some dead code + +2013-12-05 12:09:04 +0100 Sebastian Dröge + + * ext/amrnb/amrnbdec.c: + amrnbdec: Use gst_audio_decoder_set_needs_format() instead of custom code + +2013-12-05 12:08:46 +0100 Sebastian Dröge + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: Use gst_audio_decoder_set_needs_format() instead of custom code + +2013-12-05 11:44:10 +0100 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Use new gst_video_decoder_set_needs_format() API + +2013-11-29 15:51:49 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: fix compiler warning + Compiler warns rightly about possibly uninitialized variable. + +2013-11-29 15:49:29 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: fix crash on NULL caps when negotiation happens without a downstream peer + gst-launch-1.0 videotestsrc ! x264enc + +2013-11-11 13:15:54 +0100 Mark Nauwelaerts + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: graceful degradation for badly parsed input + +2013-11-05 11:20:20 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 865aa20 to dbedaa0 + +2013-10-22 16:02:04 +0900 HyeJin Choi + + * gst/asfdemux/asfpacket.c: + asfdemux: mo_size check bug fix. mo_size is not mandatory field. + So, don't need to check previous payload's mo_size and current + payload's mo_size when merging it. + https://bugzilla.gnome.org/show_bug.cgi?id=710609 + +2013-10-22 15:03:15 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Keep audio error checking fields only for audio + Video shouldn't need to be descrambled, this can cause frames data + to be corrupted + https://bugzilla.gnome.org/show_bug.cgi?id=684942 + +2013-10-22 00:56:29 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: really copy the buffer data + Pass the copy-memory flag to copy the memory for the output buffer, + otherwise we end with 0-sized buffers + https://bugzilla.gnome.org/show_bug.cgi?id=684942 + +2013-09-27 08:05:25 -0700 Michael Esemplare + + * ext/x264/gstx264enc.c: + x264enc: If FPS is available, set VFR to false + https://bugzilla.gnome.org/show_bug.cgi?id=708940 + +2013-09-24 10:08:10 -0700 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Only use segment.start as seek_time if it is relative + Relying on the gst_segment_do_seek results for getting the + seeking time should not be used if seek type is SET because the + do_seek function makes the 'cur` position of the seek normalized + on the segment range. This means that seeking beyond the end of the + file might not result in instant EOS as it will end up seeking to + the final ts of the file. + In asf seeking to the final timestamp can lead to seeking to the last + keyframe, meaning a few seconds of video will still be played, which should + not be the desired behavior when seeking beyong file limits. + +2013-09-24 10:07:25 -0700 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Parse last simple index entry + The entry size is fixed at 6, fix typo to finish parsing the index + correctly until the last sample + +2013-09-24 18:32:31 +0100 Tim-Philipp Müller + + * README: + * common: + Automatic update of common submodule + From 6b03ba7 to 865aa20 + +2013-09-24 15:05:36 +0200 Sebastian Dröge + + * configure.ac: + configure: Actually use 1.3.0.1 as version to make configure happy + +2013-09-24 15:00:30 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.2.0 === + +2013-09-24 14:27:45 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.2.0 + +2013-09-24 14:27:39 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-09-18 11:34:56 +0200 Andoni Morales Alastruey + + * ext/x264/gstx264enc.c: + x264enc: Update the documentation to match the default profile used + https://bugzilla.gnome.org/show_bug.cgi?id=708036 + +2013-09-20 16:17:31 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From b613661 to 6b03ba7 + +2013-09-19 18:43:43 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 74a6857 to b613661 + +2013-09-19 17:36:25 +0100 Tim-Philipp Müller + + * autogen.sh: + * common: + Automatic update of common submodule + From 098c0d7 to 74a6857 + +2013-09-19 11:35:04 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.1.90 === + +2013-09-19 10:50:32 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.1.90 + +2013-09-19 10:30:37 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-09-19 09:45:55 +0200 Sebastian Dröge + + * po/cs.po: + po: Update translations + +2013-09-18 19:13:45 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + * tests/check/elements/x264enc.c: + x264enc: Implement getcaps that restricts the input format depending on the output profile + Also add some x264enc profile tests + https://bugzilla.gnome.org/show_bug.cgi?id=708326 + +2013-09-16 19:38:36 +0200 Matej Knopp + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix playback regression in push mode + +2013-09-10 19:33:33 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.h: + asfdemux: remove unused variable + +2013-09-05 22:56:48 +0200 Mathieu Duponchelle + + * ext/x264/gstx264enc.c: + x264enc: Don't unref future state but the old one + Being silly will lead us nowhere. + +2013-09-04 16:32:43 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Check if we have an input state before using it + Flushing might happen before caps were set on the encoder, + which would lead to crashes here. + Thanks to Matej Knopp for analyzing this. + https://bugzilla.gnome.org/show_bug.cgi?id=707414 + +2013-09-03 20:28:35 +0200 Matej Knopp + + * ext/x264/gstx264enc.c: + x264enc: fix unsigned comparison warning + +2013-08-28 13:27:05 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.1.4 === + +2013-08-28 12:58:43 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.1.4 + +2013-08-28 12:58:37 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-08-28 12:32:37 +0200 Sebastian Dröge + + * po/pt_BR.po: + po: update translations + +2013-08-27 14:13:06 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: log when we output a lower profile than requested + +2013-08-21 18:32:17 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Consider subset relations of profiles when setting srcpad caps + constrained-baseline is a subset of baseline, is a subset of main, + is a subset of high profile. + https://bugzilla.gnome.org/show_bug.cgi?id=705425 + +2013-08-21 12:31:23 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: propagate flow return back to base class and upstream + https://bugzilla.gnome.org/show_bug.cgi?id=705425 + +2013-08-17 23:13:17 +0100 Tim-Philipp Müller + + * configure.ac: + configure: fix x264 version checking + x264 releases carry pkg-config versions such as 0.120.x + (literallly with an 'x'). Checking for x264 >= 0.120.0 will + then fail, so we need to either check for > 0.119.0 or + for >= 0.120 to make this work right. + +2013-08-17 23:09:15 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: minor clean-up + We requires x264 build >= 120 now. + +2013-08-15 15:30:31 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix mpeg2_reset() calls + +2013-08-15 15:27:48 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/x264/gstx264enc.c: + ext: Use new flush vfunc of video codec base classes and remove reset implementations + +2013-08-01 01:34:05 +0200 Matej Knopp + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix build on C89 compilers + +2013-07-30 17:28:17 +0200 Matej Knopp + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix seeking in push mode + +2013-08-02 14:14:48 +0200 Lubosz Sarnecki + + * configure.ac: + build: add subdir-objects to AM_INIT_AUTOMAKE + Fixes warnings in automake 1.14 + https://bugzilla.gnome.org/show_bug.cgi?id=705350 + +2013-08-02 08:25:49 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Do a hard reset of flush_stop + Which is notified by hard == 0 with latest refactoring. + +2013-07-29 21:09:37 +0100 Tim-Philipp Müller + + * po/LINGUAS: + * po/da.po: + * po/de.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/ja.po: + * po/nb.po: + * po/nl.po: + * po/pl.po: + * po/ru.po: + * po/sl.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + po: update translations + +2013-07-29 14:48:21 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.1.3 === + +2013-07-29 13:46:08 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.1.3 + +2013-07-29 13:46:05 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-07-29 12:13:17 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + gst: Don't swap start/stop for negative rates in the SEGMENT query + +2013-07-29 10:57:38 +0200 Sebastian Dröge + + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + real: Implement SEGMENT query + +2013-07-29 10:56:06 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Implement SEGMENT query + +2013-07-28 16:43:28 +0200 Matej Knopp + + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Add support for dvr-ms + https://bugzilla.gnome.org/show_bug.cgi?id=705026 + +2013-07-26 16:47:48 +0200 Edward Hervey + + * gst/realmedia/rtspreal.c: + rtspreal: Ensure output value has an assigned value + In the case where this macro was used, that dest was != NULL but that + the strncmp failed, we would end up with dest_len being undefined. + +2013-07-26 16:39:12 +0200 Edward Hervey + + * ext/x264/gstx264enc.c: + x264: Fix dts comparision + We were assigning to a guint64 value (frame->dts) the sum of a unsigned + and signed value... resulting it the result never being < 0. + Instead just check if it is smaller before assigning to frame->dts. + +2013-07-25 11:28:54 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: fix seqnum handling for seeks + Use the same seqnum as the seek for flushes/segments that are + caused by the seek. Also do the same for segment events + Fixes #676242 + +2013-07-25 13:35:44 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Clean up reset/start/stop handling + +2013-07-25 11:01:20 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: React properly to flushing/resetting the encoder + https://bugzilla.gnome.org/show_bug.cgi?id=656007 + +2013-07-22 16:01:13 +0200 Sebastian Dröge + + * gst/realmedia/rademux.c: + * gst/realmedia/rademux.h: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + realmedia: Add support for group-id in the stream-start event + +2013-07-22 15:45:57 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Add support for group-id in the stream-start event + +2013-07-22 15:43:18 +0200 Sebastian Dröge + + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + siddec: Add support for group-id in the stream-start event + +2013-07-18 17:14:29 +0200 Edward Hervey + + * gst/realmedia/rmdemux.c: + rmdemux: Mark demuxer as "running" in push-mode + Allows queries (and other code) to be answered when working in push-mode. + Running would only be set to TRUE accordingly when working in pull-mode + once it had read header/index. + Fixes #680185 + +2013-07-17 16:17:54 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Properly reset on sequence changes + Otherwise we end up using stray data/buffers. + Fixes #690701 + +2013-07-11 16:57:24 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.1.2 === + +2013-07-11 16:12:25 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.1.2 + +2013-07-11 16:12:21 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-06-18 20:06:24 +0200 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: correctly determine last chapter's duration + This (mostly) reverts 683f5eeae7b830e4e4b790f3817ff6b8ce517b1c. + It worked just fine before ... + +2013-06-25 14:20:37 +0200 Wim Taymans + + * gst/realmedia/rdtmanager.c: + rdt: forward sticky events + +2013-06-05 18:36:40 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 1.1.1 === + +2013-06-05 17:58:51 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.1.1 + +2013-06-05 16:42:01 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2013-06-05 15:15:16 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 098c0d7 to 01a7a46 + +2013-06-04 16:12:27 +0300 Sreerenj Balachandran + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: make the aspect ratio calculation more accurate. + Utilize the libmpeg2 api: mpeg2_guess_aspect() to guess the + aspect-ratio if we don't have a valid upstream PAR. + https://bugzilla.gnome.org/show_bug.cgi?id=685103 + +2013-05-15 10:52:09 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 5edcd85 to 098c0d7 + +2013-05-13 13:19:27 +0200 Sebastian Dröge + + * tests/check/elements/amrnbenc.c: + * tests/check/elements/mpeg2dec.c: + * tests/check/elements/x264enc.c: + * tests/check/elements/xingmux.c: + tests: Fix event handling + +2013-05-09 19:40:49 -0400 Olivier Crête + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Tell GstAudioEncoder about the number of incoming samples + lame does internal resampling, but the base class only cares about + the number of raw samples, so tell finish frames about that, not + the number of samples in the outgoing frame.: + +2013-04-30 10:01:29 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: output byte-stream if downstream has ANY caps + It's what people expect when they pipe the output to + filesink or into a tcp connection or pipe. + +2013-04-22 23:52:48 +0100 Tim-Philipp Müller + + * MAINTAINERS: + * README: + * README.static-linking: + * common: + Automatic update of common submodule + From 3cb3d3c to 5edcd85 + +2012-10-24 12:15:54 +0200 Sebastian Dröge + + * configure.ac: + * ext/a52dec/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/lame/Makefile.am: + * ext/mad/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * ext/sidplay/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/realmedia/Makefile.am: + * gst/xingmux/Makefile.am: + gst: Add better support for static plugins + +2013-04-14 17:55:44 +0100 Tim-Philipp Müller + + * autogen.sh: + * common: + Automatic update of common submodule + From aed87ae to 3cb3d3c + +2013-04-09 21:00:43 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From 04c7a1e to aed87ae + +2013-03-25 18:05:14 -0700 David Schleef + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rmdemux.c: + Use %03u instead of %u in gst_pad_create_stream_id_printf() + +2013-03-06 13:28:37 +0000 Tom Greenwood + + * ext/x264/gstx264enc.c: + x264enc: Fix for 0/1 framerate - now uses VFR in this case + Previously did a division by zero. + https://bugzilla.gnome.org/show_bug.cgi?id=695728 + +2013-03-07 00:02:00 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 2de221c to 04c7a1e + +2013-02-08 00:15:01 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: simplify template caps + No need to make an array for one single element. + +2013-02-08 00:11:03 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: put all theoretically possible formats in template caps + and decide at runtime which subset of these (8-bit or 10-bit video + formats) is supported. libx264 will be compiled for one of these + two options, and it is possible to switch by pointing the dynamic + linker to a different libx264 build at runtime. If we want our + template caps to be correct, they should contain all then, with + the actually supported ones determined at runtime. + https://bugzilla.gnome.org/show_bug.cgi?id=691935 + +2013-01-23 10:16:51 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: detect supported bit depth and pixel formats at runtime + http://bugs.debian.org/667573 + https://bugzilla.gnome.org/show_bug.cgi?id=691935 + +2013-01-30 09:15:18 +0100 Benjamin Gaignard + + * autogen.sh: + autogen.sh: allow calling from out-of-tree + Signed-off-by: Benjamin Gaignard + https://bugzilla.gnome.org/show_bug.cgi?id=692857 + +2013-01-28 20:43:08 +0100 Stefan Sauer + + * common: + Automatic update of common submodule + From a942293 to 2de221c + +2013-01-15 15:18:04 +0100 Martin Pitt + + * tests/check/Makefile.am: + tests: use _1_0 variants for the various registry variables + These override the variants without version suffix. Makes 'make check' work + properly in environments that set the suffixed variant for 1.0, such as + jhbuild. + +2013-01-15 15:06:41 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From a72faea to a942293 + +2012-12-30 23:56:14 +0000 Tim-Philipp Müller + + * configure.ac: + configure: replace deprecated AM_CONFIG_HEADER with AC_CONFIG_HEADERS + AM_CONFIG_HEADER has been removed in the just-released automake 1.13: + https://lists.gnu.org/archive/html/automake/2012-12/msg00038.html + https://bugzilla.gnome.org/show_bug.cgi?id=690881 + +2012-12-19 17:16:53 +0100 Thijs Vermeir + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: use appropriate printf format for gsize + +2012-12-19 17:15:03 +0100 Thijs Vermeir + + * ext/cdio/gstcdio.h: + cdio: Fix redundant redeclaration of 'cdio_version_string' + cdio/version.h is already included by cdio/cdio.h + +2012-12-01 13:26:26 +0100 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + siddec: init debug category + +2012-11-30 20:09:03 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/dvdread/Makefile.am: + dvdread: link to libgmodule-2.0 since the g_module_* API is used + And the gmodule lib has been moved into the Requires.private + section of the pkg-config file in core. + +2012-11-27 17:07:31 +0000 Tim-Philipp Müller + + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + cdiocddasrc: detect whether drive produces samples in non-host endianness + If drive produces samples in other endianness than the host, + we need to byte swap them before pushing them out, or we + produce nothing but noise. cdparanoia detects this automatically, + but libcdio does not, so we have to do it ourselves. + This is needed on e.g. the PowerBook G4 with Matshita UJ-816 drive. + https://bugzilla.gnome.org/show_bug.cgi?id=377280 + +2012-11-19 11:27:21 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From b497c4f to a72faea + +2012-11-16 13:32:00 +0100 Sebastian Dröge + + * tests/check/elements/xingmux_testdata.h: + xingmux: Fix unit test after change to correctly calculate number of frames + +2012-11-15 16:42:09 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Add support for 10-bit color formats + Requires x264 to be built with 10-bit support, which disables + 9-bit support. Also only advertise the color formats that were + compiled into x264. + +2012-11-15 16:21:49 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Add support for Y444, Y42B and NV12 + +2012-11-11 20:42:42 +0000 Tim-Philipp Müller + + * ext/cdio/Makefile.am: + * ext/cdio/gstcdio.c: + cdio: use gst_tag_freeform_string_to_utf8() for CD-TEXT strings + They're probably not going to be UTF-8, but ISO-8859-1 or somesuch + if they're not plain ASCII. + +2012-11-09 11:33:40 +0100 Gautier Portet + + * gst/xingmux/gstxingmux.c: + xingmux: Properly calculate the number of frames + First, the xing header frame is never added to the count, + we have to increment the count. + Secondly, there is a rounding error when calculating the + frame duration, as spf*GST_SECOND/rate is not an integer + (26122448.9) an it must be 26122449. + +2012-11-07 20:45:38 +0000 Tim-Philipp Müller + + * configure.ac: + configure.ac: update courtesy of autoupdate + +2012-11-07 20:39:56 +0000 Tim-Philipp Müller + + * common: + * configure.ac: + configure: let AG_GST_PLUGIN_DOCS check for python + And update common for move from AS_PATH_PYTHON to AM_PATH_PYTHON, + which as a side-effect should pick up newer python versions as + well. + https://bugzilla.gnome.org/show_bug.cgi?id=563903 + +2012-11-05 13:16:52 -0800 Michael Smith + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: Fix parsing of headers to set correct width to allow decode. + +2012-11-03 20:38:00 +0000 Tim-Philipp Müller + + * tests/check/elements/mpg123audiodec.c: + Fix FSF address + https://bugzilla.gnome.org/show_bug.cgi?id=687520 + +2012-11-03 20:40:37 +0000 Tim-Philipp Müller + + * docs/random/LICENSE: + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + * ext/amrnb/amrnb.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbenc.h: + * ext/amrwbdec/amrwb.c: + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + * ext/dvdread/dvdreadsrc.c: + * ext/dvdread/dvdreadsrc.h: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + * ext/lame/plugin.c: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + * ext/twolame/gsttwolamemp2enc.c: + * ext/twolame/gsttwolamemp2enc.h: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + * gst-libs/gst/gettext.h: + * gst-libs/gst/glib-compat-private.h: + * gst-libs/gst/gst-i18n-plugin.h: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + * gst/asfdemux/gstasf.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtpasfdepay.h: + * gst/asfdemux/gstrtspwms.c: + * gst/asfdemux/gstrtspwms.h: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + * gst/dvdsub/gstdvdsubparse.c: + * gst/dvdsub/gstdvdsubparse.h: + * gst/realmedia/asmrules.c: + * gst/realmedia/asmrules.h: + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/gstrdtbuffer.h: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/pnmsrc.h: + * gst/realmedia/rademux.c: + * gst/realmedia/rademux.h: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtdepay.h: + * gst/realmedia/rdtjitterbuffer.c: + * gst/realmedia/rdtjitterbuffer.h: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rdtmanager.h: + * gst/realmedia/realhash.c: + * gst/realmedia/realhash.h: + * gst/realmedia/realmedia.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + * gst/realmedia/rmutils.c: + * gst/realmedia/rmutils.h: + * gst/realmedia/rtspreal.c: + * gst/realmedia/rtspreal.h: + * gst/xingmux/gstxingmux.c: + * gst/xingmux/gstxingmux.h: + * gst/xingmux/plugin.c: + * tests/check/elements/amrnbenc.c: + * tests/check/elements/mpeg2dec.c: + * tests/check/elements/x264enc.c: + * tests/check/generic/index.c: + * tests/check/generic/states.c: + * tests/check/pipelines/lame.c: + Fix FSF address + https://bugzilla.gnome.org/show_bug.cgi?id=687520 + +2012-10-30 13:39:52 +0100 Andreas Frisch + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: allocate correct amount of memory for bitmap + https://bugzilla.gnome.org/show_bug.cgi?id=687192 + +2012-10-30 09:27:24 +0100 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: removed unnecessary finalize function + https://bugzilla.gnome.org/show_bug.cgi?id=687176 + +2012-10-30 09:20:04 +0000 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + siddec: reset bytes counter + Reset the total_bytes counter so that we get timestamps correct. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=686931 + +2012-10-30 10:20:09 +1100 Jan Schmidt + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: Fix leaks from not chaining up in the finalize function + +2012-10-25 12:38:47 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * win32/common/config.h: + Back to feature development + +=== release 1.0.2 === + +2012-10-25 01:11:10 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.0.2 + +2012-10-24 13:41:00 +0100 Tim-Philipp Müller + + * tests/check/elements/mpg123audiodec.c: + tests: fix up mpg123 test a little + - dist input files + - fix sample leak + - simplify check for elements + - only run mpg123 test if mpg123 is available and selected + - fix build in uninstalled setup + https://bugzilla.gnome.org/show_bug.cgi?id=686595 + +2012-10-24 12:30:10 +0200 Carlos Rafael Giani + + * tests/check/elements/mpg123audiodec.c: + tets: add unit test for mpg123audiodec + https://bugzilla.gnome.org/show_bug.cgi?id=686595 + +2012-10-24 00:36:42 +0200 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: added gtkdoc section + https://bugzilla.gnome.org/show_bug.cgi?id=686595 + +2012-10-24 00:22:05 +0200 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: fixed bug with last frame, disabled internal resampler & chatter + * The last MP3 frame wasn't being pushed when base class was draining + * Made sure mpg123 cannot ever use its (crude) internal resampler + * Disabled mpg123 stderr output + https://bugzilla.gnome.org/show_bug.cgi?id=686595 + +2012-10-24 20:10:03 +0800 Scott Fan + + * gst/asfdemux/Makefile.am: + * gst/realmedia/Makefile.am: + Makefile.am: Fix typos for generating the Android.mk files + Change libgstasfdemux to libgstasf, and change libgstrealmedia to libgstrmdemux. + The typos led to generate the incorrect Android.mk files for the asfdemux + and realmedia plugin. + https://bugzilla.gnome.org/show_bug.cgi?id=686748 + +2012-10-24 00:21:45 +0200 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: cleaned up comments, formatting, and logging lines + also replaced mpg123decoder->handle != NULL checks with asserts + https://bugzilla.gnome.org/show_bug.cgi?id=686595 + +2012-10-18 22:19:04 +0200 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: correctly set next cell when seeking to sector + +2012-10-18 22:18:28 +0200 Mark Nauwelaerts + + * gst/dvdsub/gstdvdsubparse.c: + dvdsubparse: send src caps when receiving sink caps + +2012-10-12 14:49:28 +0200 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: update dvd event to enhanced approach + ... in line with resindvdsrc. + +2012-10-07 17:08:37 +0100 Tim-Philipp Müller + + * docs/Makefile.am: + docs: add 'make upload' target for new-release script + +2012-10-07 16:58:10 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * win32/common/config.h: + Back to development (bug fixing) + +=== release 1.0.1 === + +2012-10-07 16:13:11 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.0.1 + +2012-10-06 14:58:34 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 6c0b52c to 6bb6951 + +2012-10-01 00:01:09 +1000 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Don't error out when there is no associated buffer + In 0.10, having mpeg2dec occasionally tell us to output a frame that + was never decoded was just ignored, so do the same in 1.0 + Fixes: #685107 + +2012-09-29 12:13:00 +0100 Tim-Philipp Müller + + * REQUIREMENTS: + * gst/dvdsub/gstdvdsubdec.c: + Purge mention of liboil and update REQUIREMENTS + https://bugzilla.gnome.org/show_bug.cgi?id=673285 + +2012-09-26 01:04:32 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: when setting fallback decoder latency, set valid min_latency + Min. latency needs to be a valid time, so pass 0 as default + value in the fallback case where we can't determine any latency, + and avoid nasty criticals at runtime. + +2012-09-24 16:52:23 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * win32/common/config.h: + Back to development (bug fixing) + +=== release 1.0.0 === + +2012-09-24 14:32:12 +0100 Tim-Philipp Müller + + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 1.0.0 + +2012-09-22 16:08:54 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 4f962f7 to 6c0b52c + +=== release 0.11.99 === + +2012-09-17 17:59:57 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-xingmux.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.99 + +2012-09-17 16:57:53 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + docs: update docs + +2012-09-17 16:57:30 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/lame/Makefile.am: + * ext/twolame/Makefile.am: + * tests/check/Makefile.am: + Remove -DGST_USE_UNSTABLE_API + +2012-09-17 12:22:51 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + Update docs + +2012-09-17 10:53:12 +0100 Tim-Philipp Müller + + * ext/cdio/gstcdio.c: + cdio: work around cdio headers re-defining VERSION and PACKAGE_VERSION + Thanks guys. Fixes plugin version in gst-inspect-1.0 and docs + introspection/updating for this plugin. + +2012-09-15 22:23:53 +0200 Christian Fredrik Kalager Schaller + + * gst-plugins-ugly.spec.in: + Switch to F18 package naming + +2012-09-14 16:28:54 +0200 Wim Taymans + + * ext/dvdread/demo-play: + * tests/check/elements/mpeg2dec.c: + rename some caps and elements in examples + +2012-09-14 02:58:26 +0100 Tim-Philipp Müller + + * configure.ac: + Back to development + +=== release 0.11.94 === + +2012-09-14 02:49:34 +0100 Tim-Philipp Müller + + * ChangeLog: + * configure.ac: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.94 + +2012-09-14 01:48:50 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + docs: update docs + +2012-09-13 13:49:33 +0200 Wim Taymans + + * gst/realmedia/rmdemux.c: + rmdemux: use DTS and PTS + Video uses DTS as timestamps. Set the DTS on the buffers and leave the PTS + undefined to make the decoder do the right thing. We can then remove the code + that tries to guess the PTS from the DTS. + +2012-09-10 22:30:18 -0700 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Hold ref to buffer while mapped + So that the buffer still exists when we go to unmap it later, + even if it got pushed in the meantime. + +2012-09-11 16:48:51 -0400 Olivier Crête + + * tests/check/elements/x264enc.c: + x264enc test: x264enc produces constrained-baseline, not the full baseline + +2012-09-11 17:37:03 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + gst: only activate in pull mode if upstream is seekable + +2012-09-11 11:28:06 +0200 Wim Taymans + + * gst/realmedia/rademux.c: + rademux: tags can be NULL + +2012-09-11 11:13:31 +0200 Wim Taymans + + * ext/mad/gstmad.c: + mad: fix email address + +2012-09-11 11:12:38 +0200 Wim Taymans + + * ext/mad/gstmad.c: + mad: init base class method only once + +2012-09-11 10:46:52 +0200 Mark Nauwelaerts + + * gst/xingmux/gstxingmux.c: + xingmux: remove defunct commented code + +2012-09-11 10:40:01 +0200 Mark Nauwelaerts + + * gst/dvdsub/gstdvdsubdec.c: + dvbsubdec: handle and send GAP event + ... in stead of update newsegment event. + +2012-09-11 10:34:40 +0200 Mark Nauwelaerts + + * gst/dvdsub/gstdvdsubdec.c: + dvbsubdec: adjust disabled code comment style + +2012-09-09 15:48:57 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: clean up some debug statements + +2012-09-07 17:38:18 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: handle possibly negative DTS provided by codec + ... by arranging for an offset such that DTS == PTS for keyframes, + which is expected elsewhere to go along with semantics of PTS and DTS. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=679443 + +2012-09-07 13:31:15 +0200 Christian Fredrik Kalager Schaller + + * gst-plugins-ugly.spec.in: + Fix spec file for ugly + +2012-09-06 14:42:51 +0200 Mark Nauwelaerts + + * tests/check/elements/mpeg2dec.c: + tests: mpeg2dec: initialize variable + ... which avoids test segfaulting. + +2012-08-30 16:26:00 -0700 Edward Hervey + + * tests/check/elements/mpeg2dec.c: + check: Feed parsed data to mpeg2dec + And fix the expected output caps by adding colorimetry field + +2012-08-22 13:31:00 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From 668acee to 4f962f7 + +2012-08-22 13:19:01 +0200 Stefan Sauer + + * configure.ac: + configure: bump gtk-doc req to 1.12 (mar-2009) + This allows us to e.g. unconditionally use gtkdoc-rebase. + +2012-08-20 23:32:32 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-dvdsub.xml: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + video/x-dvd-subpicture -> subpicture/x-dvd + +2012-08-09 16:30:10 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Use new video encoder base class API for handling tags + +2012-08-09 11:48:39 +0200 Sebastian Dröge + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: Give MARGINAL rank to the mpg123 decoder element + +2012-08-08 16:27:45 +0200 Sebastian Dröge + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Set alignment at the correct place of GstAllocationParams + +2012-08-08 16:26:41 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + Back to development + +=== release 0.11.93 === + +2012-08-08 15:23:53 +0100 Tim-Philipp Müller + + * configure.ac: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.93 + +2012-08-08 15:23:27 +0100 Tim-Philipp Müller + + * gst/asfdemux/asfpacket.c: + * gst/realmedia/rmdemux.c: + gst: silence some compiler warnings with -DG_DISABLE_ASSERT + +2012-08-08 12:58:50 +0100 Tim-Philipp Müller + + * ext/mpg123/Makefile.am: + mpg123: dist header file + +2012-08-06 15:31:50 +0300 Sreerenj Balachandran + + * gst/asfdemux/asfpacket.c: + asfdemux: avoid some more invalid timestamp arithmetic + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=681291 + +2012-08-05 18:30:52 +0200 Sebastian Dröge + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + gst: Add stream-id to stream-start events + +2012-07-27 11:35:52 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Don't use NULL values for fbuf + We need to make a difference between the initial dummy buffers (which + have a fbuf->id of NULL) and the buffers on which we allocated + video frames. + +2012-08-05 16:40:57 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 94ccf4c to 668acee + +2012-08-04 16:13:36 +0100 Tim-Philipp Müller + + * ext/a52dec/gsta52dec.c: + * ext/lame/gstlamemp3enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmutils.c: + gst_tag_list_free -> gst_tag_list_unref + +2012-08-03 13:43:31 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: map input buffer in READ mode, not WRITE mode + Makes things actually work. + +2012-08-03 11:50:10 +0100 Tim-Philipp Müller + + * ext/mpg123/gstmpg123audiodec.c: + mpg123: query supported output formats at run-time + Fixes stuff. We use a string here since we can't be bothered + with GValue. + +2012-08-03 11:48:02 +0100 Tim-Philipp Müller + + * ext/mpg123/Makefile.am: + mpg123: hook up to build system + +2012-08-03 11:13:48 +0100 Carlos Rafael Giani + + * ext/mpg123/gstmpg123audiodec.c: + * ext/mpg123/gstmpg123audiodec.h: + mpg123: add new libmpg123-based mp3 decoder plugin + Needs a bit of cleaning up. + https://bugzilla.gnome.org/show_bug.cgi?id=681003 + +2012-07-28 00:28:27 +0200 Sebastian Dröge + + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + tag: Update for taglist/tag event API changes + +2012-07-26 18:30:04 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Avoid dropping first GOP + We use the mpeg2_fbuf_t id field as an integer and not as a pointer, so + do not check if it is NULL or not. + And cleanup a bit of debug + +2012-07-25 13:05:17 +0200 Wim Taymans + + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rdtmanager.h: + rdt: add on-npt-stop signal + rtspsrc will look for it. + +2012-07-25 12:48:21 +0200 Wim Taymans + + * gst/realmedia/rdtmanager.c: + rdt: set caps after activating the pad + +2012-07-25 12:48:06 +0200 Wim Taymans + + * gst/realmedia/gstrdtbuffer.c: + rdt: reset map info + +2012-07-25 09:37:08 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: fix padding correction + Fix padding correction. gst_buffer_copy_into() appends the memory to the already + existing memory in the target buffer.. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=680536 + +2012-07-23 13:32:26 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: copy buffer flags when cropping + When we crop a buffer, copy the flags as well. + +2012-07-23 11:25:34 +0200 Robert Swain + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix GstVideoInfo pointer + +2012-07-23 11:13:05 +0200 Robert Swain + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Correctly flag output buffer interlaced state + If the sequence is not flagged as progressive its buffers are marked + interlace mode mixed. There is an individual picture flag indicating + whether picture in the sequence are interlaced or not. This is used + along with the new GST_VIDEO_BUFFER_FLAG_INTERLACED to correctly and + completely indicate the buffer's interlaced state. + Also, TFF and RFF should only be set if the sequence is not progressive. + +2012-07-23 10:33:33 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + ext: Update for video base classes API changes + +2012-07-23 08:45:55 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 98e386f to 94ccf4c + +2012-07-20 16:12:45 +0200 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + asfdemux: make sure to avoid arithmetic with _NONE timestamp + +2012-07-16 17:36:19 -0400 Nicolas Dufresne + + * gst/asfdemux/asfpacket.c: + asfdemux: convert invalid 0 payload TS into GST_CLOCK_TIME_NONE + ... so it does not get used as first (valid) payload ts, whereas + the first real valid payload ts may be considerably larger. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=679838 + +2012-07-20 14:41:57 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: slightly relax supported seek requirements + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=680279 + +2012-07-19 09:58:50 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Propagate GstFlowReturn where needed + It was just ignoring the return values... + +2012-07-19 09:56:17 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Store temporary buffers out of the way + When mpeg2dec needs to do cropping (because downstream can't handle it), + we need temporary buffers to decode to. + Use the user_data field to store those, and unify the rest of the code + that needs to touch a buffer (regardless of how/where it was allocated). + https://bugzilla.gnome.org/show_bug.cgi?id=680194 + +2012-07-18 18:32:54 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Call gst_video_decoder_negotiate() + +2012-07-18 17:21:27 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + rmdemux: give stream tags a different event name so they don't overwrite global tags + There can only be one taglist per name for sticky tag events. + Needs to be fixed more properly, see + https://bugzilla.gnome.org/show_bug.cgi?id=677619 + +2012-07-18 16:49:47 +0100 Tim-Philipp Müller + + * gst/realmedia/rademux.c: + rademux: set/send caps on pad after activating it + +2012-07-18 16:46:46 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + rmdemux: set/send caps after activating the source pads + Makes sure the caps event isn't dropped immediately. + +2012-07-17 20:54:45 +0100 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: mustn't drop queries like caps query if not started yet + +2012-07-15 20:12:46 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: extract WM/Year as GstDateTime instead of GDate + So we can signal that only the year field is valid. + +2012-07-13 15:41:05 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: don't leak payload if we are not pushing it + +2012-07-13 13:59:16 +0200 Edward Hervey + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + demuxers: Push STREAM_START when needed + +2012-07-13 11:36:40 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asf: don't push on inactive streams + +2012-07-12 18:05:10 +0100 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: set rank to NONE + It should never be autoplugged really, for DVD + playback there's rsndvd (or will be, realsoonnow). + +2012-07-09 16:27:25 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + fix for allocator API changes + +2012-07-06 11:50:55 +0200 Wim Taymans + + * ext/x264/gstx264enc.c: + update for query api changes + +2012-07-06 11:27:27 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + update for query api changes + +2012-07-06 11:03:19 +0200 Wim Taymans + + * ext/x264/gstx264enc.c: + update for allocation query changes + +2012-07-05 23:23:33 +0100 Tim-Philipp Müller + + * LICENSE_readme: + LICENSE_readme: fix typo + +2012-07-05 22:48:18 +0100 Tim-Philipp Müller + + * LICENSE_readme: + LICENSE_readme: mention x264 + https://bugzilla.gnome.org/show_bug.cgi?id=679472 + +2012-07-05 13:12:17 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + gst: Implement segment-done event + +2012-06-27 11:23:36 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asf: fix x-wmv format in caps + +2012-06-27 10:24:45 +0200 Wim Taymans + + * gst/asfdemux/asfpacket.c: + asf: unmap packets + +2012-06-21 15:13:57 +0100 Bastien Nocera + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + * gst/asfdemux/gstasfdemux.c: + asfdemux: Ignore parsing errors from broken packets + We should instead be counting the number of errors and exiting if + they're too numerous. This makes a number of broken ASF files playable. + https://bugzilla.gnome.org/show_bug.cgi?id=678543 + Conflicts: + gst/asfdemux/asfpacket.c + gst/asfdemux/gstasfdemux.c + +2012-06-26 17:15:43 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + fix interlace-mode + +2012-06-25 09:43:53 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Add comment explaining why we first chain up to the parent class' decide_allocation + +2012-06-25 09:34:53 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Set allocation parameters to guarantee 16-byte aligned output buffers + Fixes bug #377713. + +2012-06-20 13:36:25 -0400 Matej Knopp + + * ext/x264/gstx264enc.c: + x264enc: Fix unitialized variable and taglist event + +2012-06-20 13:23:51 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix compilation + +2012-06-20 10:39:37 +0200 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + update for task api change + +2012-06-20 10:39:24 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/x264/gstx264enc.c: + fix compilation + +2012-06-20 09:06:37 +0100 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Port to 0.11 again + +2012-06-19 15:19:28 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Fix compiler warning + +2012-05-30 12:50:13 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Report PAR if not present upstream + And clean up some code + +2012-05-04 16:09:57 -0400 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: use _scale_ceil to compute frame period + https://bugzilla.gnome.org/show_bug.cgi?id=675769 + +2012-05-04 16:08:27 -0400 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: mpeg2dec actually has 3 frame latency + https://bugzilla.gnome.org/show_bug.cgi?id=675769 + +2012-05-01 18:49:03 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix large output buffers leak + +2012-05-01 18:46:31 +0000 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Port to new way of handling frame reference + +2012-05-01 16:12:42 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: don't leak input_state + +2012-04-13 19:06:52 -0400 Nicolas Dufresne + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Port to GstVideoDecoder base class + Conflicts: + ext/mpeg2dec/gstmpeg2dec.c + ext/mpeg2dec/gstmpeg2dec.h + Back to 0.10 state, needs to be ported to 0.11 again. + +2012-06-19 09:26:46 +0100 Sebastian Dröge + + Merge remote-tracking branch 'origin/master' + +2012-06-19 09:26:02 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Port to 0.11 again + +2012-05-07 11:52:40 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Don't set latency while holding object lock + This reverts commit 30a0b50e9ca0d625e61f994d4f8acd022dcddf38. + https://bugzilla.gnome.org/show_bug.cgi?id=675762 + +2012-05-03 18:07:24 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Use video encoder stream lock to avoid deadlock + +2012-05-01 18:45:33 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Port to new way of passing frame reference + +2012-04-30 19:00:09 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Set default stream-format to avc as it's a better format + +2012-04-26 22:27:55 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Fix setting latency + Fixes setting latency when framerate is dynamic and round up the latency + to avoid rounding issues. + +2012-04-30 18:59:44 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: gst_video_encoder_get_frame() is now transfer full + +2012-04-26 17:31:45 +0000 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: don't leak output state + +2012-04-18 17:09:12 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Remove x264 backward compatibility support + +2012-04-18 16:13:57 -0400 Nicolas Dufresne + + * ext/x264/gstx264enc.c: + x264enc: Report latency base on x264 buffer size + +2012-04-17 15:44:24 -0400 Nicolas Dufresne + + * configure.ac: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Port to GstVideoEncoder baseclass + Conflicts: + configure.ac + ext/x264/gstx264enc.c + ext/x264/gstx264enc.h + Back to 0.10 state, needs to be ported to 0.11 again. + +2012-06-16 18:29:54 +0100 Tim-Philipp Müller + + * Android.mk: + * LICENSE_readme: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * gst/synaesthesia/.gitignore: + * gst/synaesthesia/Makefile.am: + * gst/synaesthesia/README: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/synaesthesia/gstsynaesthesia.h: + * gst/synaesthesia/synaescope.c: + * gst/synaesthesia/synaescope.h: + synaesthesia: remove experimental GPL-ed synaesthesia plugin + It never made it out of experimental, and there's a new + synaescope element in gst-plugins-bad that's hopefully + sufficiently similar. + https://bugzilla.gnome.org/show_bug.cgi?id=356882 + +2012-06-16 18:13:47 +0100 Tim-Philipp Müller + + * gst/mpegstream/.gitignore: + mpegstream: remove leftover hidden .gitignore file + +2012-06-08 15:55:28 +0200 Sebastian Dröge + + * gst/synaesthesia/gstsynaesthesia.c: + * tests/check/elements/amrnbenc.c: + * tests/check/elements/x264enc.c: + elements: Use gst_pad_set_caps() instead of manual event fiddling + +2012-06-08 15:05:22 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From 03a0e57 to 98e386f + +2012-06-07 16:28:45 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 0.11.92 === + +2012-06-07 16:28:32 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.92 + +2012-06-07 16:28:27 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2012-06-06 18:19:06 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From 1fab359 to 03a0e57 + +2012-06-06 13:03:04 +0200 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + update for tag event change + +2012-06-01 10:29:16 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From f1b5a96 to 1fab359 + +2012-05-31 13:08:49 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 92b7266 to f1b5a96 + +2012-05-30 12:45:49 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From ec1c4a8 to 92b7266 + +2012-05-30 11:24:04 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 3429ba6 to ec1c4a8 + +2012-05-26 23:41:02 +0100 Tim-Philipp Müller + + * gst/realmedia/rmutils.c: + realmedia: don't use GstStructure API on tag lists + +2012-05-21 14:57:44 +0200 Julien Isorce + + * ext/a52dec/gsta52dec.c: + a52dec: really prefer the original number (and position) of channels + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=676495 + +2012-05-24 12:32:25 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From dc70203 to 3429ba6 + +2012-05-17 21:12:18 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/x264/gstx264enc.c: + x264: bump x264 requirement to build 106 or later + Build 106 is from September 2010. + https://bugzilla.gnome.org/show_bug.cgi?id=676257 + +2012-04-15 23:39:48 +0400 Руслан Ижбулатов + + * ext/a52dec/gsta52dec.c: + * m4/a52.m4: + a52dec: adapt to work also with new liba52 + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674091 + +2012-05-17 12:40:05 +0200 Mark Nauwelaerts + + * ext/a52dec/gsta52dec.c: + a52dec: trigger renegotiation upon changed stream channels + Fixes #675451 + +2012-05-16 09:13:05 +0200 Sebastian Dröge + + * configure.ac: + configure: Require core/base 0.11.91 + +2012-01-13 18:18:33 -0500 Matej Knopp + + * .gitignore: + .gitignore: add visual studio IDE files and OS X .DS_Store files + https://bugzilla.gnome.org/show_bug.cgi?id=667899 + +2012-05-13 17:00:50 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 0.11.91 === + +2012-05-13 16:49:04 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.91 + +2012-05-13 16:48:57 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2012-05-13 16:45:50 +0200 Sebastian Dröge + + Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly + +2012-05-13 15:56:27 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From dc70203 to 3429ba6 + +2012-04-24 15:27:12 +0200 Sebastian Dröge + + * gst/asfdemux/asfpacket.c: + asfdemux: Use correct enum type + +2012-05-10 10:11:44 +0100 Vincent Penquerc'h + + * gst/asfdemux/gstasfdemux.c: + asfdemux: implement pull mode seek snap flags when an index is present + Also ensure we get a proper EOS when seeking past the end of the + file, or (when the snap after flag is set) between the last keyframe + and the end of the file. + +2012-05-03 23:50:30 +0100 Leon Merten Lohse + + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + cdio: compensate for libcdio's recent cd-text api changes + https://bugzilla.gnome.org/show_bug.cgi?id=675112 + Conflicts: + ext/cdio/gstcdiocddasrc.c + +2012-04-30 21:27:52 +0100 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + dvdread: fix build after recent include reshuffling in core + Need to include gmodule.h ourselves now. + +2012-04-19 12:22:08 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + video: Update for libgstvideo API changes + +2012-04-16 09:09:35 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6db25be to dc70203 + +2012-04-12 13:56:48 +0100 Tim-Philipp Müller + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + asfdemux: fix performance issue, especially with high-bitrate streams + Two things were suboptimal from a performance point of view: + a) consider a large media object such as a video keyframe, which + may be split up into multiple fragments. We would assemble + the media object as follows: + buf = join (join (join (frag1, frag2), frag3), frag4) + which causes many unnecessary memcpy()s, and malloc/free, + which could easily add up to a multiple of the actual object + size. To avoid this, we allocate a buffer of the size needed + from the start and copy fragments into that directly. + b) for every fragment to join, we would create a sub-buffer + before joining it (which would discard the sub-buffer again), + leading to unnecessary miniobject create/free churn. + Conflicts: + gst/asfdemux/asfpacket.c + gst/asfdemux/asfpacket.h + +2012-04-12 14:45:51 +0100 Tim-Philipp Müller + + * gst/asfdemux/asfpacket.c: + asfdemux: avoid unnecessary stream lookup + We have already retrieved the stream for that stream number and + made sure it's not NULL, so no need to do it again here; neither + the number nor the streams changed since the last time. + +2012-04-02 19:31:20 +0200 Alban Browaeys + + * ext/a52dec/gsta52dec.c: + a52dec: fix first_access bigger than 2 + gst_buffer_extract returns the number of bytes extracted, here 2 max. + Set size to the buffer size as was done in 0.10 to avoid first_access + error when it bypass 2. + https://bugzilla.gnome.org/show_bug.cgi?id=673434 + +2012-04-13 13:43:30 +0200 Sebastian Dröge + + * autogen.sh: + * configure.ac: + configure: Modernize autotools setup a bit + Also we now only create tar.bz2 and tar.xz tarballs. + +2012-04-13 13:37:32 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 464fe15 to 6db25be + +2012-04-12 11:19:12 +0200 Sebastian Dröge + + * configure.ac: + Back to development + +=== release 0.11.90 === + +2012-04-12 10:40:20 +0200 Sebastian Dröge + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.11.90 + +2012-04-12 10:39:13 +0200 Sebastian Dröge + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2012-04-10 00:48:47 +0100 Tim-Philipp Müller + + * ext/mad/gstmad.c.orig: + mad: remove .c.orig file + +2012-04-10 00:47:44 +0100 Tim-Philipp Müller + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/mad/gstmad.c.orig: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolamemp2enc.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtspwms.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rtspreal.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/xingmux/gstxingmux.c: + Use new gst_element_class_set_static_metadata() + +2012-04-05 18:43:17 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 7fda524 to 464fe15 + +2012-04-05 17:40:12 +0200 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnb.c: + * ext/amrwbdec/amrwb.c: + * ext/cdio/gstcdio.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/plugin.c: + * ext/mad/gstmad.c: + * ext/mad/gstmad.c.orig: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolamemp2enc.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasf.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/realmedia/realmedia.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/xingmux/plugin.c: + gst: Update for GST_PLUGIN_DEFINE() API changes + +2012-04-05 13:26:45 +0200 Sebastian Dröge + + * configure.ac: + configure: Update version to 0.11.89.1 + +2012-04-04 14:38:53 +0200 Sebastian Dröge + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/version.entities.in: + * ext/a52dec/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/cdio/Makefile.am: + * ext/lame/Makefile.am: + * ext/mad/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * ext/sidplay/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * gst-plugins-ugly.spec.in: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/realmedia/Makefile.am: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-plugins-ugly-uninstalled.pc.in: + * tests/check/Makefile.am: + gst: Update versioning + +2012-04-02 15:21:36 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: fix cropping + fix cropping in mpeg2dec + +2012-04-01 20:19:36 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: add crop metadata when buffer is still writable + +2012-03-30 18:13:42 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + update for buffer api change + +2012-03-30 11:52:48 +0200 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + * ext/mad/gstmad.c: + ext: Update for audio decoder API changes + +2012-03-29 17:32:08 +0200 Mark Nauwelaerts + + * tests/check/elements/amrnbenc.c: + * tests/check/elements/x264enc.c: + tests: make more valgrind-friendly and plug caps leak + +2012-03-28 12:50:09 +0200 Wim Taymans + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdsub/gstdvdsubdec.c: + update for buffer changes + +2012-03-27 14:07:40 +0200 Mark Nauwelaerts + + * tests/check/elements/x264enc.c: + tests: x264enc: adjust test to removal of deprecated properties + +2012-03-26 12:13:30 +0200 Wim Taymans + + Replace master with 0.11 + +2012-03-22 15:56:04 +0100 Wim Taymans + + * configure.ac: + back to development + +=== release 0.11.2 === + +2012-03-22 15:52:55 +0100 Wim Taymans + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + Release 0.11.2 + +2012-03-21 13:18:35 +0100 Wim Taymans + + * tests/check/elements/mpeg2dec.c: + tests: fix after memory changes + +2012-03-21 13:18:11 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: remove deprecated properties + +2012-03-20 12:08:23 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + So 0.11 folks also get amr include fixes. + Conflicts: + ext/a52dec/gsta52dec.c + ext/mad/gstmad.c + +2012-03-18 18:56:16 +0100 Mark Nauwelaerts + + * gst/synaesthesia/gstsynaesthesia.c: + synaesthesia: fixup for bufferpool api changes + ... as well as some caps ref handling. + +2012-03-16 21:48:02 +0100 Wim Taymans + + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + don't pass random pointers to pull_range + +2012-03-15 22:11:41 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + update for bufferpool changes + +2012-03-15 20:38:50 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + update for allocation query changes + +2012-03-15 13:38:16 +0100 Wim Taymans + + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/x264/gstx264enc.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + update for memory api changes + +2012-03-14 19:52:52 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + take padding into account + +2012-03-13 18:27:51 +0100 Mark Nauwelaerts + + * ext/mad/gstmad.c: + mad: simplify parsing code + Also fixes #671455 (expected at least). + +2012-03-12 16:16:17 +0100 Wim Taymans + + * configure.ac: + configure.ac: bump required GLib to 2.31.14 + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=671911 + +2012-03-12 12:23:43 +0100 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + fix for caps _normalize changes + +2012-03-11 19:07:19 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + fix for caps api changes + +2012-03-06 16:08:23 +0100 Mark Nauwelaerts + + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + a52dec: use base class tag handling helper + ... so as to ensure these to be handled and sent at proper time. + +2012-03-06 14:28:15 +0100 Sebastian Dröge + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: Use variable type with correct signedness + +2011-01-14 18:50:41 +0100 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Copy planes in one go when possible + +2012-03-03 17:17:31 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.h: + * ext/amrwbdec/amrwbdec.h: + amrnb, amrwbdec: fix build with opencore-amr >= 0.1.3 + In previous versions, the opencore-amr include sub-directory + would be specified in the include path in the CFLAGS, but this + is no longer the case in newer versions, so we need to add those + to our include directives. + Based on patch by: Christian Morales Vega + https://bugzilla.gnome.org/show_bug.cgi?id=671123 + +2012-03-03 16:56:13 +0000 Tim-Philipp Müller + + * configure.ac: + configure: get rid of non-pkg-config ways to check for opencore-amr + +2012-02-29 17:26:42 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + update for metadata API changes + +2012-02-27 06:35:01 +0100 Alessandro Decina + + * ext/amrwbdec/Makefile.am: + * ext/lame/Makefile.am: + * ext/mad/Makefile.am: + amrwbdec, lame, mad: link to libgstbase + +2012-02-27 06:33:48 +0100 Alessandro Decina + + * ext/x264/gstx264enc.c: + x264enc: fix compiler warning + +2012-02-27 00:36:46 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + +2012-02-27 00:34:09 +0000 Tim-Philipp Müller + + Merge commit '02f5d72a0519bcbe8f6958fab6dd998fc8ccda6b' into 0.11 + Conflicts: + ext/mad/gstmad.c + +2012-02-23 11:20:33 +0000 Tim-Philipp Müller + + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Bump version after release + +2012-02-21 18:58:06 -0800 David Schleef + + * autogen.sh: + autogen.sh: avoid touching .po files during 'make' + A simple workaround to deal with GNU gettext automake integration + failing to deal with git. Fixes: #669207 + +2012-02-22 02:17:55 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + x264: convert g_print to LOG + +2012-02-22 02:07:49 +0100 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + update for new memory api + +2012-02-22 02:07:29 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + x264enc: handle pts and dts + +2012-02-21 18:53:57 +0100 Mark Nauwelaerts + + * ext/mad/gstmad.c: + mad: handle libmad freeform parsing quirk + +2012-02-21 18:49:50 +0100 Mark Nauwelaerts + + * ext/mad/gstmad.c: + mad: fixup unhacking last frame coaxing + ... so as to not only replace the data pointer but also available size. + +2012-02-20 14:27:49 +0000 Christian Fredrik Kalager Schaller + + * gst-plugins-ugly.spec.in: + Add latest plugins + +2012-02-18 00:02:20 +0100 Wim Taymans + + * win32/common/config.h: + win32: back to development + +2012-02-17 17:53:34 +0100 Mark Nauwelaerts + + * configure.ac: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/synaesthesia/gstsynaesthesia.h: + synaesthesia: port to 0.11 + +2012-02-17 17:53:28 +0100 Mark Nauwelaerts + + * configure.ac: + * gst/xingmux/gstxingmux.c: + xingmux: port to 0.11 + +2012-02-17 11:06:59 +0100 Wim Taymans + + * configure.ac: + back to development + +=== release 0.11.1 === + +2012-02-17 11:06:27 +0100 Wim Taymans + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + RELEASE 0.11.1 + +2012-02-17 09:16:32 +0100 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/mad/gstmad.c + +2012-02-16 14:29:47 +0100 Mark Nauwelaerts + + * ext/mad/gstmad.c: + mad: unhack last frame coaxing + ... so as to maximally use available base class API and interfere least + as possible with its internal state. + +2012-02-15 13:45:00 +0100 Wim Taymans + + * ext/mad/gstmad.c: + mad: fix compilation + +2012-02-15 13:40:13 +0100 Wim Taymans + + * ext/mad/gstmad.c: + mad: chain up to default event handler + +2012-02-11 05:38:41 -0500 Matej Knopp + + * ext/x264/gstx264enc.c: + x264enc: unmap video frame after encoding + Fixes major memory leak. + https://bugzilla.gnome.org/show_bug.cgi?id=669863 + +2012-02-10 17:02:38 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + x264enc: fix after merge + +2012-02-10 17:00:33 +0100 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/x264/gstx264enc.c + +2012-02-09 18:10:48 +0100 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + sidplay: don't use ulong properties + +2012-02-09 16:14:55 +0100 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + sidplay: fix negotiation + +2012-02-09 11:55:07 +0100 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Add baseline profile to caps + libx264 does not yet support the features that create the difference + between baseline and constrained baseline profile. Hence it currently + supports both though it can only technically encode constrained + baseline. + +2012-02-08 16:38:09 +0100 Wim Taymans + + * ext/amrnb/amrnbenc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rdtmanager.c: + GST_FLOW_WRONG_STATE -> GST_FLOW_FLUSHING + +2012-02-07 18:56:23 +0100 Wim Taymans + + * tests/check/elements/mpeg2dec.c: + mpeg2dec: fix test a bit more + Still broken because cropping is broken in mpeg2dec + +2012-02-07 11:06:29 +0100 Wim Taymans + + * tests/check/elements/amrnbenc.c: + * tests/check/elements/x264enc.c: + * tests/check/elements/xingmux.c: + tests: fix some tests + +2012-02-01 16:20:46 +0100 Sebastian Dröge + + * ext/twolame/gsttwolamemp2enc.c: + twolame: Use new audio encoder/decoder base class API for srcpad caps + +2012-02-01 16:20:26 +0100 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lame: Use new audio encoder/decoder base class API for srcpad caps + +2012-02-01 16:19:55 +0100 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: Use new audio encoder/decoder base class API for srcpad caps + +2012-02-01 16:17:57 +0100 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Use new audio encoder/decoder base class API for srcpad caps + +2012-02-01 16:15:27 +0100 Sebastian Dröge + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: Use new audio encoder/decoder base class API for srcpad caps + +2012-02-01 16:14:08 +0100 Sebastian Dröge + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + amrnb: Use new audio encoder/decoder base class API for srcpad caps + +2012-01-31 15:52:38 +0000 Vincent Penquerc'h + + * ext/mad/gstmad.c: + mad: ensure we do not confuse the base class with our buffer guard + mad expects extra bytes at the end of a buffer (see discussion in + http://www.mars.org/mailman/public/mad-dev/2001-May/000262.html), + and since we inject these without the base class' knowledge, we + need to hide the bodies better. + This fixes an assert at EOS when decoding an mp3 manually without + an intervening mpegaudioparse. + +2012-01-30 17:17:31 +0100 Wim Taymans + + * gst/realmedia/rtspreal.c: + update for HEADER flag + +2011-07-20 09:00:58 +0200 Alessandro Decina + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: implement force-key-unit API + +2012-01-25 13:58:48 +0100 Thomas Vander Stichele + + * common: + Automatic update of common submodule + From c463bc0 to 7fda524 + +2012-01-25 13:58:54 +0100 Wim Taymans + + * ext/amrnb/amrnbdec.c: + * ext/amrwbdec/amrwbdec.c: + amr: port to 0.11 again + +2012-01-25 13:03:33 +0100 Sebastian Dröge + + Merge branch 'master' into 0.11 + Conflicts: + ext/a52dec/gsta52dec.c + +2012-01-25 07:24:59 +0100 Wim Taymans + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolamemp2enc.c: + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/gstrdtbuffer.h: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmutils.c: + port to new memory API + +2012-01-25 11:38:56 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 2a59016 to c463bc0 + +2012-01-22 23:56:07 +0000 Tim-Philipp Müller + + * gst-libs/gst/glib-compat-private.h: + Remove compatibility versions for deprecated GLib API + +2012-01-19 15:26:25 +0000 Vincent Penquerc'h + + * ext/a52dec/gsta52dec.c: + a52dec: fix read buffer overflow upon syncing + The wrong size was being decremented, leading to a runaway + read loop. + +2012-01-19 15:06:47 +0000 Tim-Philipp Müller + + * common: + * configure.ac: + Add --disable-fatal-warnings configure option + +2012-01-19 11:34:41 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + port to new gthread API + +2012-01-18 17:00:26 +0100 Sebastian Dröge + + * configure.ac: + configure.ac: Require GLib 2.31.10 for consistency + +2012-01-18 16:46:42 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 0807187 to 2a59016 + +2012-01-17 11:55:59 +0100 Mark Nauwelaerts + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: _parse should not return OK if not enough data yet + +2012-01-17 11:55:14 +0100 Mark Nauwelaerts + + * ext/amrnb/amrnbdec.c: + amrnbdec: _parse should not return OK if not enough data yet + +2012-01-13 15:03:50 +0000 Vincent Penquerc'h + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: fix off by one in cell calculation for the last chapter + +2012-01-13 15:56:47 +0100 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: set caps on src pad before adding it + +2012-01-13 15:56:25 +0100 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: perform writable buffer map to copy into it + +2012-01-13 15:55:15 +0100 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + asfpacket: fix 0.11 ported payload extraction + ... to cater for not necessarily offset == size - cur_pos, + as size may have been adjusted due to padding. + Fixes #667567. + +2012-01-13 13:46:50 +0000 Vincent Penquerc'h + + * ext/x264/gstx264enc.c: + x264enc: remove useless and semantically (though not practically) wrong code + The object will be freed, so it's pointless to set the pointers + to NULL anyway. + +2012-01-13 13:46:28 +0000 Vincent Penquerc'h + + * ext/x264/gstx264enc.c: + x264enc: remove leaking "optimization" + +2012-01-13 00:05:50 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + GST_TYPE_DATE -> G_TYPE_DATE + +2012-01-13 00:01:01 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + Conflicts: + ext/a52dec/gsta52dec.c + +2012-01-12 13:25:22 +0100 Mark Nauwelaerts + + * ext/a52dec/gsta52dec.c: + a52dec: plug buffer leak + +2012-01-12 13:20:26 +0100 Mark Nauwelaerts + + * ext/a52dec/gsta52dec.c: + a52dec: plug buffer leak + +2012-01-11 12:31:11 +0100 Mark Nauwelaerts + + * ext/amrnb/amrnbenc.c: + amrnbenc: _map and _unmap the appropriate input and output buffers + +2012-01-10 15:25:12 +0100 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Fix some merge mistakes + +2012-01-10 15:17:11 +0100 Sebastian Dröge + + Merge branch 'master' into 0.11 + Conflicts: + ext/a52dec/gsta52dec.c + ext/a52dec/gsta52dec.h + ext/lame/gstlame.c + ext/lame/gstlame.h + ext/lame/gstlamemp3enc.c + ext/mad/gstmad.c + ext/mad/gstmad.h + gst/mpegaudioparse/gstmpegaudioparse.c + gst/mpegstream/gstdvddemux.c + gst/realmedia/rdtdepay.c + po/es.po + po/lv.po + po/sr.po + +2012-01-10 11:41:52 +0100 Mark Nauwelaerts + + * gst/dvdsub/Makefile.am: + dvdsub: add some CFLAGS and LIBS in Makefile.am + ... since adapter is still used. + +2012-01-09 16:00:18 +0100 Sebastian Dröge + + * gst/realmedia/rmdemux.c: + rmdemux: Don't use buffer after unreffing + +2012-01-09 15:46:10 +0100 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Only change writable caps and make sure to set updated caps on the srcpad + +2012-01-09 15:24:53 +0100 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: Correctly unmap the buffer with the original data pointer + +2012-01-09 15:15:28 +0100 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: Make sure to set caps on the srcpad if none are set yet + +2012-01-08 14:24:11 +0000 Tim-Philipp Müller + + * ext/mad/Makefile.am: + mad: fix LIBS order in Makefile.am + +2012-01-07 21:04:01 +0000 Tim-Philipp Müller + + * ext/mad/gstmad.h: + mad: remove left-over id3tag.h include + We don't use libid3tag any more. + +2012-01-05 12:17:20 +0100 Wim Taymans + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: fix for multichannel + +2012-01-04 16:05:59 +0100 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + a52dec: Update for the new raw audio caps + +2012-01-04 15:49:38 +0100 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: Update for the new raw audio caps + +2012-01-04 15:45:43 +0100 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Update for the new raw audio caps + +2012-01-04 15:44:37 +0100 Sebastian Dröge + + * ext/twolame/gsttwolamemp2enc.c: + twolamemp2enc: Update for the new raw audio caps + +2012-01-04 15:43:13 +0100 Sebastian Dröge + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: Add the new layout field to the raw audio caps + +2012-01-04 15:42:29 +0100 Sebastian Dröge + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + amrnb: Add the new layout field to the raw audio caps + +2012-01-04 15:26:56 +0100 Sebastian Dröge + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: Port to the new raw audio caps + +2012-01-04 15:12:26 +0100 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Update for libgstriff API changes + Still needs to handle audio channel reordering. + +2012-01-04 19:53:13 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 50b34ab to 0807187 + +2012-01-04 17:05:32 +0000 Tim-Philipp Müller + + * ext/lame/Makefile.am: + lame: fix LIBADD order in Makefile.am + +2012-01-04 10:33:27 +0100 Wim Taymans + + * tests/check/elements/amrnbenc.c: + * tests/check/elements/mpeg2dec.c: + * tests/check/elements/x264enc.c: + * tests/check/elements/xingmux.c: + * tests/check/generic/states.c: + tests: make tests compile + +2012-01-03 15:27:42 +0100 Wim Taymans + + * ext/amrwbdec/amrwbdec.c: + * ext/dvdread/dvdreadsrc.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + GST_FLOW_UNEXPECTED -> GST_FLOW_EOS + +2011-12-30 18:31:32 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: disable generic index test + +2011-12-30 17:53:12 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: remove all seeking-related code + A parser or demuxer upstream should handle this Same for + queries. + +2011-12-30 17:49:01 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: update for GstIndex removal + +2011-12-30 17:46:06 +0000 Tim-Philipp Müller + + * ext/cdio/gstcdiocddasrc.c: + cdio: update for probe vfunc removal in GstAudioCdSrc + +2011-12-27 22:54:34 +0000 Tim-Philipp Müller + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: fix printf format in debug statements + https://bugzilla.gnome.org/show_bug.cgi?id=666926 + +2011-12-26 18:24:32 +0100 Mark Nauwelaerts + + * ext/lame/gstlame.c: + * ext/lame/gstlame.h: + lame: ensure parsed output + ... by doing some basic parsing of encoded lame data. + +2011-12-26 16:34:01 +0100 Mark Nauwelaerts + + * ext/lame/gstlame.h: + lame: cleanup unused instance struct fields + +2011-12-26 18:23:52 +0100 Mark Nauwelaerts + + * ext/lame/Makefile.am: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + lamemp3enc: ensure parsed output + ... by doing some basic parsing of encoded lame data. + Fixes #652150. + +2011-12-26 18:15:41 +0100 Mark Nauwelaerts + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: do not leak merged tags + +2011-12-22 15:23:54 +0000 Vincent Penquerc'h + + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: helpfully bodge the last buffer to let mad decode the last frame + If http://www.mars.org/mailman/public/mad-dev/2001-May/000262.html is + to be believed, the last buffer must be followed by a number of 0 bytes + in order for the last frame to be decoded (at least in some cases). + Doing so seems to work here, fixing a missing 1152 samples when using + mp3parse before mad (not using mp3parse would yield the correct amount + of samples, if there's extra non-MP3 data after (eg, tag data)). + +2009-01-25 22:49:11 +0100 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: map subtitle language tag to stream indicated in PGC data + +2009-01-25 22:49:11 +0100 Mark Nauwelaerts + + * gst/mpegstream/gstdvddemux.c: + dvddemux: tweak subtitle stream setup based on dvd language codes event + ... to allow for non-continuous subtitle stream numbers. + The missing stream numbers tend to come up as subtitle streams anyway + (albeit not with an identified language tag). + +2011-12-21 13:56:35 +0100 Mark Nauwelaerts + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: minor safety tweak to sector seeking + +2011-12-20 11:54:38 +0100 Julien Isorce + + * ext/a52dec/gsta52dec.c: + a52dec: check that a52_init returns a valid a52 state + +2011-12-19 18:20:56 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: update for new interlaced flags + +2011-12-14 17:33:52 +0100 Mark Nauwelaerts + + * ext/a52dec/Makefile.am: + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + a52dec: port to audiodecoder + +2011-12-12 13:44:12 +0100 Mark Nauwelaerts + + * ext/mad/Makefile.am: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: port to audiodecoder + +2011-12-13 14:54:18 +0100 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Don't claim to support upstream renegotiation + and use fixed caps on the srcpad. To correctly support + upstream renegotiation a52dec would need to check if the + caps of the downstream allocated buffer are the requested + caps or if the size is different. + Fixes bug #665989. + +2011-12-13 14:52:26 +0100 Julien Isorce + + * ext/a52dec/gsta52dec.c: + a52dec: Check that the a52_state is correctly initialized + +2011-12-12 11:33:31 +0000 Tim-Philipp Müller + + * gst-libs/gst/Makefile.am: + * gst-libs/gst/glib-compat-private.h: + * gst/asfdemux/gstasfdemux.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + Work around deprecated thread API in glib master + Add private replacements for deprecated functions such as + g_mutex_new(), g_mutex_free(), g_cond_new() etc., mostly + to avoid the deprecation warnings. We can't change most of + these in 0.10 because they're part of our API and ABI. + Suppress deprecation warnings in selected files, mostly for + g_static_rec_mutex_*. StaticRecMutex is part of our API/ABI, + not much we can do here in 0.10. + +2011-12-10 15:19:03 +0000 Tim-Philipp Müller + + * po/LINGUAS: + * po/eo.po: + * po/es.po: + * po/lv.po: + * po/sr.po: + po: update translations + +2011-12-09 15:25:21 +0000 Tim-Philipp Müller + + * gst/realmedia/rdtdepay.c: + rdtdepay: make buffer metadata writable before setting caps on it + Fixes issue when the header buffer is being pushed, which was taken + from the caps and is therefore not writable. + +2011-12-06 14:00:18 +0100 Wim Taymans + + * ext/dvdread/dvdreadsrc.c: + fix for basesrc changes + +2011-12-05 18:43:49 +0100 Edward Hervey + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: Initialize GstRTPBuffer before usage + +2011-12-02 02:01:06 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + Conflicts: + ext/dvdread/dvdreadsrc.c + +2011-11-29 08:49:23 +0100 Руслан Ижбулатов + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: Fix format string compiler warning + Fixes bug #665101. + +2011-11-28 21:31:25 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + +2011-11-28 18:26:34 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + Update for indexable change + +2011-11-28 17:52:52 +0100 Wim Taymans + + * gst/realmedia/rdtmanager.c: + update for clock provider API change + +2011-11-28 13:10:01 +0000 Vincent Penquerc'h + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/twolame/gsttwolame.c: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/iec958/ac3iec.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstxingmux.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + * gst/synaesthesia/gstsynaesthesia.c: + various: fix pad template ref leaks + https://bugzilla.gnome.org/show_bug.cgi?id=662664 + +2011-11-24 21:41:55 +0100 René Stadler + + * tests/check/elements/xingmux.c: + tests: update for gstcheck API change + +2011-11-23 23:29:03 +0000 Tim-Philipp Müller + + * ext/amrnb/amrnbenc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlamemp3enc.c: + * ext/twolame/gsttwolamemp2enc.c: + ext: fix more printf format warnings in debug messages + +2011-11-21 22:02:07 +0100 Matej Knopp + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + Fix print format compiler warnings on OS X / 64bit + https://bugzilla.gnome.org/show_bug.cgi?id=662617 + +2011-11-21 13:36:10 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + update for activation changes + +2011-11-18 18:00:28 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + update for new scheduling query + +2011-11-18 13:59:29 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + add parent to activate functions + +2011-11-17 15:25:58 +0100 Wim Taymans + + * ext/a52dec/gsta52dec.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + add parent to pad functions + +2011-11-16 17:28:56 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + add parent to query function + +2011-11-15 17:55:36 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rademux.c: + _query_peer_*() -> _peer_query_*() + +2011-11-15 17:42:32 +0100 Wim Taymans + + * gst/dvdsub/gstdvdsubdec.c: + _accept_caps() -> _query_accept_caps() + +2011-11-15 17:23:39 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + _peer_get_caps() -> _peer_query_caps() + +2011-11-15 16:52:55 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + update for _get_caps() -> _query_caps() + +2011-11-15 16:34:39 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + change getcaps to query + +2011-11-14 00:55:16 +0000 Tim-Philipp Müller + + * ext/mad/gstmad.c: + mad: re-instate accidentally dropped rank + +2011-11-13 23:47:46 +0000 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + * gst/realmedia/pnmsrc.c: + Update for GstURIHandler get_protocols() changes + +2011-11-13 19:01:31 +0000 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + * ext/dvdread/dvdreadsrc.h: + * gst/realmedia/pnmsrc.c: + dvdreadsrc, pnmsrc: update for GstURIHandler changes + +2011-11-13 01:33:25 +0000 Tim-Philipp Müller + + * ext/mad/gstmad.c: + mad: re-port to 0.11 + This time using the base class. Still something + wrong with the parsing though, when there's no + parser or demuxer upstream (which of course + shouldn't happen in a normal playback scenario). + +2011-11-13 00:29:20 +0000 Tim-Philipp Müller + + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: update for GstBaseAudioDecoder -> GstAudioDecoder rename + +2011-08-16 21:12:06 +0200 Mark Nauwelaerts + + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: replace with 0.10 version ported to GstAudioDecoder + Taken from commit 6e7e3657396454fe95fbd89170281865d4d1cec3 + of Mark's baseaudio branch. + Would probably be too risky to drop this into 0.10 given + all the things mad is doing. + +2011-11-13 00:13:17 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + docs: remove bits for old lame element from sections.txt file + +2011-11-13 00:04:07 +0000 Tim-Philipp Müller + + * Android.mk: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * gst-plugins-ugly.spec.in: + * gst/mpegstream/Makefile.am: + * gst/mpegstream/README: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegclock.c: + * gst/mpegstream/gstmpegclock.h: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegpacketize.c: + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstmpegstream.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/mpegstream/gstrfc2250enc.h: + * gst/mpegstream/mpegstream.vcproj: + * gst/mpegstream/notes: + * win32/MANIFEST: + * win32/vs6/gst_plugins_ugly.dsw: + * win32/vs6/libgstac3parse.dsp: + * win32/vs6/libgstmpegaudioparse.dsp: + * win32/vs6/libgstmpegstream.dsp: + mpegstream: remove the old mpeg-ps parser and demuxers + Don't want anyone porting this by accident. + Superseded by mpegpsdemux in -bad. + +2011-11-12 21:06:29 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/cdio/Makefile.am: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + cdio: port cdiocddasrc to 0.11 + +2011-11-12 20:44:23 +0000 Tim-Philipp Müller + + * tests/check/elements/mpeg2dec.c: + tests: port mpeg2dec to 0.11 + It compiles, but fails. + +2011-11-12 20:33:03 +0000 Tim-Philipp Müller + + * tests/check/elements/x264enc.c: + tests: port x264enc unit test to 0.11 + Well, it compiles now at least. + +2011-11-11 12:33:51 +0100 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.h: + update for base class rename + +2011-11-11 12:25:25 +0100 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtpasfdepay.h: + update for base class rename + +2011-11-11 01:30:11 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + po: update translations + +2011-11-11 01:29:33 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + docs: update docs + +2011-11-11 01:27:47 +0000 Tim-Philipp Müller + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: cosmetic error message change + LET'S TRY TO KEEP CAPITALS TO A MINIMUM. + +2011-11-11 00:58:24 +0000 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * ext/twolame/Makefile.am: + * ext/twolame/gsttwolamemp2enc.c: + * ext/twolame/gsttwolamemp2enc.h: + * po/POTFILES.in: + twolame: rename to twolamemp2enc + +2011-11-11 00:51:34 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/twolame/gsttwolame.c: + twolame: port to 0.11 + +2011-11-10 23:17:53 +0000 Tim-Philipp Müller + + * Android.mk: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/inspect/plugin-iec958.xml: + * gst-plugins-ugly.spec.in: + * gst/iec958/Makefile.am: + * gst/iec958/ac3_padder.c: + * gst/iec958/ac3_padder.h: + * gst/iec958/ac3iec.c: + * gst/iec958/ac3iec.h: + * win32/MANIFEST: + * win32/vs6/libgstiec958.dsp: + iec958: remove this plugin + I think it can just go away. Audio sinks can and should payload + things themselves using the helper API in libgstaudio. If such + a plugin still makes sense, it should probably be rewritten + using the library functions (and be put into -good or so). + +2011-11-10 18:25:38 +0100 Wim Taymans + + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rtspreal.c: + update for adapter api change + +2011-11-10 11:04:06 +0100 Wim Taymans + + * ext/x264/gstx264enc.c: + update for removed fixate function + +2011-11-09 11:58:03 +0100 Wim Taymans + + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rmdemux.c: + remove query types + +2011-11-04 17:32:58 +0100 Wim Taymans + + * configure.ac: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmutils.c: + realmedia is ported + +2011-11-04 16:40:59 +0100 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + more template fixes + +2011-11-04 16:32:48 +0100 Edward Hervey + + * po/POTFILES.in: + po: lame => lamemp3enc + +2011-11-04 12:04:56 +0100 Wim Taymans + + * gst/realmedia/rdtmanager.c: + make request pads take %u + +2011-11-04 10:45:47 +0100 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Add basic cropping support + +2011-11-02 12:09:45 +0100 Wim Taymans + + * ext/a52dec/gsta52dec.c: + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + tags: update for tag API removal + +2011-10-31 02:24:30 +0100 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + update for meta api change + +2011-10-29 09:10:54 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + structure: fix for api update + +2011-10-31 14:34:57 +0000 Tim-Philipp Müller + + Merge remote-tracking branch 'origin/master' into 0.11 + +2011-10-30 15:05:56 +0000 Tim-Philipp Müller + + * tests/check/elements/amrnbenc.c: + tests: port amrnbenc test to 0.11 + +2011-10-30 15:04:22 +0000 Tim-Philipp Müller + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + amrnb: fix up raw audio caps for 0.11 + +2011-10-30 15:03:29 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: need to define GST_USE_UNSTABLE_API to avoid warnings + +2011-10-30 12:29:14 +0000 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * ext/lame/Makefile.am: + * ext/lame/README: + * ext/lame/gstlame.c: + * ext/lame/gstlame.h: + * ext/lame/plugin.c: + * ext/lame/test-lame.c: + * gst/xingmux/gstxingmux.c: + * tests/check/pipelines/lame.c: + lame: remove lame element, it's been superseded by lamemp3enc + +2011-10-30 11:51:58 +0000 Tim-Philipp Müller + + * ext/a52dec/gsta52dec.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + ext, gst: update for taglist API changes + +2011-10-29 11:57:40 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't leak pending payload buffers + Fixes #662964 + +2011-10-28 15:21:27 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/sidplay/gstsiddec.cc + +2011-10-27 16:53:44 +0200 Stefan Sauer + + * ext/sidplay/gstsiddec.cc: + siddec: use BOILERPLATE macro and cleanup FIXMEs + +2011-10-28 09:18:04 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: fix compiler warnings after gst_caps_new_simple() change + +2011-10-21 12:24:01 +0100 Christian Fredrik Kalager Schaller + + * gst-plugins-ugly.spec.in: + Update specfile with latest changes + +2011-10-11 18:03:01 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't unmap a buffer that doesn't exist + +2011-10-10 12:38:02 +0200 Wim Taymans + + * configure.ac: + * ext/dvdread/dvdreadsrc.c: + dvdread: port to 0.11 + +2011-10-06 17:24:22 +0200 Wim Taymans + + * configure.ac: + * gst/dvdsub/Makefile.am: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + * gst/dvdsub/gstdvdsubparse.c: + dvdsub: port to 0.11 + +2011-10-05 13:32:33 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/amrwbdec/Makefile.am + ext/amrwbdec/amrwbdec.c + +2011-10-05 13:18:45 +0200 Wim Taymans + + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/gstrdtbuffer.h: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmutils.c: + * gst/realmedia/rtspreal.c: + realmedia: port to 0.11 + +2011-10-05 12:05:34 +0200 Mark Nauwelaerts + + * ext/amrwbdec/Makefile.am: + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + amrwbdec: port to audiodecoder + +2011-10-04 17:00:57 +0200 Mark Nauwelaerts + + * ext/amrnb/Makefile.am: + amrnbdec: fixup build + +2011-10-04 17:00:41 +0200 Mark Nauwelaerts + + * ext/amrnb/amrnbdec.c: + amrnbdec: remove leftover extraneous _unref + +2011-10-04 17:50:33 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/amrnb/amrnbdec.c + +2011-10-04 17:35:40 +0200 Wim Taymans + + * configure.ac: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + amrnb: port to 0.11 + +2011-10-04 17:12:35 +0200 Wim Taymans + + * configure.ac: + * ext/amrwbdec/Makefile.am: + * ext/amrwbdec/amrwbdec.c: + ported amrwbdec to 0.11 + +2011-10-03 17:19:02 +0200 Mark Nauwelaerts + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbdec.h: + amrnbdec: port to audiodecoder + +2011-09-30 17:45:31 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + +2011-09-30 17:38:07 +0200 Wim Taymans + + * configure.ac: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: minimal port to 0.11 + +2011-09-05 11:11:52 +0100 Vincent Penquerc'h + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: post QoS messages when dropping a frame due to QoS + https://bugzilla.gnome.org/show_bug.cgi?id=658241 + +2011-09-28 13:05:55 +0200 Wim Taymans + + * configure.ac: + configure: update ported plugins list + +2011-09-28 13:03:31 +0200 Wim Taymans + + * common: + update to 0.11 branch + +2011-09-27 20:32:46 +0200 Wim Taymans + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + dvdlpcmdec: port to 0.11 + +2011-09-27 18:19:50 +0200 Wim Taymans + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: fix raw audio caps too + +2011-09-27 18:15:00 +0200 Wim Taymans + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: port to 0.11 + +2011-09-27 17:54:02 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + +2011-09-27 17:51:31 +0200 Wim Taymans + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: port to 0.11 + +2011-09-27 17:01:59 +0200 Mark Nauwelaerts + + * ext/amrnb/Makefile.am: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbenc.h: + amrnbenc: port to audioencoder + +2011-09-26 19:07:23 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + ext/mad/gstmad.c + +2011-09-26 19:03:13 +0200 Wim Taymans + + * ext/a52dec/gsta52dec.c: + port a52dec to 0.11 + +2011-09-26 16:29:12 +0200 Sebastian Dröge + + * ext/twolame/gsttwolame.c: + twolame: Simple fix for GstAudioEncoder API change + +2011-09-26 16:28:08 +0200 Sebastian Dröge + + * ext/twolame/gsttwolame.c: + twolame: Fix variable 'gstelement_class' set but not used compiler warning + +2011-09-26 16:08:20 +0200 Sebastian Dröge + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: Don't get the parent class again, GST_BOILERPLATE does this already + +2011-09-26 16:07:54 +0200 Sebastian Dröge + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: Fix variable 'gstelement_class' set but not used compiler warning + +2011-09-26 12:07:15 +0200 Mark Nauwelaerts + + * ext/twolame/gsttwolame.c: + twolame: improve output framing and timestamping + ... which simply comes down to requesting one frame of input data at a time, + since the encoder nicely turns this into 1 encoded frame. + +2011-09-26 11:56:23 +0200 Mark Nauwelaerts + + * ext/twolame/Makefile.am: + * ext/twolame/gsttwolame.c: + * ext/twolame/gsttwolame.h: + twolame: port to audioencoder + +2011-09-23 15:32:01 +0200 Mark Nauwelaerts + + * ext/lame/gstlame.c: + lame: use some more boilerplate + +2011-09-23 15:26:48 +0200 Mark Nauwelaerts + + * ext/lame/gstlame.c: + * ext/lame/gstlame.h: + lame: port to audioencoder + +2011-09-23 14:33:55 +0200 Mark Nauwelaerts + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: use some more boilerplate + +2011-09-26 14:44:23 +0200 Mark Nauwelaerts + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: really report bitrate rather kbitrate + +2011-09-26 14:44:01 +0200 Mark Nauwelaerts + + * ext/lame/Makefile.am: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + lamemp3enc: port to audioencoder + +2011-09-16 15:35:06 +0100 Vincent Penquerc'h + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: take into account first sector of the current title + This fixes seeking on titles which do not start on a new file. + https://bugzilla.gnome.org/show_bug.cgi?id=659252 + +2011-09-16 15:03:54 +0100 Vincent Penquerc'h + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: fix sector seeking + It was overly complicated, and did not take into account the offset + needed for titles which do not start on a new file. + https://bugzilla.gnome.org/show_bug.cgi?id=659252 + +2011-09-16 13:42:53 +0100 Vincent Penquerc'h + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: fix sector search for packed titles + Some DVD titles are packed in a single set, and we need to use + the correct table to map times to sectors. + https://bugzilla.gnome.org/show_bug.cgi?id=659252 + +2011-08-15 16:23:04 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/mad/Makefile.am: + * ext/mad/gstmad.c: + * gst-plugins-ugly.spec.in: + mad: remove id3tag dependency used by in practice unreachable legacy code + The mad mp3 decoder element shouldn't parse tags at all really, but we + have so far kept this code around for backwards-compatibility reasons + for people building manual pipelines for some reason. However, as it + turns out that code has never actually worked in 0.10 in practice, + since it only gets executed if mad_frame_decode() returns LOSTSYNC, + which doesn't actually seem to happen any more though because of the + preceding mad_header_decode(), which will discover and report the + sync loss if it runs into a tag and make mad_frame_decode() try to + resync right away. + Discovered this while trying to make it use gst_tag_list_from_id3v2_tag(). + +2011-09-08 17:01:27 +0200 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + asfpacket: skip empty payload packets + ... which also avoids assertion failures and possible segfaults later on + when possibly trying to join 2 empty buffers. + +2011-09-08 14:33:00 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + rmdemux: delay announcing container tags until we have pads + Fixes tags when transcoding. + https://bugzilla.gnome.org/show_bug.cgi?id=658297 + +2011-09-07 14:36:46 +0200 Sebastian Dröge + + * tests/check/elements/amrnbenc.c: + amrnbenc: Use complete raw audio caps in the test + +2011-09-07 14:25:41 +0200 Stefan Sauer + + * docs/plugins/Makefile.am: + docs: cleanup makefiles + Remove commented out parts that we don't need. Remove "the wingo addition" - no + so useful after all. Narrow down file-globs for plugin docs. + +2011-09-06 21:25:13 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From a39eb83 to 11f0cd5 + +2011-09-06 15:40:55 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From 605cd9a to a39eb83 + +2011-08-25 13:04:01 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asf: don't use fourcc + +2011-08-25 12:54:42 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + +2011-08-22 17:49:14 +0100 Vincent Penquerc'h + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix spurious failure to decode some files + Parsing can return with an 'invalid' state, but this is not + actually fatal. For one, the mpeg2dec command line tool that + comes with the libmpeg2 library blithely ignores this condition + and merrily goes on. So we do this same, logging the error, + and going on with parsing. This makes something work that did + not use to work, and brings happiness to the world. + https://bugzilla.gnome.org/show_bug.cgi?id=429476 + +2011-08-19 18:07:58 +0200 Wim Taymans + + * ext/mad/gstmad.c: + * ext/sidplay/Makefile.am: + * ext/sidplay/gstsiddec.cc: + port to new audio caps + +2011-08-03 18:58:09 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + common + gst/asfdemux/gstrtpasfdepay.c + +2011-08-03 09:05:47 +0200 Sebastian Dröge + + * configure.ac: + configure: Add synaesthesia to the list of non-ported plugins + +2011-08-03 01:08:43 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * gst-plugins-ugly.spec.in: + * gst/mpegaudioparse/Makefile.am: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + * gst/mpegaudioparse/mpegaudioparse.vcproj: + * gst/xingmux/Makefile.am: + * gst/xingmux/gstxingmux.c: + * gst/xingmux/gstxingmux.h: + * gst/xingmux/plugin.c: + Remove mp3parse plugin/element + It's been replaced by mpegaudioparse in -good. Don't want anyone + to spend time porting a deprecated element. Rename plugin to xingmux + for now until we move that somewhere else. + +2011-08-02 12:49:09 +0200 Edward Hervey + + * configure.ac: + configure.ac: Define list of non-ported plugins + +2011-08-02 12:48:52 +0200 Edward Hervey + + * ext/mad/gstmad.c: + mad: Fix for changes in GstQuery API + +2011-08-02 12:40:22 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix for changes in GstQuery API + +2011-08-02 12:40:01 +0200 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfdemux: Fix print statement + +2011-08-02 12:35:40 +0200 Edward Hervey + + * common: + Update common submodule + +2011-07-30 18:47:44 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + x264enc: Properly set the stream format in setcaps + Do not forget to set the selected format to the options string + when getting it from caps + https://bugzilla.gnome.org/show_bug.cgi?id=655223 + +2011-07-19 15:06:49 +0200 Stefan Sauer + + * ext/x264/gstx264enc.c: + x264enc: fix the build for older x264enc + b_fake_interlaced was introduced in x264 commit 1b48874d06 = X264_BUILD 96. + +2011-07-18 20:41:20 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264enc: Read stream-format from the right place + Read the stream-format from "stream-format" and not from profile, also rename + the "bytestream" variable to "stream_format" so it's easier to understand. + +2011-06-13 23:24:27 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Select stream-format based on caps + Makes x264 select its stream-format based on what's available + on caps, the user selected option will be chosen as a fallback + when both options are available. + https://bugzilla.gnome.org/show_bug.cgi?id=644233 + +2011-07-04 18:03:49 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264: Allow renegotiation but prefer current caps + +2011-06-09 20:20:27 -0400 Olivier Crête + + * tests/check/elements/x264enc.c: + tests: Test x264enc profiles from the caps + https://bugzilla.gnome.org/show_bug.cgi?id=644233 + +2011-03-07 17:58:34 -0500 Olivier Crête + + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264: Use profile and level from caps + Enforces the profile and level from the downstream caps, also + sets them on the fixated caps + https://bugzilla.gnome.org/show_bug.cgi?id=644233 + +2011-07-05 10:14:50 +0100 Tim-Philipp Müller + + * configure.ac: + Add -DGST_USE_UNSTABLE_API to the compiler flags to avoid warnings + +2011-06-25 06:29:50 +0300 Brian Gitonga Marete + + * ext/x264/gstx264enc.c: + x264enc: fix subme property annotation - subme maximum is 10, not 6. + Although the element accepts subme values > 6, the annotation which is + visible through gst-inspect (for example) erroneously indicates 6 as the + maximum. Fix this by indicating 10 (which is the x264 max) as the maximum. + https://bugzilla.gnome.org/show_bug.cgi?id=653473 + +2011-06-23 11:28:58 -0700 David Schleef + + * common: + Automatic update of common submodule + From 69b981f to 605cd9a + +2011-06-19 12:45:00 -0300 Thiago Santos + + * gst/asfdemux/gstrtspwms.c: + rtspwms: Porting to 0.11 + +2011-06-18 20:24:42 -0300 Thiago Santos + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: Port to 0.11 + +2011-06-15 23:40:02 -0300 Thiago Santos + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Porting to 0.11 + +2011-06-08 18:18:17 +0200 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + siddec: port siddec to 0.11 + +2011-06-06 12:41:03 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: fix fragmented packet handling and packet padding + Also remove a bogus assert. + +2011-06-03 11:35:55 +0300 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + synaesthesia: fix wrong debug log string (copy'n'paste) + +2011-06-02 18:46:11 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + configure.ac + +2011-06-02 18:43:28 +0200 Wim Taymans + + * ext/mad/gstmad.c: + mad: port to new API + Port to new segment API. + Eat Caps events. + No need to set caps on buffers. + +2011-05-20 13:32:31 +0300 Stefan Kost + + * gst/realmedia/rmdemux.c: + rmdemux: target is unsigned and can't be < 0 + +2011-05-20 13:31:14 +0300 Stefan Kost + + * ext/mad/gstmad.c: + mad: use signed when caluculating the delta + Avoids a <0 check for an unsigned variable. + +2011-05-19 23:55:41 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + docs: remove obsolete commented out part + We don't have this in the other modules and its not needed. + +2011-05-19 23:38:23 +0300 Stefan Kost + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + docs: update plugin introspection data + Now more files are merged and produced in a canonical fashion, which hopefully + creates less or no delta in the future. + +2011-05-19 22:58:28 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 9e5bbd5 to 69b981f + +2011-05-18 14:49:17 +0200 Sebastian Dröge + + * ext/lame/Makefile.am: + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Post CODEC and BITRATE tags + Also filter any CODEC/AUDIO_CODEC tags from incoming + tag events. + Fixes bug #391543. + +2011-05-18 16:10:55 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From fd35073 to 9e5bbd5 + +2011-05-18 12:25:01 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 46dfcea to fd35073 + +2011-04-27 15:20:20 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: simplify and refactor packet parsing + Specifically, refactor buffer padding and consider marker bit for fragment + assembling. + +2011-04-27 15:14:00 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: avoid re-sending header + ... e.g. following a seek, which otherwise confuses downstream demuxer + expecting only a flow of data packets at this time. + +2011-04-27 15:12:22 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtpasfdepay.h: + rtpasfdepay: remove unused field + +2011-04-29 09:19:19 +0200 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: Post bitrate tag whenever the bitrate changes + Also send the layer/mode/emphasis/bitrate tags as an event too. + +2011-05-14 10:09:16 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + win32: define GST_PACKAGE_RELEASE_DATETIME in win32 config.h as well + +2011-05-14 10:06:31 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.18 === + +2011-05-10 10:26:50 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.18 + Highlights: + - x264enc: allow changing bitrate and quantizers dynamically at runtime + - x264enc: proxy downstream caps restrictions upstream via get_caps() + - lamemp3enc: proxy downstream rate/channels restrictions upstream via get_caps() + - mad: allow build without libid3tag (which isn't really needed anyway) + - many other fixes and improvements + +2011-05-04 12:39:17 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Copy the template caps, it's not allowed to increase the refcount of const caps + +2011-05-04 12:30:39 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: do not leak peer pad reference + +2011-05-03 15:27:43 +0100 Sjoerd Simons + + * ext/x264/gstx264enc.c: + x264enc: No need to copy, reffing is enough + +2011-05-03 14:57:16 +0100 Sjoerd Simons + + * ext/x264/gstx264enc.c: + x264enc: get_caps function should return a copy of the caps + +2011-04-30 20:07:44 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * po/da.po: + * po/de.po: + * po/fr.po: + * po/uk.po: + * win32/common/config.h: + 0.10.17.4 pre-release + +2011-04-29 15:43:47 +0200 Wim Taymans + + * ext/mad/gstmad.c: + mad: remove buffer_alloc + +2011-04-27 12:48:31 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * po/bg.po: + * po/ja.po: + * po/nl.po: + * po/pl.po: + * po/ru.po: + * po/sl.po: + * po/tr.po: + 0.10.17.3 pre-release + +2011-04-24 14:04:39 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From c3cafe1 to 46dfcea + +2011-04-19 19:24:23 +0200 Wim Taymans + + * ext/mad/gstmad.c: + mad: port to 0.11 + +2011-04-19 19:23:56 +0200 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + android/amrnb.mk + android/amrwbdec.mk + android/asf.mk + android/mpegaudioparse.mk + configure.ac + +2011-04-19 17:26:42 +0100 Tim-Philipp Müller + + * tests/check/gst-plugins-ugly.supp: + tests: add suppression for lame unit test + +2011-04-19 14:41:48 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/generic/.gitignore: + * tests/check/generic/index.c: + tests: add generic index-setting test + +2011-04-19 15:24:03 +0100 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: don't deadlock when setting an index + +2011-04-16 23:26:27 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * po/sl.po: + * win32/common/config.h: + 0.10.17.2 pre-release + +2011-04-16 23:23:56 +0100 Tim-Philipp Müller + + * gst/realmedia/rademux.c: + rademux: fix two 'variable may be used uninitialized' warnings caused by -DG_DISABLE_ASSERT + +2011-04-14 15:04:19 +0100 Tim-Philipp Müller + + * gst/mpegstream/gstmpegdemux.c: + mpegstream: fix unused-but-set-variable warnings with gcc 4.6 + +2011-04-14 15:03:56 +0100 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + dvdread, sidplay, x264enc: fix unused-but-set-variable warnings with gcc 4.6 + +2011-04-14 15:03:33 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix unused-but-set-variable warnings with gcc 4.6 + +2011-04-13 20:31:53 +0200 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Implement getcaps function + This allows to set width/height/etc restrictions downstream. + +2011-04-10 18:24:22 -0400 Thibault Saunier + + * Android.mk: + * ext/mad/Makefile.am: + * ext/x264/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/iec958/Makefile.am: + * gst/mpegaudioparse/Makefile.am: + * gst/mpegstream/Makefile.am: + * gst/realmedia/Makefile.am: + * gst/synaesthesia/Makefile.am: + android: make it ready for androgenizer + To build gstreamer for android we are now using androgenizer which + generates the needed Android.mk files. + Androgenizer can be found here: http://git.collabora.co.uk/?p=user/derek/androgenizer.git + +2011-04-10 18:34:11 -0400 Thibault Saunier + + * android/NOTICE: + * android/amrnb.mk: + * android/amrwbdec.mk: + * android/asf.mk: + * android/mpegaudioparse.mk: + android: remove the android/ folder + +2011-04-04 15:57:58 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 1ccbe09 to c3cafe1 + +2010-09-21 20:14:04 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Allow changing the bitrate and quantitizers dynamically + https://bugzilla.gnome.org/show_bug.cgi?id=621663 + +2010-09-21 19:33:10 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264enc: Set max bitrate in quality mode + https://bugzilla.gnome.org/show_bug.cgi?id=621663 + +2010-09-21 19:20:29 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264enc: Make it clear that constant quantizer is for debugging only + https://bugzilla.gnome.org/show_bug.cgi?id=621663 + +2011-03-25 22:34:31 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 193b717 to 1ccbe09 + +2011-03-25 14:57:00 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From b77e2bf to 193b717 + +2011-03-25 09:33:04 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From d8814b6 to b77e2bf + +2011-03-25 09:09:29 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6aaa286 to d8814b6 + +2011-03-24 18:50:17 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 6aec6b9 to 6aaa286 + +2011-03-22 12:59:33 +0100 Luis de Bethencourt + + * configure.ac: + configure.ac: redundant use of AC_MSG_RESULT() + cleaned the redundant use of AC_MSG_RESULT() in configure.ac + +2011-03-18 19:34:57 +0100 Luis de Bethencourt + + * autogen.sh: + autogen: wingo signed comment + +2011-03-15 11:02:42 +0100 Sebastian Dröge + + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + dvdsubdec: Rearrange buffer allocation and pushing code a bit + This makes the code easier to read, doesn't store every buffer + in the instance until the next buffer is to be drawn and + fixes an unitialized variable compiler warning. + +2011-03-15 10:59:23 +0100 Brendan Le Foll + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Output only a single buffer per subpicture and set the correct duration + Fixes bug #619136. + +2011-03-14 18:39:35 +0100 Brendan Le Foll + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Implement clipping if the video size is smaller than the subpicture size + Fixes bug #644704. + +2011-03-11 17:45:37 +0000 Tim-Philipp Müller + + * configure.ac: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: build the mad plugin even if libid3tag is not available + ID3 tags are usually handled by id3demux, and should be handled + by id3demux. Tag handling in mad based on libid3tag is very basic + and mostly unnecessary really, so just build this plugin without + ID3 tag support if libid3tag is not available. + +2011-03-04 13:48:02 +0100 Wim Taymans + + Merge branch 'master' into 0.11 + +2011-03-02 13:12:11 +0200 Stefan Kost + + * gst/mpegstream/gstdvddemux.c: + dvddemux: small code cleanup + Don't duplicate the 'if' check. Makes the 2nd condition easier to read also + and avoid empty 'if' when logging is disabled. + +2011-02-28 19:27:21 +0100 Mark Nauwelaerts + + * configure.ac: + configure.ac: export plugin description more platform independent + Fixes #642504. + +2011-02-28 18:33:34 +0100 Mark Nauwelaerts + + * common: + Automatic update of common submodule + From 1de7f6a to 6aec6b9 + +2011-02-26 15:02:58 +0100 Wim Taymans + + Merge branch 'master' into 0.11 + Conflicts: + configure.ac + +2011-02-21 13:13:11 +0100 Mark Nauwelaerts + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: do not fail fatally when unlinked + ... as _NOT_LINKED was neither tested as fatal before nor complained about. + +2011-02-21 11:05:31 +0200 Stefan Kost + + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + index: remove conditional index support + Index support cannot be disabled since commit + 4bfb1fe70c6f0d5e29c17a8eeffb02f7fd083f11 + in core, which removed the configure flags to disable index. + +2011-02-17 18:06:51 +0200 Stefan Kost + + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + formatting: trim trailing whitespace + +2011-02-17 18:05:58 +0200 Stefan Kost + + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * gst/mpegstream/gstmpegdemux.c: + index: use delta frame flags instead of 0 or none + +2011-02-14 17:52:09 +0000 Sjoerd Simons + + * ext/x264/gstx264enc.c: + x264enc: Don't register flags with a value of 0 + Flags with a value of 0 aren't meaningful and will cause + g_value_transform to go into an endless loop when trying to + convert the flags to a string + +2011-02-14 12:54:10 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From f94d739 to 1de7f6a + +2011-02-07 19:58:45 +0100 Mark Nauwelaerts + + * ext/amrwbdec/amrwbdec.c: + amrwbdec: avoid stalling on invalid frame + Skip 1 byte indicating invalid frame type index rather than stalling + on it indefinitely until EOS. + Fixes #639715. + +2011-02-03 18:25:00 +0000 Tim-Philipp Müller + + * tests/check/pipelines/lame.c: + tests: add unit test for lamemp3enc negotiation issue + https://bugzilla.gnome.org/show_bug.cgi?id=641151 + +2011-02-03 18:18:35 +0000 Tim-Philipp Müller + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: implement sinkpad get_caps() function to proxy rate and channels restrictions from downstream + The element downstream of mp3enc might only accept certain sample rates or channels, + make sure we relay any restrictions that do exist to upstream when it does a + get_caps() on the sink pad. That way upstream elements like audioresample or + audioconvert can pick a sample rate / channel configuration that will be accepted, + instead of just negotiating to the highest, which might then be rejected. + https://bugzilla.gnome.org/show_bug.cgi?id=641151 + +2011-01-30 16:17:19 +0100 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfpacket: Avoid using broken duration extension + Quite a few (broken?) files have a packet duration of 1ms, which is + most definitely wrong for either audio or video packets. + We therefore avoid using that value and instead use other metrics to + determine the buffer duration (like using the extended stream properties + average frame duration if present and valid). + +2011-01-27 15:33:40 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + win32: fix DEFAULT_AUDIOSINK, should be direct*sound*sink + https://bugzilla.gnome.org/show_bug.cgi?id=640705 + +2011-01-12 16:48:57 +0800 Yang Xichuan + + * gst/mpegaudioparse/gstxingmux.c: + xingmux: Use FALSE instead of 0 as return value for a function returning gboolean + Fixes bug #639291. + +2011-01-06 18:29:06 +0000 Vincent Penquerc'h + + * gst/mpegstream/gstdvddemux.c: + mpegstream: increase allowable gap between streams + The new delay is three times as much as the old one, and just happens + to let me properly decode my "Princess Mononoke" DVD, on which dvdreadsrc + was chocking before at 5:11. + While there, merge the constants used in two places into a define. + https://bugzilla.gnome.org/show_bug.cgi?id=539708 + +2011-01-22 17:31:40 +0100 Miguel Angel Cabrera Moya + + * ext/x264/gstx264enc.c: + x264enc: make tag event writable before modifying tag list in place + To modify an event tag is necessary to be sure that x264enc + has its own copy. + Also fix indentation. + https://bugzilla.gnome.org/show_bug.cgi?id=640272 + +2011-01-24 10:14:56 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.17 === + +2011-01-21 13:18:51 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.17 + +2011-01-18 11:11:28 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + 0.10.16.4 pre-release + +2011-01-14 17:37:09 +0100 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Use the proper component value for height + +2011-01-11 20:42:06 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + 0.10.16.3 pre-release + +2011-01-11 17:09:02 +0100 Edward Hervey + + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: + asfdemux: Handle new type of DRM'd asf files. + These are produced by the new MS PlayReady system. + https://bugzilla.gnome.org/show_bug.cgi?id=639226 + +2011-01-11 15:51:14 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From e572c87 to f94d739 + +2011-01-10 16:37:19 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From ccbaa85 to e572c87 + +2011-01-10 14:54:40 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 46445ad to ccbaa85 + +2011-01-08 00:35:08 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: never disable g_assert() and cast checks for the unit tests + The unit tests are riddled with g_assert() and friends, make sure we + don't disable assert and cast checks for the unit tests even if + this has been specified for the rest of the code base, e.g. via + --disable-glib-asserts + +2011-01-07 14:42:26 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.16.2 pre-release + +2011-01-07 14:38:17 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + docs: update docs + +2011-01-07 14:37:07 +0000 Tim-Philipp Müller + + * po/bg.po: + * po/ca.po: + * po/ru.po: + po: update translations + +2011-01-07 14:33:37 +0000 Tim-Philipp Müller + + * configure.ac: + configure: use $LIBM instead of hardcoding -lm + +2011-01-06 13:15:17 +0100 Edward Hervey + + * gst/realmedia/rmdemux.c: + rmdemux: Initialize return variable. + In the unlikely event that height is 0 (which is invalid) we would end up + never setting the flow return. + +2011-01-05 16:52:03 +0100 Edward Hervey + + * gst/realmedia/rmutils.c: + realmedia: Fix unitialized variables on macosx + +2011-01-04 10:32:05 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + x264enc: Handle codec/encoder tags + Make x264enc drop video-codec and codec tags and replace + encoder/encoder-version with x264 and its build number + Fixes #621465 + +2010-12-29 22:17:50 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: use gst_pad_alloc_buffer() when cropping buffers + +2010-12-29 22:10:58 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: minor formatting clean-up + +2010-12-29 21:42:36 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: refactor cropping code to use libgstvideo functions + https://bugzilla.gnome.org/show_bug.cgi?id=571146 + +2010-12-29 20:19:34 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: use GstVideoFormat instead of custom enum + +2010-12-29 20:15:03 +0000 Tim-Philipp Müller + + * ext/mpeg2dec/Makefile.am: + mpeg2dec: fix LIBADD order in Makefile.am + +2010-11-19 13:01:35 -0500 Tristan Matthews + + * ext/x264/gstx264enc.c: + x264: vbv-buf-capacity should have a minimum of 0 + x264 will clip this value internally, and users should be allowed to + specify a lower value than 300 ms. + https://bugzilla.gnome.org/show_bug.cgi?id=635291 + +2010-12-27 11:38:24 +0000 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264enc: also accept YV12 input + +2010-12-01 18:35:59 +0100 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: add a note to the docs about encoder latency and queues + https://bugzilla.gnome.org/show_bug.cgi?id=636107 + +2010-12-24 10:12:19 +0000 Vincent Penquerc'h + + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + realmedia: do not use the pad buffer allocation functions in demuxers + Doing so can block, see https://bugzilla.gnome.org/show_bug.cgi?id=637822 + https://bugzilla.gnome.org/show_bug.cgi?id=637932 + +2010-12-20 17:47:41 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 169462a to 46445ad + +2010-12-16 10:30:31 +0100 Sebastian Dröge + + * ext/mad/gstmad.c: + mad: If gst_pad_alloc_buffer() returns a buffer with the wrong size allocate a new one + Fixes bug #635461. + +2010-12-15 14:56:36 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 20742ae to 169462a + +2010-12-12 11:54:35 -0600 Rob Clark + + * gst/realmedia/rmdemux.c: + rmdemux: set GST_BUFFER_FLAG_DELTA_UNIT properly + Signed-off-by: Rob Clark + +2010-12-13 16:24:09 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 011bcc8 to 20742ae + +2010-11-14 10:57:21 -0800 Leo Singer + + * configure.ac: + x264: uses pkg-config to locate libx264 + +2010-12-07 15:40:08 +0100 Wim Taymans + + Merge branch 'master' into 0.11 + +2010-12-07 15:39:32 +0100 Wim Taymans + + * tests/check/pipelines/lame.c: + check: don't use deprecated method + +2010-12-06 18:12:51 +0100 Wim Taymans + + * android/amrnb.mk: + * android/amrwbdec.mk: + * android/asf.mk: + * android/mpegaudioparse.mk: + * configure.ac: + more 0.10 -> 0,11 changes + +2010-12-06 12:29:12 +0100 Wim Taymans + + * configure.ac: + configure: open 0.11 branch + +2010-12-03 17:43:25 +0100 Benjamin Gaignard + + * Android.mk: + * android/NOTICE: + * android/amrnb.mk: + * android/amrwbdec.mk: + * android/asf.mk: + * android/mpegaudioparse.mk: + Add build system for Android + +2010-11-25 19:51:50 +0100 Edward Hervey + + * gst/realmedia/rmutils.c: + realmedia: Remove dead assignments + +2010-11-25 19:51:40 +0100 Edward Hervey + + * ext/mad/gstmad.c: + mad: Remove dead assignments + +2010-11-13 12:38:45 +0000 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: remove bogus comment + +2010-11-13 12:34:37 +0000 Thomas Green + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: fix handling of multi-angle streams + We would output all angles interleaved instead of just + the selected angle. + https://bugzilla.gnome.org/show_bug.cgi?id=539254 + +2010-10-28 17:01:16 +0100 Tim-Philipp Müller + + * gst/realmedia/Makefile.am: + realmedia: fix LIBS order in Makefile + +2010-10-22 09:17:40 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + po: update for new translatable strings + +2010-10-27 13:17:29 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 7bbd708 to 011bcc8 + +2010-10-20 20:26:45 +0200 Guillaume Emont + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: convert the position to stream time before answering to a position query + +2010-10-24 14:22:39 +0200 Edward Hervey + + * gst/realmedia/Makefile.am: + * gst/realmedia/rademux.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + realmedia: Get codec name from pbutils instead of harcoding them + +2010-10-22 11:29:55 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Work around a rate control issue in libx264 + When variable framerate is disabled in libx264 (which occurs when using + the zerolatency tuning), libx264 ignores timestamps but still uses the + timebase leading to messed up rate control with our nanosecond timebase. + We work around this issue by setting the timebase to the reciprocal of + the framerate and we validate that the framerate is suitable. + This has been fixed upstream in libx264 but there are non-fixed versions + in the wild so this workaround is still needed. + Fixes bug #632861 + +2010-10-19 16:30:51 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Use gst_pad_peer_query() instead of getting the peer pad manually + +2010-10-13 21:38:06 +0200 Guillaume Emont + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix position query by trusting upstream + Position queries are badly handled for DVDs (probably due to the division in + chapters): the time returned was the time since the start of chapter. + Now ask upstream for position queries, fall back to the old code if upstream + cannot answer the query. + +2010-10-19 12:20:40 +0300 Stefan Kost + + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * gst/mpegstream/gstmpegparse.c: + various: canonicalize property names + +2010-10-19 10:06:33 +0300 Stefan Kost + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * ext/x264/gstx264enc.c: + various (ext): add a missing G_PARAM_STATIC_STRINGS flags + +2010-10-19 09:49:47 +0300 Stefan Kost + + * gst/iec958/ac3iec.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rdtmanager.c: + various (gst): add a missing G_PARAM_STATIC_STRINGS flags + +2010-10-14 12:32:16 -0700 David Schleef + + * common: + Automatic update of common submodule + From 5a668bf to 7bbd708 + +2010-10-08 12:44:52 -0700 David Schleef + + * common: + Automatic update of common submodule + From c4a8adc to 5a668bf + +2010-10-08 12:56:05 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 5e3c9bf to c4a8adc + +2010-09-29 21:24:23 +0200 Mark Nauwelaerts + + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad: support reverse playback + +2010-09-26 19:24:08 +0100 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + dvdreadsrc: improve error messages on read errors + Provide proper i18n-ed error messages when a read error happens, + and point out that the error could be happening because the + DVD is scrambled. + https://bugzilla.gnome.org/show_bug.cgi?id=613633 + +2010-09-24 00:03:50 +0100 Tim-Philipp Müller + + * configure.ac: + configure: set plugin release datetime + +2010-09-21 18:34:31 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From aa0d1d0 to 5e3c9bf + +2010-09-15 20:14:47 +0100 Tim-Philipp Müller + + * gst/mpegstream/gstmpegparse.c: + mpegparse: re-fix flow return handling + Fix wrong GST_FLOW_IS_SUCCESS substitution in commit e99cb46c: + - } while (GST_FLOW_IS_SUCCESS (result)); + + } while (result != GST_FLOW_OK); + +2010-09-09 22:33:36 +0300 Stefan Kost + + * tests/check/Makefile.am: + * tests/check/generic/states.c: + tests: allow running state tests for all elements + Now one can use GST_NO_STATE_IGNORE_ELEMENTS=1 make generic/states.check + to try elements that would normaly be skipped. + +2010-09-09 09:53:07 +0100 Tim-Philipp Müller + + * Makefile.am: + New pkgconfig subdirectory needs to be added to SUBDIRS as well so it's entered and disted + +2010-09-08 00:09:35 +0100 Tim-Philipp Müller + + * configure.ac: + * pkgconfig/.gitignore: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-plugins-ugly-uninstalled.pc.in: + Add gstreamer-plugins-ugly-uninstalled-0.10.pc file so other modules can find our plugins + This .pc file will not be installed, it's only for uninstalled setups, + same thing as we do for -good. This is so other modules' unit tests can + find our plugins properly in an uninstalled setup. + +2010-09-07 11:42:52 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From c2e10bf to aa0d1d0 + +2010-09-06 23:53:10 +0100 Tim-Philipp Müller + + * configure.ac: + configure: re-enable use of -DGST_DISABLE_DEPRECATED in git versions + +2010-09-06 23:51:23 +0100 Tim-Philipp Müller + + * ext/sidplay/gstsiddec.cc: + siddec: don't use GST_FLOW_IS_FATAL + GST_FLOW_IS_FATAL has been deprecated in core git. + +2010-09-05 18:58:50 -0700 David Schleef + + * common: + Automatic update of common submodule + From d3d9acf to c2e10bf + +2010-09-05 12:27:02 +0200 Sebastian Dröge + + * configure.ac: + configure: Require orc >= 0.4.6 for --compat + +2010-09-05 12:20:22 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From ec60217 to d3d9acf + +2010-08-27 18:26:49 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Don't use GST_FLOW_IS_FATAL() + And don't post error messages if allocating a buffer resulted + in WRONG_STATE or UNEXPECTED. + +2010-08-27 18:25:31 +0200 Sebastian Dröge + + * gst/mpegaudioparse/gstxingmux.c: + xingmux: Don't ignore WRONG_STATE and NOT_LINKED when pushing data downstream + +2010-08-27 18:24:11 +0200 Sebastian Dröge + + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + mpegstream: Don't use GST_FLOW_IS_SUCCESS() + +2010-08-27 18:22:45 +0200 Sebastian Dröge + + * gst/realmedia/rmdemux.c: + rmdemux: Don't use GST_FLOW_IS_FATAL() and GST_FLOW_IS_SUCCESS() + +2010-08-27 18:19:00 +0200 Sebastian Dröge + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't use GST_FLOW_IS_FATAL() + And don't post error messages for UNEXPECTED and post an error + message if pulling data failed because of NOT_LINKED. + +2010-09-04 13:17:53 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Back to development + Temporarily disable -DGST_DISABLE_DEPRECATED for git builds until + the code is updated for the GST_FLOW_IS_* macro deprecations. + +=== release 0.10.16 === + +2010-09-02 23:59:20 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.16 + +2010-09-02 23:58:22 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + docs: update docs for release + +2010-09-02 23:48:05 +0100 Tim-Philipp Müller + + * po/LINGUAS: + * po/gl.po: + * po/id.po: + * po/lv.po: + * po/ro.po: + * po/sv.po: + po: update translations + +2010-08-30 16:02:24 +0200 Sebastian Dröge + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + 0.10.15.6 pre-release + +2010-08-27 17:50:59 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't error out on non-critical flow returns + Only error out when downstream returns: + * NOT_SUPPORTED + * ERROR + * NOT_NEGOTIATED + * NOT_LINKED + If we got _UNEXPECTED, we push an EOS downstream (since maybe only one + of the streams had gone EOS) and then stop the task silently. + In the case of WRONG_STATE we just need to stop silently + https://bugzilla.gnome.org/show_bug.cgi?id=600412 + +2010-08-25 19:02:02 +0200 Sebastian Dröge + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + 0.10.15.5 pre-release + +2010-08-25 15:39:33 +0200 Alessandro Decina + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: propagate flow errors upstream. + Remove a wrong GST_FLOW_IS_FATAL call. When pushing fails, mp3parse should + always return the error upstream. + +2010-08-21 21:42:25 +0200 Sebastian Dröge + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + 0.10.15.4 pre-release + +2010-08-13 17:24:41 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 3e8db1d to ec60217 + +2010-08-11 16:46:48 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + 0.10.15.3 pre-release + +2010-08-11 09:21:43 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Fix b-pyramid libx264 API boolean arg for non-boolean issue + In X264_BUILD >= 78, b-pyramid became a non-boolean so passing a boolean + argument to the option string value causes an error. For < 78 we pass the + boolean value, for >= 78 we use the x264_b_pyramid_names[] array which will + result in passing 'none' for false and 'strict' for true. Other modes can be + set through the option-string property for now. + https://bugzilla.gnome.org/show_bug.cgi?id=626577 + +2010-08-11 00:02:47 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + 0.10.15.2 pre-release + +2010-08-10 14:37:39 +0300 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + synaesthesia: code cleanups. + Remove unused boilerplate for signals. Use _OBJECT variants of logging macros + more. + +2010-08-10 14:24:01 +0300 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + synaesthesia: use GST_BOILERPLATE macros + +2010-08-10 10:59:04 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From bd2054b to 3e8db1d + +2010-08-09 00:31:15 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + x264: fix printf format warning in debug message + +2010-08-07 00:09:47 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + docs: fix bug passing arguments to gtkdoc-fixref in upload target + Missing backslash at end of line meant we weren't passing all arguments + to gtkdoc-fixref and we'd get a shell error when doing 'make upload'. + +2010-08-05 13:57:26 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From a519571 to bd2054b + +2010-08-04 19:28:09 +0200 Sebastian Dröge + + * configure.ac: + configure: Check if the compiler supports ISO C89 or C99 and which parameters are required + This first checks what is required for ISO C99 support and sets the relevant + compiler parameters and if no C99 compiler is found, it checks for a + C89 compiler. This enables us to check for and use C89/C99 functions + that gcc hides from us without the correct compiler parameters. + +2010-07-29 09:41:49 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Fix flushing of delayed frames + x264_encoder_encode() should be called with a NULL picture until at least + x264_encoder_delayed_frames() returns 0. This fixes what appeared to be a + regression in make check due to the recent change in defaults which enabled + b-frames and b-pyramid, both of which I believe increase the number of delayed + frames when encoding. + +2010-07-21 17:24:33 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Improve x264enc defaults + - medium x264 speed/quality preset + - threads defaults to 0 which automatically uses 1.5x number of cpu cores + Addresses part of bug #607798 + +2010-07-21 17:22:48 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Fix property description typos + +2010-07-22 11:53:04 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Add some more debug info + +2010-07-21 17:09:20 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Add speed-preset and [psy-]tuning properties + Use of a rate control method (pass, bitrate, quantizer, etc properties), a + preset and possibly a profile and/or tuning are now the recommended way to + configure x264 through x264enc. + If a preset/tuning are specified then these will define the default values and + the property defaults will be ignored. After this the option-string property is + applied, followed by the user-set properties, fast first pass restrictions and + finally the profile restrictions. + Addresses part of bug #607798 + +2010-07-21 16:56:06 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Refactor code in preparation for presets/tunings + - Make defaults append the appropriate default value to a string. This is + needed to differentiate between something user-set and the actual prop + default. + - Add an internal option string to which _set_property () cases append for the + majority of properties. + - Use gst_x264_enc_parse_options () to clean up application of settings. This + will make order of application with respect to the presets and tunings quite + simple. + Addresses part of bug #607798 + +2010-07-21 16:32:11 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Update available me types + Use the x264_motion_est_names[] array to populate the enum of ME types. This is + now self-maintaining. + +2010-07-21 15:59:12 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Use new libx264 API to affect fast first pass + Uses new x264 API to apply reduced complexity values to the parameters to + increase encoding speed in the first pass of a multi-pass encode. This does + not impact on final quality. + Addresses part of bug #607798 + +2010-07-21 15:52:28 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Add profile property + In X264_BUILD >= 86 there is a new API for applying restrictions to an H.264 + Profile. This makes it easier to achieve Baseline Profile for example. + Addresses part of bug #607798 + +2010-07-21 15:40:27 +0200 Robert Swain + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Add option-string property + Adds support for an x264 format option-string to specify advanced parameters + Addresses part of bug #607798 + +2010-07-22 13:24:37 +0100 Tim-Philipp Müller + + * ext/mad/Makefile.am: + mad: use right automake variable, should be ID3TAG_{LIBS,CFLAGS} not ID3_{LIBS,CFLAGS} + Spotted by syntr0py. + +2010-07-20 19:44:00 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: only set timebase on versions where it exists + +2010-07-20 16:40:22 +0200 David Hoyt + + * ext/x264/gstx264enc.c: + x264enc: set appropriate time base + Fixes #624786. + +2010-06-30 18:45:49 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: add plugin loading whitelist to test environment + Only want to load core/-base/-ugly plugins here. + +2010-06-28 16:12:12 +0100 Tim-Philipp Müller + + * autogen.sh: + * configure.ac: + Bump automake requirement to 1.10 and autoconf to 2.60 + For maintainability reasons and $(builddir). + See #622944. + +2010-06-28 09:34:30 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix seeking after last commits + Don't handle wrong-state returns as errors to allow seeking to work + again. + +2010-06-24 19:46:39 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Push all pending data on EOS + When on push mode and receiving an EOS event, asfdemux + should push all pending data because we might be dealing + with a broken file that has a preroll value higher + than its actual length. + +2010-06-24 19:29:17 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix sending eos event for chained asfs + Properly push EOS event when finishing a chained asf file + in pull mode + Fixes #599718 + +2010-06-24 20:55:33 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-rmdemux.xml: + docs: add rmdemux to docs properly + The plugin has been renamed, remove old introspection file. + +2010-06-24 18:04:15 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-x264.xml: + docs: update for recent x264enc changes + +2010-06-24 18:03:21 +0100 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: + rmdemux: fix compiler warning when debugging system in core is disabled + +2010-06-24 15:09:44 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 73ff93a to a519571 + +2010-06-23 11:05:11 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Allow at least 500ms of preroll. + Some files have insanely low preroll values which break the + all_streams_prerolled() logic. + Fixes #622407 + +2010-06-22 11:41:42 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: add new h264 caps attribute alignment + See #606662. + +2010-06-18 14:35:00 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: conditionally expose enhanced upstream capabilities + API: GstX264Enc:sliced-threads + API: GstX264Enc:sync-lookahead + API: GstX264Enc:intra-refresh + API: GstX264Enc:mb-tree + API: GstX264Enc:rc-lookahead + See #607798. + +2010-06-17 16:48:59 +0100 Tim-Philipp Müller + + * common: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + docs: update introspected plugin docs for gstdoc-scangobj and other changes + Update common for latest gstdoc-scangobj and inspect xml files for + escaping and pad template order changes. + +2010-06-15 16:50:21 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From 9339ccc to 35617c2 + +2010-06-15 16:54:42 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 5adb1ca to 9339ccc + +2010-06-15 16:35:49 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 57c89b7 to 5adb1ca + +2010-06-15 15:50:09 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From c804988 to 57c89b7 + +2010-06-14 16:59:25 +0200 Sebastian Dröge + + * configure.ac: + * gst/realmedia/rtspreal.c: + configure: Update required GLib version to 2.20 + +2010-06-14 15:33:14 +0200 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Call orc_init() before trying to get target flags + +2010-06-14 14:34:56 +0200 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Remove debug printf... + +2010-06-14 14:34:25 +0200 Sebastian Dröge + + * configure.ac: + * ext/a52dec/Makefile.am: + * ext/a52dec/gsta52dec.c: + a52dec: Use orc for CPU feature detection and don't check for liboil + +2010-06-14 13:27:47 +0200 Sebastian Dröge + + * configure.ac: + configure: Use GLIB_EXTRA_CFLAGS + +2010-06-14 13:05:25 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 7a0fdf5 to c804988 + +2010-06-14 11:35:03 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6da3bab to 7a0fdf5 + +2010-06-12 08:29:28 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 733fca9 to 6da3bab + +2010-06-09 12:40:26 -0700 David Schleef + + * common: + Automatic update of common submodule + From fad145b to 733fca9 + +2010-06-09 12:34:18 -0700 David Schleef + + * common: + Automatic update of common submodule + From 47683c1 to fad145b + +2010-06-05 14:11:30 +0200 Wim Taymans + + * gst/realmedia/rmdemux.c: + rmdemux: pass bitrate on caps + Set the bitrate on the caps, some decoders like sipro need this to function + properly. + Fixes #620007 + +2010-06-01 23:49:37 -0700 David Schleef + + * common: + Automatic update of common submodule + From 17f89e5 to 47683c1 + +2010-06-01 22:55:22 -0700 David Schleef + + * common: + Automatic update of common submodule + From fd7ca04 to 17f89e5 + +2010-05-31 16:57:42 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264enc: Only set i_weighted_pred on versions where it exists + +2010-05-20 11:28:47 -0400 Tristan Matthews + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: implement latency query + The encoder's latency is deduced from the framesize. Fixes #618896. + +2010-06-01 09:30:33 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.15 === + +2010-05-30 14:21:02 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.15 + +2010-05-30 14:20:02 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2010-05-30 12:10:29 +0100 Tim-Philipp Müller + + * configure.ac: + configure: make implicit GLib and liboil requirements explicit + core/base 0.10.26 require GLib >= 2.18 and liboil >= 0.3.14 + +2010-05-26 23:16:46 -0400 Olivier Crête + + * ext/x264/gstx264enc.c: + x264enc: disable I weighted pred + If it is enabled, then it will be main profile instead of baseline. + This ensures maximum compatibility of the output stream until the + encoder configuration interface gets an overhaul with explicit + output profile selection. + Fixes #619776. + +2010-05-26 12:16:16 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.14.3 pre-release + +2010-05-26 11:52:53 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + po: update translations + +2010-05-26 11:55:58 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 357b0db to fd7ca04 + +2010-05-14 20:06:46 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.14.2 pre-release + +2010-05-14 18:25:38 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 4d67bd6 to 357b0db + +2010-05-14 16:02:47 +0200 Wim Taymans + + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmutils.c: + * gst/realmedia/rmutils.h: + rmdemux: add better sipr nibble swap routine + +2010-05-13 17:57:57 +0200 Wim Taymans + + * gst/realmedia/rmdemux.c: + rmdemux: descramble SIPR before pushing out + Collect and descramble the SIPR packets before pushing. + Descramble ATRAC audio. + Fixes #618098 + +2010-05-13 17:57:02 +0200 Wim Taymans + + * gst/realmedia/rmutils.c: + * gst/realmedia/rmutils.h: + rm: add function to descramble sipr + +2010-01-08 20:51:56 -0500 Olivier Crête + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Re-send the received upstream event as-is downstream + https://bugzilla.gnome.org/show_bug.cgi?id=606689 + +2010-05-07 15:33:28 +0200 Edward Hervey + + * ext/amrnb/amrnb.c: + amrnbenc: Set rank to GST_RANK_SECONDARY + +2010-04-30 19:53:15 +0100 Tim-Philipp Müller + + * gst/realmedia/rtspreal.c: + rtspreal: use GLib's base64 functions if available + Since gst_rtsp_base64_decode_ip() just got deprecated in -base git. + +2010-04-28 17:10:36 +0400 Руслан Ижбулатов + + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.h: + * ext/amrwbdec/amrwbdec.h: + amr: Use correct includes (as pkg-config suggests) + Fixes #617078 + +2010-04-27 13:15:47 +0300 Stefan Kost + + * gst/ac3parse/.gitignore: + * gst/ac3parse/Makefile.am: + * gst/ac3parse/README: + * gst/ac3parse/ac3parse.vcproj: + * gst/ac3parse/gstac3parse.c: + * gst/ac3parse/gstac3parse.h: + ac3parse: remove unported 0.8 plugin + New ac3parse lives in gst-plugin-bad. Remove this to avoid confusion. + +2010-04-27 12:25:37 +0300 Stefan Kost + + * gst/mpegaudioparse/gstmpegaudioparse.c: + docs: adding a mp3decoder as well is useful + +2010-04-27 11:39:51 +0300 Stefan Kost + + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + docs: massage section index + +2010-04-27 11:39:11 +0300 Stefan Kost + + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + amrwbdec: move define to source to avoid hiding it from the docs + +2010-04-27 11:38:28 +0300 Stefan Kost + + * ext/cdio/gstcdiocddasrc.c: + docs: remove short_desc, it is taken from element details + +2010-04-27 11:37:52 +0300 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + docs: fix sections docs for synaesthesia + +2010-04-27 11:02:15 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * gst/mpegaudioparse/gstmpegaudioparse.c: + docs: add docs for mp3parse + +2010-04-20 17:23:04 +0100 Tim-Philipp Müller + + * gst-plugins-ugly.doap: + doap: update repository info from cvs->git and maintainers + +2010-04-23 14:41:42 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From fc85867 to 4d67bd6 + +2010-04-13 16:59:03 +0200 Mark Nauwelaerts + + * tests/check/elements/x264enc.c: + x264enc: adaptive NALU type checking + In particular, be less picky about SEI NALU order, which makes test more + robust with respect to changes in libx264. + See also #615410. + +2010-04-16 21:10:58 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: adaptive x264 header NAL layout handling + Fixes #615410. + +2010-04-15 16:31:23 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: we require a dynamic payload type + Add an extra caps property that restricts the depayloader to only accept dynamic + payload types. + +2010-04-15 07:20:20 -0300 Thiago Santos + + * configure.ac: + configure: Drop -Wcast-align + Commit message copied from core's commit from Benjamin Otte: + 246f5dba96a5b50bb74621af67b30942cca72af5 + Apparently gcc warns that GstMiniObject is not castable to + GstEvent/Message/Buffer due to them containing 64bit variables, even + though ARM hackers claim that those only need 4byte alignment. And as + long as gcc behaves that way, this warning is not very useful. + So we'll remove the warning until this problem is fixed. + Fixes #615698 + +2010-04-14 09:27:14 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: copy over all buffer flags when copying buffers. + Avoids losing the tff/rff video buffer flags + +2010-03-14 12:16:21 +0100 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfdemux: Make a table static to avoid having to always allocate it. + +2010-04-13 16:31:25 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: fix up avcC header construction + Fix off-by-one introduced by commit 35dd89951d8bb1c094da65480e4197efdfb4e93c + for BUILD_X264 < 76. + Also fixes #610089. + +2010-04-13 13:16:41 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: parameterize libx264 provided NAL layout in codec-data creation + +2010-04-12 12:43:05 +0200 Edward Hervey + + * configure.ac: + configure: Remove -Wundef flag + Same fix as for #615161 + +2010-04-09 11:23:22 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From fdf023d to fc85867 + +2010-04-09 09:55:14 +0100 Tim-Philipp Müller + + * gst-libs/gst/gettext.h: + i18n: #if ENABLE_NLS -> #ifdef ENABLE_NLS to fix compiler warning + +2010-03-30 00:36:38 +0100 Tim-Philipp Müller + + * common: + * ext/Makefile.am: + * gst/Makefile.am: + build: build plugins in parallel where possible, if make -jN is used + +2010-03-26 17:08:23 +0000 Tim-Philipp Müller + + * Makefile.am: + build: add cruft alert for common/shave* + +2010-03-25 19:40:33 +0000 Tim-Philipp Müller + + * win32/MANIFEST: + Fix make distcheck + Remove removed file win32/common/config.h.in from MANIFEST. + +2010-03-24 19:35:03 +0100 Edward Hervey + + * gst/synaesthesia/synaescope.c: + * gst/synaesthesia/synaescope.h: + synaestesia: Fix old-style prototype + +2010-03-24 19:07:11 +0300 Руслан Ижбулатов + + * gst/realmedia/rmutils.c: + Fix pointer type. + Fixes #613815 + +2010-03-24 18:55:32 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 55cd514 to c1d07dd + +2010-03-24 11:27:40 +0100 Sebastian Dröge + + * configure.ac: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/cdio/gstcdiocddasrc.h: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.h: + * ext/lame/gstlamemp3enc.h: + * ext/lame/plugin.c: + * ext/mad/gstmad.c: + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstxingmux.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/realmedia/asmrules.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/pnmsrc.h: + * gst/realmedia/rdtdepay.h: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rtspreal.c: + build: Add all kinds of compiler warning flags and fix the resulting warnings + +2010-03-19 00:03:53 +0000 Tim-Philipp Müller + + * ext/amrnb/Makefile.am: + * ext/amrwbdec/Makefile.am: + * ext/sidplay/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/mpegaudioparse/Makefile.am: + build: fix up Makefile.am + Mostly just add $(GST_BASE_CFLAGS) where they're missing and fix + the order a bit here and there (see docs/random/moving-plugins). + +2010-03-19 00:02:40 +0000 Tim-Philipp Müller + + * win32/common/config.h.in: + win32: remove win32-specific config.h.in copy that's not used any longer + The win32 config.h is now generated from the top-level config.h.in. + +2010-03-18 15:53:14 +0100 Benjamin Otte + + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrwbdec/amrwbdec.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * gst/ac3parse/gstac3parse.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtspwms.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/iec958/ac3iec.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstxingmux.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rtspreal.c: + * gst/synaesthesia/gstsynaesthesia.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2010-03-16 15:05:06 +0100 Sebastian Dröge + + * ext/x264/gstx264enc.c: + x264enc: Put pixel-aspect-ratio from input into the src pad caps + Fixes bug #612995. + +2010-03-12 13:59:53 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From e272f71 to 55cd514 + +2010-03-11 11:21:19 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From df8a7c8 to e272f71 + +2010-03-10 22:13:45 +0100 Benjamin Otte + + * configure.ac: + Update CXXFLAGS, too + +2010-03-10 21:01:20 +0100 Benjamin Otte + + * configure.ac: + Update for recent changes to common submodule + This just replaces every "$ERROR_CFLAGS" usage with a usage of + "$WARNING_CFLAGS $ERROR_CFLAGS" to get the same functionality as + previously. + Actually using that separation will happen later. + +2010-03-10 21:52:30 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 9720a7d to df8a7c8 + +2010-03-10 20:44:18 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 0b6e072 to 9720a7d + +2010-03-10 16:10:17 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 7cc5eb4 to 0b6e072 + +2010-03-10 01:10:52 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 7aa65b5 to 7cc5eb4 + +2010-03-09 21:40:26 +0000 Sebastian Dröge + + * common: + Automatic update of common submodule + From 44ecce7 to 7aa65b5 + +2010-02-26 15:43:58 +0100 Sebastian Dröge + + * configure.ac: + configure: Use automake 1.11 silent rules instead of shave if available + This makes sure that we use something that is still maintained and + also brings back libtool 1.5 support. + +2010-03-09 17:42:11 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.14 === + +2010-03-06 01:13:25 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.14 + +2010-03-06 01:10:09 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2010-03-03 22:52:12 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.13.4 pre-release + +2010-02-22 19:13:11 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + * tests/check/elements/x264enc.c: + x264enc: Replace 'avc-sample' with 'avc' in caps + In the element and in its tests + Fixes #606662 + +2010-03-01 14:07:20 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't set durations of 0 on outgoing buffers. + Some (broken) streams don't have the extended stream properties in + the header, resulting in applying a duration of zero on outgoing + buffers. + Fixes #611473 + +2010-03-01 14:05:58 +0100 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfdemux: Make sure we always set proper payload duration. + Some (broken) streams will have a delta of 0, resulting in outgoing + buffers having durations of 0. + Fixes #611473 + +2010-02-24 01:40:34 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.13.3 pre-release + +2010-02-19 10:13:34 +0100 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfdemux: Make sure we don't end up with negative timestamps. + Some files have payload with timestamps smaller than the preroll duration. + Instead of blindly substracting the preroll value (and ending up with + insanely high timestamps on the outgoing buffers), we make sure we + never go below 0. + Fixes #610432 + +2010-02-19 01:07:08 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.13.2 pre-release + Update core/base requirement to 0.10.26, since that's more likely + to be the actual requirement. + +2010-02-19 01:06:44 +0000 Tim-Philipp Müller + + * po/LINGUAS: + * po/el.po: + * po/sl.po: + po: update translations + +2010-02-16 14:08:12 +0000 Tim-Philipp Müller + + * tests/check/elements/x264enc.c: + x264enc: add caps check to x264enc unit test + Add some minimal caps checking to x264enc unit test. + See #610089. + +2010-02-16 13:25:11 +0000 Vittorio Palmisano + + * ext/x264/gstx264enc.c: + x264enc: fix up avcC header construction and playback by flash players + Fix off-by-one bug when constructing the avcC header chunk: we + wrote wrong profile info into the header. The first byte in the + SPS NAL we get from x264 is the nal type, not the profile_idc. + Also add some debug logging. + Fixes #610089. + +2010-02-16 12:59:54 +0100 Robert Swain + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Improve seek behaviour for audio-only with no index + Instead of seeking to seek_time - 5s in the hope of hitting a keyframe + for video, we can just seek to seek_time instead. + +2010-02-16 00:24:32 +0000 Tim-Philipp Müller + + * configure.ac: + configure: fix up GST_CXXFLAGS properly + We don't want C specific flags in GST_CXXFLAGS, so base it on the + GST_CFLAGS that only contains the pkg-config CFLAGS but none of + the GST_OPTION_CFLAGS. Also, we only need the local includes once. + +2010-02-11 01:12:43 +0000 Tim-Philipp Müller + + * MAINTAINERS: + Update MAINTAINERS, add myself + +2010-02-15 23:16:32 +0200 Stefan Kost + + * configure.ac: + configure: base GST_CXXFLAGS on --cflags from pkg-config + pkg-config sets GST_CFLAGS and GST_LIBS. We need to use CFLAGS as a starting + point for for both C and CXX settings. + +2010-02-14 23:18:44 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 96dc793 to 44ecce7 + +2010-02-01 01:33:22 +0000 Tim-Philipp Müller + + * Makefile.am: + * configure.ac: + * win32/common/.gitignore: + * win32/common/config.h: + win32: change how win32/common/config.h is updated + Generate win32/common/config.h-new directly from config.h.in, + using shell variables in configure and some hard-coded information. + Change top-level makefile so that 'make win32-update' copies the + generated file to win32/common/config.h, which we keep in source + control. It's kept in source control so that the git tree is + buildable from VS. + This change is similar to the ones applied a while ago to GStreamer + core, gst-plugins-base and gst-plugins-good and prevents configure + from changing files in source control. The generated config.h + should be ok, but needs testing. + +2010-01-31 13:03:33 +0000 Tim-Philipp Müller + + * gst/realmedia/rtspreal.c: + rtspreal: don't construct config header with uninitialised bytes + Turns out 4 + 4 + 2 + (4 * 2) is actually 18 and not 22. This avoids + a presumably unintentional padding of uninitialised bytes at the end + of the CONT tags chunk, which should be harmless but causes warnings + in valgrind (see #608533 for a test URL). + +2010-01-30 19:12:24 +0000 Tim-Philipp Müller + + * gst/realmedia/rtspreal.c: + rtspreal: add finalize function so we can free streams and rulebook + Fix memory leak in Real RTSP component (#608533). + +2010-01-30 19:10:45 +0000 Tim-Philipp Müller + + * gst/realmedia/rtspreal.c: + rtspreal: fix minor memory leak + Caps take their own reference when a buffer is added to them, so + unref buffer after adding it to caps (#608533). + +2010-01-30 19:06:34 +0000 Tim-Philipp Müller + + * gst/realmedia/rdtdepay.c: + rdtdepay: unref input buffer when done + Fixes memory leak, see #608533. + +2010-01-30 15:19:56 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 15d47a6 to 96dc793 + +2010-01-29 19:47:03 +0100 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: make use of Access Unit delimiters configurable + API: GstX264Enc:aud + +2010-01-22 15:40:28 -0300 Thiago Santos + + * gst/asfdemux/asfpacket.c: + asfdemux: Do not subtract padding twice + Only subtract implicit padding if an explicit one isn't + provided. Avoids subtracting it twice and causing + parsing errors. + Fixes #607698 + +2010-01-22 16:55:14 +0200 Stefan Kost + + * gst/asfdemux/gstasfdemux.c: + * gst/mpegstream/gstmpegpacketize.c: + assert: g_assert_not_reached() cannot replace return statement + Fix build with assert being turned off. + +2010-01-20 00:55:12 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 14cec89 to 15d47a6 + +2010-01-18 18:01:55 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't forget to update flow variable + Forgot to update the return value in the loop. + +2010-01-18 17:49:06 +0100 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Check flow return on every push + We previously only aggregated flow returns after the while(push) loop, + which meant that in some cases we would end-up not properly aggregating + the flow returns. + This is based on the same flow aggregation algorithm as oggdemux. + +2010-01-11 16:14:44 -0300 Thiago Santos + + * ext/x264/gstx264enc.c: + x264enc: Add stream-format to output caps + Adds stream-format to output caps of x264enc that + informs if the stream is in bytestream of avc format. + Fixes #606662 + +2010-01-11 12:23:35 +0100 Arnaud Patard + + * gst/mpegaudioparse/gstxingmux.c: + xingmux: Fix unaligned memory access + ARM/SPARC need 32bit alignment but xingmux accesses possibly + unaligned memory, which leads to SIGBUS. + Fixes bug #586464. + +2010-01-07 14:36:47 -0800 Michael Smith + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Use GST_STR_NULL in a couple of places. + Fixes crashing on some of the log statements on win32. + +2010-01-07 16:36:08 -0300 Thiago Santos + + * gst/realmedia/rmdemux.c: + rmdemux: Parse and post bitrate for streams + Parse the bitrate of the streams and post their tags. + Fixes #599299 + +2010-01-07 13:54:21 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Post bitrate tag + If stream bitrate object is available, post the bitrate + tags. + Fixes #599297 + +2010-01-04 15:19:25 +0100 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: minor validation check of (Xing, VBRI) metadata + ... to detect e.g. a truncated file, rendering some of the metadata invalid. + +2010-01-04 14:59:06 +0100 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: use proper total_time and total_bytes in various cases + The correct basis for (Xing, VBRI) seek table calculations is the + byte size and duration provided by that metadata, rather than some + other (possibly even estimated) one. This also prevents an infinite + conversion loop in (unlikely) case where a TOC is provided without + such corresponding (duration) metdata. + +2009-12-08 19:55:04 -0300 Thiago Santos + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: conserve stop time for non-accurate seek + Use the same strategy as accurate seeks to store + pending non-accurate seeks to avoid overwriting non-definite + stop times. When doing non-accurate seeks our position + reporting might drift off by some secs and the stream can + end up before it should. + Fixes #603695 + +2009-12-21 19:12:59 +0100 Mark Nauwelaerts + + * common: + Automatic update of common submodule + From 47cb23a to 14cec89 + +2009-12-18 16:04:12 +0000 Tim-Philipp Müller + + * ext/amrwbdec/amrwb.c: + amrwbdec: give decoder a rank so decodebin/playbin will use it + +2009-12-08 19:01:50 -0300 Thiago Santos + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: return false when we can't seek + When upstream can't seek, we return false as well + +2009-12-02 11:21:22 -0300 Thiago Santos + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: Avoid crash when seeking before negotiating + lame's 'lgv' variable is only initialized when the caps + is negotiated, whenever a seek happens before that, it would + attempt to call a function on an empty pointer, causing the crash. + Fixes #603515 + +2009-12-01 15:08:07 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 87bf428 to 47cb23a + +2009-12-01 14:17:50 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From da4c75c to 87bf428 + +2009-11-27 18:56:13 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 53a2485 to da4c75c + +2009-11-26 15:54:45 +0100 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: fix non-flushing seek + Specifically, in addition to clearing lots of variables/offsets + when receiving newsegment, also clear leftover data to match. + +2009-11-20 21:32:31 -0500 Olivier Crête + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + x264enc: Make upstream GstForceKeyUnit thread-safe + Also send the GstForceKeyUnit event downstream when an upstream on is received, + allowing muxers or payloaders to take appropriate actions. + https://bugzilla.gnome.org/show_bug.cgi?id=602556 + +2009-11-19 10:31:25 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From a3e3ce4 to 53a2485 + +2009-11-18 09:58:39 +0100 Benjamin Gaignard + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Don't call strlen() on NULL pointers + Fixes bug #602280. + +2009-11-09 15:02:05 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Remove old pads when new ones are added + The old pads were being removed before adding the new ones, + we should add the new ones first. + Fixes #599718 + +2009-11-09 13:30:45 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Handle chained asfs on pull mode + Adds chained asfs handling to pull mode. It now checks if + there is a new asf header after the last packet (when it + is possible to know how many packets are) or it tries + checking if a processed packet that fails is an header + object. + Fixes #599718 + +2009-11-09 10:24:46 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: properly do chained asfs on push mode + To properly do chained asfs work with playbin2, we need to + push eos on the old pads before removing them. + Fixes #599718 + +2009-10-27 17:48:03 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: add support for chained asfs (push mode) + Adds support for detecting and playing chained asfs + in push mode. asfdemux tries to detect a new asf start + by identifying the header object guid in a input buffer. + When it finds it, it resets its state, removing its pads + and creates new ones for the new file. + +2009-11-05 18:33:09 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix two small leaks + +2009-11-05 18:19:58 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: prefer WM/TrackNumber over WM/Track, it's more reliable + WM/Track has a 0 base but is often wrongly written as starting from 1, + so not as reliable as WM/TrackNumber which always starts from 1. + +2009-11-05 18:11:55 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: WM/Track starts counting from 0, adjust to start from 1 + +2009-11-05 18:11:14 +0000 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: map WM/TrackNumber to GST_TAG_TRACK_NUMBER as well + There's both WM/Track and WM/TrackNumber. + +2009-11-04 15:52:09 +0000 Jan Schmidt + + * ext/a52dec/gsta52dec.c: + a52dec: Fix debug statement: Pass pos variable instead of time() function + +2009-11-04 15:50:17 +0000 Jan Schmidt + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Fix printf format string warning + +2009-11-04 15:46:04 +0000 Jan Schmidt + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix bogus variable used uninitialised warnings + +2009-11-04 13:55:39 +0000 Jan Schmidt + + * po/Makevars: + po: Don't create backup .po files + As well as preventing creation of useless backup files, it works + around a bug in gettext 0.17 on OS/X + +2009-10-29 11:39:13 -0700 Michael Smith + + * gst/asfdemux/asfpacket.c: + asfdemux: fix c99-style comments. + +2009-10-29 10:34:17 -0700 Michael Smith + + * gst/asfdemux/asfpacket.c: + asfdemux: accept fragments in a continued packet where the subsequent fragments declare a size of 0. Fixes bug 600037. + +2009-10-27 12:33:24 +0100 Wim Taymans + + * gst/realmedia/rmutils.c: + rmutils: fix byteswapping + fix the byteswapping code that was wrong because of the side effects of the + READ/WRITE macros. + Fixes #599676 + +2009-10-20 20:00:44 +0100 Robert Swain + + * ext/x264/gstx264enc.c: + x264enc: Adapt to slightly modified x264 API + Fixes #599095. + +2009-10-26 17:31:19 -0300 Thiago Santos + + * gst/asfdemux/asfpacket.c: + asfdemux: careful to avoid crash on bogus data + When receiving bogus data, we have to avoid subtracting a value + larger than 'size' from 'size' variable, resulting in a wrap + that would make 'size' a really large bogus value. + Fixes #599333 + +2009-10-26 00:56:37 +0000 Jan Schmidt + + * win32/common/config.h: + win32: Commit bumped version number + +2009-10-17 13:46:13 +0200 Edward Hervey + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: Don't use expensive glib ways to get an enum nick. + Fixes #598761 + This removes a good 50% of processing time for parsing a buffer. + We do this by simply... getting the nicks that we already have handy + instead of going through the expensive glib system. + +2009-10-24 20:36:41 +0200 Edward Hervey + + * configure.ac: + configure.ac: And back to development we go... + +=== release 0.10.13 === + +2009-10-21 17:16:00 +0100 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * gst-plugins-ugly.doap: + * win32/common/config.h: + Release 0.10.13 + +2009-10-21 17:02:42 +0100 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2009-10-16 10:16:55 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 85d1530 to 0702fe1 + +2009-10-15 23:56:55 +0100 Jan Schmidt + + * ChangeLog: + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + 0.10.12.3 pre-release + +2009-10-14 10:41:48 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From a3e3ce4 to 85d1530 + +2009-10-13 13:05:32 +0100 Jan Schmidt + + * ext/a52dec/gsta52dec.c: + a52dec: Fix reference leak on all input buffers in 'dvd mode' + https://bugzilla.gnome.org/show_bug.cgi?id=598272 + +2009-10-12 13:54:27 +0100 Jan Schmidt + + * ChangeLog: + * configure.ac: + * po/LINGUAS: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/ms.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + 0.10.12.2 pre-release + +2009-10-12 11:31:22 +0100 Jan Schmidt + + * docs/plugins/gst-plugins-ugly-plugins.args.new: + * docs/plugins/gst-plugins-ugly-plugins.signals.new: + docs: Remove files accidentally added + Remove the gst-plugins-ugly-plugins.args.new and + gst-plugins-ugly-plugins.signals.new files, that appear + to have been accidentally added in commit + f5d046a0b034f9bd7274291f7131ee5db1a30052 + +2009-09-16 00:00:28 +0100 Jan Schmidt + + * ext/a52dec/gsta52dec.c: + a52dec: Add some debugging for new segment events + +2009-10-11 16:18:37 +0200 Josep Torra + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: fix warning in macosx snow leopard + +2009-10-11 16:16:09 +0200 Josep Torra + + * gst/mpegstream/gstmpegparse.c: + mpegstream: fix warning in macosx snow leopard + +2009-10-11 16:14:08 +0200 Josep Torra + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: fix warning in macosx snow leopard + +2009-10-11 16:09:11 +0200 Josep Torra + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: fix warning on macosx snow leopard + +2009-10-11 16:06:25 +0200 Josep Torra + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix warning in macosx snow leopard + +2009-10-08 19:58:25 +0300 René Stadler + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: don't fail SEEKING query when upstream query fails for TIME format + +2009-10-08 11:01:03 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 19fa4f3 to a3e3ce4 + +2009-10-07 14:22:09 +0300 Stefan Kost + + * gst/asfdemux/gstasfdemux.c: + * gst/realmedia/rdtmanager.c: + build: fprintf, sprintf, sscanf need stdio.h + +2009-10-02 18:27:11 +0300 Stefan Kost + + * ext/mad/gstmad.c: + mad: add missing include to fix the build + +2009-10-05 12:13:51 +0200 Wim Taymans + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcm: whitespace fixes + +2009-10-04 22:51:41 +0100 Christian F.K. Schaller + + * gst-plugins-ugly.spec.in: + update spec file + +2009-10-02 15:22:38 +0200 Mark Nauwelaerts + + * configure.ac: + x264enc: adjust configure checking to changed upstream + +2009-10-01 18:58:42 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + x264enc: conditionally adjust to new upstream API + Fixes #596517. + +2009-09-24 17:49:52 +0200 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mpegaudioparse: prevent infinite (re)syncing + Conflicts: + gst/mpegaudioparse/gstmpegaudioparse.c + +2009-09-22 12:13:38 -0700 Michael Smith + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: Refactor checking for sync. Make resyncing more reliable. + Previously, we could get false sync relatively easily - it sometimes happened + on real files. This cleans the code up a fair bit, and makes it require more + confirmation that we've found valid sync before continuing. + +2009-09-17 16:12:29 +0200 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: ensure 2 valid headers in a row when resyncing + +2009-09-11 10:05:02 +0100 Tim-Philipp Müller + + * gst/mpegstream/gstdvddemux.c: + dvddemux: remove bogus ifndef + +2009-09-05 10:23:49 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 94f95e3 to 19fa4f3 + +2009-09-01 12:22:39 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix GstIndex handling, incl. refcounting and NULL indizes + +2009-08-31 13:42:27 +0100 Tim-Philipp Müller + + * gst/dvdsub/gstdvdsubparse.c: + dvdsubparse: GstAdapter is not a GstObject and should be freed with g_object_unref + +2009-08-24 13:59:05 -0700 David Schleef + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + Remove Ronald Bultje from Authors field + Replaced with "GStreamer maintainers + " or just removed, + depending on the number of other authors. + +2009-08-24 13:57:14 -0700 David Schleef + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstasfmux.c: + * gst/asfdemux/gstasfmux.h: + asfdemux: Remove old non-built asfmux code + Remove so people don't confuse it with the new asfmux code + in -bad. + +2009-08-23 13:35:46 +0200 Sebastian Dröge + + * ext/a52dec/gsta52dec.c: + a52dec: Only add the MM_ACCEL_DJBFFT flag if it's defined + It's not defined for older liba52 versions. + +2009-08-23 13:34:32 +0200 Mart Raudsepp + + * ext/a52dec/gsta52dec.c: + a52dec: Allow liba52 to use djbfft based IMDCT transform + liba52 in a52dec-0.7.4 does not have any MMX, MMXEXT or 3DNOW based + IMDCT transform acceleration. It does however have a software based + acceleration using the djbfft library (D.J. Bernstein's library for + fourier transforms - Extremely fast library for floating-point + convolution). So allow liba52 to use it through the MM_ACCEL_DJBFFT + flag. + The liba52 copy in MPlayer sources does have SSE, 3dnowext, 3dnow + and AltiVec implementations, but those are checked for first, and + djbfft is chosen only if none of those is available - good in the + case of some distributions including a port of the MPlayer changes + in their system a52dec library. + The down and upmix code in liba52 doesn't seem to be disturbed by + this additional MM_ACCEL flag and will still use MMX, SSE or 3DNOW + versions if passed from oil_cpu_get_flags (SSE currently is not). + Fixes bug #592787. + +2009-08-17 17:31:10 +0200 Sebastian Dröge + + * configure.ac: + amr: Use opencore-amr pkg-config files if possible + This makes it possible to build the plugins when the libraries + are installed at non-standard locations. + Fixes bug #591348. + +2009-08-14 12:07:40 +0200 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: use metadata (xing, vbri) provided bytesize for conversions + Metadata provided seek tables are consistent with metadata's view of + total size, which typically matches real size, but need not do so + (e.g. a truncated file). Fixes seeking and position reporting + in such truncated files (although duration based on metadata may then + still be incorrect). + +2009-08-10 22:22:39 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump core/base requirements to released versions + to avoid confusion. + +2009-08-04 10:44:43 +0200 Sebastian Dröge + + * configure.ac: + configure: Remove all mentions to the id3tag plugin which was removed + +2009-08-01 08:43:21 +0200 Marvin Schmidt + + * configure.ac: + mad: make check for mad independent of the check for id3tag + Fixes bug #590432. + +2009-07-31 00:25:43 -0300 Thiago Santos + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: set padding size to the correct value + asf packets in rtp packets should come with their padding fields + set to 0 and the depayload must update them to the correct + value before pushing downstream + +2009-07-27 20:12:20 +0200 Iago Toral + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-amrwbdec.xml: + * ext/Makefile.am: + * ext/amrnb/GstAmrnbEnc.prs: + * ext/amrnb/Makefile.am: + * ext/amrnb/README: + * ext/amrnb/amrnb.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbenc.h: + * ext/amrnb/amrnbparse.c: + * ext/amrnb/amrnbparse.h: + * ext/amrwbdec/Makefile.am: + * ext/amrwbdec/README: + * ext/amrwbdec/amrwb.c: + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + amr: Add AMR-WB decoder and AMR-NB encoder and decoder + These are based on the OpenCore codecs. + Fixes bug #584890. + +2009-07-24 00:43:07 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From fedaaee to 94f95e3 + +2009-07-22 11:10:38 +0100 Tim-Philipp Müller + + * LICENSE_readme: + * REQUIREMENTS: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins.args.new: + * docs/plugins/gst-plugins-ugly-plugins.signals.new: + * docs/plugins/inspect/plugin-dvdnav.xml: + * ext/Makefile.am: + * ext/dvdnav/.gitignore: + * ext/dvdnav/Makefile.am: + * ext/dvdnav/README: + * ext/dvdnav/dvdnavsrc.c: + * ext/dvdnav/dvdnavsrc.h: + * ext/dvdnav/gst-dvd: + * ext/dvdread/dvdreadsrc.c: + * gst-plugins-ugly.spec.in: + * po/POTFILES.in: + dvdnav: remove dvdnav plugin + Remove dvdnav plugin, it has no future. resindvd is the plugin to + use for dvd playback. Note that dvdnav was never really enabled + in -ugly, you had to edit configure.ac to get it built. + +2009-06-20 14:31:06 +0200 Sebastian Dröge + + * tests/check/elements/mpeg2dec.c: + mpeg2dec: Fix unused variables compiler warnings in unit test + +2009-06-26 15:21:12 +0100 Jan Schmidt + + * autogen.sh: + autogen.sh: Use printf instead of 'echo -n'. Check for automake-1.1[01] + Check for more automake command variants. Use printf instead of 'echo -n' + for portability + +2009-07-13 12:24:14 -0400 Olivier Crête + + * common: + Automatic update of common submodule + From 5845b63 to fedaaee + +2009-02-10 13:25:54 +0000 Tim-Philipp Muller + + * .gitignore: + Make git ignore more files + +2009-06-29 11:10:42 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Refactor multiple packet pull. + This also fixes a bug by which the first buffer (in a multi-packet mode) + passed to asf_demux_parse_packet() would have a GST_BUFFER_SIZE of the + full incoming buffer and not just of the single asf packet. + Fixes corrupted frames introduced by latest commit. + +2009-06-29 10:58:49 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asfdemux: use the right accurate field + Remove accurate variable and its faulty use because the real variable is an + instance variable. + +2009-06-28 17:48:11 +0200 Edward Hervey + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + asfdemux: Sprinkle branch prediction macros accross the code + +2009-06-28 17:43:12 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Delay newsegment handling until we have a keyframe. + We now have a chance for packets to be collected before we send out the + newsegment. If we're not in accurate seeking (keyunit) it will set + the segment start/time to the keyframe's timestamp. + +2009-06-28 17:39:23 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Remove useless check. We already have checked for it above. + +2009-06-28 17:31:11 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: No longer queue GOPs now that seeking is fixed. + We now *always* seek to the keyframe just before our requested position. + When we encounter the first keyframe and we were not accurate (therefore doing + keyframe seeking), we update the segment start position to the keyframe timestamp. + +2009-06-28 17:42:44 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Store the accurate seeking flag + +2009-06-28 17:04:00 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Use the average frame duration for buffers without a duration. + This will still cause some timestamp jitter, but giving a hint as to the duration + rather than nothing seems to be a better idea. + Also, this allows some scenarios (like remuxing with asfmux) to estimate the total + duration using the accumulated packet duration (which will be correct). + +2009-06-28 17:02:17 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Use index entry packet count to optimize seeking. + The simple index entries also contain the number of packets one needs + to retrieve at a given position to get a full keyframe. We therefore + use that information to retrieve all those packets in one buffer when + working in pull-mode. + +2009-06-26 20:52:29 -0300 Thiago Santos + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Do not try to free const pointer + In gst_asf_demux_chain_headers, when 'goto wrong_type' was called + asfdemux tried to free a const pointer that had been cast to a + normal pointer variable. + +2009-06-26 20:44:09 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Use presentation timestamp when searching in the index. + We need to take the preroll into account... else we end up too early. + +2009-06-26 13:43:16 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From f3bb51b to 5845b63 + +2009-06-26 13:35:38 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Convert index entry from presentation time to timestamps. + We weren't taking the preroll into account previously, meaning that we + were always seeking preroll nanoseconds too early... resulting in a lot + of dropped packets (which are before the start time). + This brings quit a bit closer to as-fast-as-possible seeking in asf files. + +2009-06-26 10:58:56 +0200 Edward Hervey + + * common: + * gst/asfdemux/gstasfdemux.c: + asfdemux: Fix byte array metadata handling. + We basically discard byte array metadata. Should be trivial to adapt + to storing the pointers if we need it later on. + +2009-06-26 10:41:28 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Handle PAR/interlaced information stored in packet payload. + This is the 'other' way to store non 1/1 PAR in asf streams (by storing it + in the ASF Packet payload extensions). + +2009-06-26 10:40:39 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: Store/Handle global metadata (not specific to one stream). + This allows us to store (and handle) PAR information which might be stored there. + +2009-06-25 18:24:56 +0200 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: fix Xing inverse seek table building + +2009-06-24 15:15:37 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From f3bb51b to f810030 + +2009-06-23 16:45:00 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: don't try to free a NULL taglist + +2009-06-23 02:14:00 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: post tags only after we've created our source pads + Post global tags only after we've added our source pads, so that + tag events get sent downstream in addition to tag messages posted + on the bus. This makes sure tags can be picked up automatically + when transcoding, but also by tagreadbin/playbin2. Fixes #519721. + While we're at it, also add a container-format tag. + +2009-06-23 01:37:01 +0100 Tim-Philipp Müller + + * configure.ac: + * gst/asfdemux/gstasfdemux.c: + asfdemux: use new bytereader functions for image tag parsing + +2009-06-22 18:53:56 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: remove some more unused variables + +2009-06-19 17:25:58 +0200 Mark Nauwelaerts + + * gst/realmedia/rmdemux.c: + rmdemux: plug buffer leaking + +2009-06-22 17:36:21 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: guard against dropped buffers + If a buffer was dropped, we might request data from the adapter that is not + there and then we get a NULL buffer. + +2009-06-22 17:16:58 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: set DISCONT on streams + When we receive a DISCONT as input, don't clear our complete state but simply + mark a discont that will be put on the next buffer. The code will be able to + handle and throw away incomplete data. + Add some more debug info. + Remove an unused variable. + +2009-06-22 17:15:52 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: set DELTA_UNIT flag correctly + Only set the DELTA_UNIT flag when we are not dealing with a keyframe. + Add some more debug info. + +2009-06-22 13:37:58 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix latency calculations + We need to check for -1 as an invalid timestamp, not 1. + +2009-06-16 09:45:59 +0100 Tim-Philipp Müller + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: don't put every single frame into the index + Let's not put every single mp3 frame in our index, a few frames per + second should be more than enough. For now use an index interval + of 100ms-500ms depending on the upstream size, to keep the index at + a reasonable size. Factor out the code that adds the index entry + into a separate function for better code readability. + +2009-06-16 01:40:42 +0100 Tim-Philipp Müller + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: assume seekability only if we know the upstream size + While technically upstream may be seekable even if it doesn't know + the exact size, I can't think of a use case where this distincation + is relevant in practice, so for now just assume we're not seekable + if upstream doesn't provide us with a size. Makes sure we don't + build a seek index when streaming internet radio with sources that + pretend to be seekable until you try to actually seek. + +2009-06-19 17:46:12 +0100 Christian Schaller + + * gst-plugins-ugly.spec.in: + Fix x264 requirement in SPEC file + +2009-06-19 15:01:46 +0100 Tim-Philipp Müller + + * ext/x264/gstx264enc.c: + * gst/realmedia/rdtmanager.c: + x264enc, rdtmanager: fix compilation with debugging disabled + +2009-06-11 13:48:22 +0100 Jan Schmidt + + * common: + * docs/plugins/Makefile.am: + docs: Bump common. Fix comment in the docs Makefile.am + +2009-06-18 20:26:04 +0100 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + Back to development -> 0.10.12.1 + +2009-06-18 08:54:17 +0100 Jan Schmidt + + * gst-plugins-ugly.doap: + Add 0.10.12 release to the doap file + +=== release 0.10.12 === + +2009-06-18 08:34:54 +0100 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * docs/plugins/inspect/plugin-x264.xml: + * win32/common/config.h: + Release 0.10.12 + +2009-06-18 08:34:46 +0100 Jan Schmidt + + * po/bg.po: + * po/id.po: + * po/it.po: + * po/nl.po: + * po/zh_CN.po: + Update .po files + +2009-06-18 08:04:40 +0100 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2009-06-05 22:10:02 +0100 Jan Schmidt + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + 0.10.11.2 pre-release + +2009-06-05 22:07:31 +0100 Jan Schmidt + + * win32/common/config.h.in: + win32: Remove #undef inline from the win32 config.h + +2009-06-05 20:53:57 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-mad.xml: + * ext/mad/Makefile.am: + * ext/mad/gstid3tag.c: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + mad, id3mux: (re)move broken, unmaintained and unloved id3mux element + It will be reborn with a shiny new code base under its hood in -bad. + See #581756 and #565764. + +2009-06-05 19:48:28 +0100 Jan Schmidt + + * tests/check/pipelines/.gitignore: + gitignore: Ignore some built files in the test area + +2009-06-05 19:46:17 +0100 Jan Schmidt + + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + docs: Update plugin inspect files + +2009-06-05 19:25:54 +0100 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-x264.xml: + * ext/Makefile.am: + * gst-plugins-ugly.spec.in: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + Moved 'x264enc' from -bad to -ugly + +2009-05-25 11:18:57 +0200 Wim Taymans + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + [MOVED FROM BAD 28/28] x264enc: add multipass-cache-file property + Fixes #583627 + +2009-05-09 23:47:39 +0100 Christian Schaller + + * ext/x264/GstX264Enc.prs: + [MOVED FROM BAD 27/28] Remove wrong stuff from preset file + +2009-05-09 12:42:25 +0100 Christian Schaller + + * ext/x264/GstX264Enc.prs: + [MOVED FROM BAD 26/28] Add a more representative example preset file for x264 + +2009-05-07 17:53:42 +0100 Christian Schaller + + * ext/x264/gstx264enc.c: + [MOVED FROM BAD 25/28] Add ranks to various muxers and encoders in -bad + +2009-04-30 00:06:36 +0300 Stefan Kost + + * ext/x264/GstX264Enc.prs: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: + [MOVED FROM BAD 24/28] x264enc: add preset support + Add preset iface and a (dummy) preset file as a starting point. + +2009-04-29 16:57:36 +0200 Mark Nauwelaerts + + * ext/x264/gstx264enc.c: + [MOVED FROM BAD 23/28] x264enc: add some documentation on profile + +2009-04-09 23:53:39 +0200 Janin Kolenc + + * ext/x264/gstx264enc.c: + * ext/x264/gstx264enc.h: + [MOVED FROM BAD 22/28] x264enc: add force keyframe event handling + Use the GstForceKeyUnit event to force a keyframe. + Fixes #578112. + +2009-01-05 10:28:58 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 21/28] ext/x264/gstx264enc.c: Use hyphen in property name, perform safety buffer size check prior to mem access, and some mo... + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_class_init), + (gst_x264_enc_header_buf), (gst_x264_enc_encode_frame): + Use hyphen in property name, perform safety buffer size check + prior to mem access, and some more parentheses in macro. + +2009-01-02 01:44:11 +0000 Alessandro Decina + + [MOVED FROM BAD 20/28] ext/apexsink/Makefile.am: Link against -lgcrpyto for RSA_new and RSA_free. + Original commit message from CVS: + * ext/apexsink/Makefile.am: + Link against -lgcrpyto for RSA_new and RSA_free. + * ext/faac/gstfaac.c: + * ext/x264/gstx264enc.c: + Fix compiler warnings. + +2008-11-14 19:52:24 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 19/28] ext/x264/gstx264enc.c: Construct source caps in more conventional (and correct) manner. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps): + Construct source caps in more conventional (and correct) manner. + +2008-11-04 12:42:30 +0000 Stefan Kost + + [MOVED FROM BAD 18/28] Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-10-27 17:01:22 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 17/28] ext/x264/gstx264enc.c: Adapt to slightly modified x264 API. Fixes #555238. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_init_encoder): + Adapt to slightly modified x264 API. Fixes #555238. + +2008-08-12 16:13:15 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 16/28] ext/x264/gstx264enc.*: Do not deal with duplicated input (timestamps). If needed, a generic element can do so. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_reset), + (gst_x264_enc_chain), (gst_x264_enc_encode_frame): + * ext/x264/gstx264enc.h: + Do not deal with duplicated input (timestamps). If needed, + a generic element can do so. + Do not manipulate input timestamps on the way out, + since that shifts the timeline and A/V sync. + +2008-08-12 15:41:48 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 15/28] docs/plugins/gst-plugins-bad-plugins.args: Integrate new properties into documentation. + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins.args: + Integrate new properties into documentation. + * ext/x264/gstx264enc.c: (gst_x264_enc_class_init), + (gst_x264_enc_init), (gst_x264_enc_init_encoder), + (gst_x264_enc_set_property), (gst_x264_enc_get_property): + Fix up API prior to eventual plugin move. + API: GstX264Enc:pass (provides more options, and changed to enum) + +2008-08-12 13:08:39 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 14/28] Add documentation and unit test for x264enc. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * ext/x264/gstx264enc.c: + * tests/check/Makefile.am: + * tests/check/elements/x264enc.c: (setup_x264enc), + (cleanup_x264enc), (GST_START_TEST), (x264enc_suite), (main): + Add documentation and unit test for x264enc. + +2008-08-11 17:24:58 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 13/28] ext/x264/gstx264enc.c: Allocate some buffers in more adaptive and economical fashion. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_init), + (gst_x264_enc_header_buf), (gst_x264_enc_encode_frame): + Allocate some buffers in more adaptive and economical fashion. + +2008-08-11 15:16:14 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 12/28] configure.ac: Check for sufficiently up-to-date x264 API. + Original commit message from CVS: + * configure.ac: + Check for sufficiently up-to-date x264 API. + * ext/x264/gstx264enc.c: (gst_x264_enc_pass_get_type), + (gst_x264_enc_base_init), (gst_x264_enc_class_init), + (gst_x264_enc_init), (gst_x264_enc_init_encoder), + (gst_x264_enc_set_property), (gst_x264_enc_get_property): + * ext/x264/gstx264enc.h: + Expose some more parameters of the x264 encoder as properties. + +2008-08-08 15:07:12 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 11/28] ext/x264/gstx264enc.c: Coding style and layout; re-order some functions in more typical and natural flow. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_log_callback), + (gst_x264_enc_finalize), (gst_x264_enc_header_buf), + (gst_x264_enc_set_src_caps), (gst_x264_enc_sink_set_caps), + (gst_x264_enc_flush_frames): + Coding style and layout; re-order some functions in more + typical and natural flow. + +2008-08-08 14:19:16 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 10/28] ext/x264/: Use GQueue in stead of custom queue code. + Original commit message from CVS: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps), + (gst_x264_enc_sink_set_caps), (gst_x264_enc_init), + (gst_x264_enc_reset), (gst_x264_enc_finalize), + (gst_x264_enc_flush_frames), (gst_x264_enc_sink_event), + (gst_x264_enc_chain), (gst_x264_enc_encode_frame), + (gst_x264_enc_change_state), (gst_x264_enc_set_property): + * ext/x264/gstx264enc.h: + Use GQueue in stead of custom queue code. + Factorize flushing out encoder delayed frames. + Factorize initialization and state change reset. + +2008-08-08 10:56:02 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 09/28] Use configure-generated _stdint.h. + Original commit message from CVS: + * ext/x264/gstx264enc.h: + * sys/fbdev/gstfbdevsink.c: + Use configure-generated _stdint.h. + +2008-08-08 10:13:36 +0000 Mark Nauwelaerts + + [MOVED FROM BAD 08/28] ext/x264/: Use video format library and GST_WRITE_*_BE macros where applicable. + Original commit message from CVS: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: (gst_x264_enc_header_buf), + (gst_x264_enc_sink_set_caps), (gst_x264_enc_base_init), + (gst_x264_enc_class_init), (gst_x264_enc_log_callback), + (gst_x264_enc_init), (gst_x264_enc_init_encoder), + (gst_x264_enc_finalize), (gst_x264_enc_chain), + (gst_x264_enc_encode_frame), (plugin_init): + * ext/x264/gstx264enc.h: + Use video format library and GST_WRITE_*_BE macros where applicable. + Use finalize in stead of dispose. + Set up debug category and log callback. + +2008-06-04 11:33:21 +0000 Tim-Philipp Müller + + [MOVED FROM BAD 07/28] ext/x264/gstx264enc.c: Try harder not to crash when we get an EOS event but haven't set up the encoder yet (as may ha... + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_header_buf), + (gst_x264_enc_sink_event), (gst_x264_enc_chain), + (gst_x264_enc_encode_frame): + Try harder not to crash when we get an EOS event but haven't set + up the encoder yet (as may happen when upstream errors out with + not-negotiated, for example). Also, always push the EOS event + downstream. + +2007-12-11 16:26:07 +0000 Wim Taymans + + [MOVED FROM BAD 06/28] ext/x264/gstx264enc.c: Fix caps memleak. + Original commit message from CVS: + * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps): + Fix caps memleak. + +2007-10-26 17:18:41 +0000 Tim-Philipp Müller + + [MOVED FROM BAD 05/28] ext/x264/gstx264enc.c: Fix build against the libx264 version that ships with debian stable. + Original commit message from CVS: + * ext/x264/gstx264enc.c: + Fix build against the libx264 version that ships with debian stable. + +2007-09-24 10:53:37 +0000 Stefan Kost + + [MOVED FROM BAD 04/28] Massive leak fixing, plus code cleanups. + Original commit message from CVS: + * ext/audioresample/gstaudioresample.c: + * ext/x264/gstx264enc.c: + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstdvdspu.h: + * gst/festival/gstfestival.c: + * gst/h264parse/gsth264parse.c: + * gst/mpegtsparse/mpegtspacketizer.c: + * gst/mpegtsparse/mpegtsparse.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/nuvdemux/gstnuvdemux.c: + * sys/dshowsrcwrapper/gstdshowaudiosrc.c: + * sys/dshowsrcwrapper/gstdshowvideosrc.c: + * sys/vcd/vcdsrc.c: + Massive leak fixing, plus code cleanups. + +2007-07-18 07:35:32 +0000 Stefan Kost + + [MOVED FROM BAD 03/28] Add stdlib include (free, atoi, exit). + Original commit message from CVS: + * examples/app/appsrc_ex.c: + * examples/switch/switcher.c: + * ext/neon/gstneonhttpsrc.c: + * ext/timidity/gstwildmidi.c: + * ext/x264/gstx264enc.c: + * gst/mve/mveaudioenc.c: (mve_compress_audio): + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/spectrum/demo-audiotest.c: + * gst/spectrum/demo-osssrc.c: + * sys/dvb/gstdvbsrc.c: + Add stdlib include (free, atoi, exit). + +2007-05-15 21:23:53 +0000 Stefan Kost + + [MOVED FROM BAD 02/28] ext/x264/gstx264enc.c (gst_x264_enc_init_encoder): This needs a version check. + Original commit message from CVS: + * ext/x264/gstx264enc.c (gst_x264_enc_init_encoder): + This needs a version check. + * gst/bayer/Makefile.am: + Fix the build. + +2007-03-25 13:06:26 +0000 Michal Benes + + [MOVED FROM BAD 01/28] Add libx264-based h264 encoder plugin (#421110). Probably doesn't handle 'odd' widths and heights correctly yet. + Original commit message from CVS: + Patch by: Michal Benes + Patch by: Josef Zlomek + * configure.ac: + * ext/Makefile.am: + * ext/x264/Makefile.am: + * ext/x264/gstx264enc.c: (gst_x264_enc_me_get_type), + (gst_x264_enc_analyse_get_type), + (gst_x264_enc_timestamp_queue_init), + (gst_x264_enc_timestamp_queue_free), + (gst_x264_enc_timestamp_queue_put), + (gst_x264_enc_timestamp_queue_get), (gst_x264_enc_header_buf), + (gst_x264_enc_set_src_caps), (gst_x264_enc_sink_set_caps), + (gst_x264_enc_base_init), (gst_x264_enc_class_init), + (gst_x264_enc_init), (gst_x264_enc_init_encoder), + (gst_x264_enc_close_encoder), (gst_x264_enc_dispose), + (gst_x264_enc_sink_event), (gst_x264_enc_chain), + (gst_x264_enc_encode_frame), (gst_x264_enc_change_state), + (gst_x264_enc_set_property), (gst_x264_enc_get_property), + (plugin_init): + * ext/x264/gstx264enc.h: + Add libx264-based h264 encoder plugin (#421110). Probably doesn't + handle 'odd' widths and heights correctly yet. + +2009-06-05 01:51:20 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: nicer metadata extraction of genre tags in some cases + Handle pseudo-strings like "(5)" and map them to the ID3v1 genre + that they presumably stand for. + +2009-06-05 01:32:07 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: parse WM/Picture tags to extract cover art + Fixes #583112. + +2009-05-31 20:20:30 +0100 Tim-Philipp Müller + + * REQUIREMENTS: + docs: fix http links for amr libs in REQUIREMENTS + +2009-05-29 20:07:14 +0100 Tim-Philipp Müller + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fix bogus flow return handling in eos handler + Don't overwrite the origin flow return by whatever flow we get + when trying to push the remaining internally queued payloads. + We want to do our eos logic, ie. send an EOS event or segment-done + message in any case. Makes things EOS properly when an EOS event + is forced upon the pipeline so that the source returns + FLOW_UNEXPECTED to a pulling asfdemux. Should fix #582056. + +2009-05-29 19:52:58 +0100 Tim-Philipp Müller + + * win32/common/config.h: + win32: update config.h + +2009-05-22 19:27:35 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump core/base requirements to released versions + +2009-05-22 19:26:27 +0100 Tim-Philipp Müller + + * autogen.sh: + * configure.ac: + autogen: move the -Wno-portability for automake into configure.ac + +2009-05-27 00:16:30 +0100 Jan Schmidt + + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: Add multichannel channel maps, and send some tags + Add a multichannel map to the output caps, and send at least a CODEC and + BITRATE tag. I'm not too sure about the 5.1 and 7.1 channel maps. I have + no samples and can't find info about the channel ordering, but this is + better than nothing. + +2009-05-26 17:19:54 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 888e0a2 to c572721 + +2009-05-22 10:20:46 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 6ab11d1 to 888e0a2 + +2009-05-21 15:18:06 +0100 Jan Schmidt + + * gst/dvdsub/gstdvdsubdec.c: + dvdsubdec: Remove some dead code + Remove some redundant memset - gobject memory is already initalised to 0. + Remove a commented out line leftover from the previous commit + +2009-05-21 14:20:22 +0100 Kapil Agrawal + + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubdec.h: + dvdsubdec: Support ARGB output + Negotiate to and render into ARGB buffers directly if the peer supports it. + Fixes: #580869 + +2009-05-19 00:51:49 +0100 Jan Schmidt + + * ext/a52dec/gsta52dec.c: + a52dec: Reconcile code with dtsdec + Perform some cleanups based on the dtsdec code such as using the boilerplate + macro and static pad template functions. + Add some documentation. Don't register a change in flags until we synch on + another frame successfully. + +2009-05-14 12:32:16 +0200 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Improve debugging a bit + +2009-05-13 19:32:16 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Revert ranking switch with ffdec_mpeg2video. Fixes #574461 + +2009-05-13 01:55:16 +0100 Tim-Philipp Müller + + * po/Makevars: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + po: avoid conflicts of local *.po files with files in git + Make it so that filenames and line numbers are only stored in the *.pot file + (which is not in git), but not in the individual *.po files. This information + is hardly useful for translators in our case, and it should avoid the constant + conflicts of local *.po files with the ones in git which are caused by the + source files changing and the line numbers being updated. This commit might + cause one last merge conflict for you, which you can work around with + "git checkout po/*.po" before merging or pulling. After that there should + (hopefully) not be any more local modifications of these files (unless + someone committed additions or changes to translated strings and the + *.po files haven't been updated yet, that is). + +2009-05-12 19:22:07 +0100 Tim-Philipp Müller + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: add Since tag to gtk-doc chunk + +2009-05-13 01:46:00 +0100 Tim-Philipp Müller + + * tests/check/elements/mpeg2dec.c: + checks: fix mpeg2dec unit test again after interlace addition to caps + +2009-05-12 20:34:20 +0200 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: work around old mpeg2dec versions + The repeat first field flag was introduced in 0.5.0 so conditionally disable its + detection and just assume no rff is used. This fixes the compilation. + Fixes #582375 + +2009-05-12 20:24:02 +0200 Wim Taymans + + * ext/mpeg2dec/Makefile.am: + mpeg2dec: link to gstvideo + Fix compilation by adding the right include directories and linking to the video + library. + +2009-05-12 11:57:04 +0200 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfdemux: Downgrade simple statements from WARNING to DEBUG + +2009-05-11 12:37:46 +0200 Edward Hervey + + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/asfpacket.h: + asf: Detect more payload extensions. + These should help fix interlaced/PAR issues with more files. + +2009-05-12 11:44:13 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + mpeg2dec: Implement interlaced support. + Expand the debugging statements to show more picture information. + +2009-05-12 11:19:00 +0200 Sebastian Dröge + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Lower rank to MARGINAL to make ffdec_mpeg2video the default + ffdec_mpeg2video is much faster, fixes bug #574461. + +2009-05-10 16:53:07 +0200 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Don't write a Xing header + +2009-05-10 11:17:25 +0200 Marc-Andre Lureau + + * autogen.sh: + Run libtoolize before aclocal + This unbreaks the build in some cases. Fixes bug #582021 + +2009-05-09 15:28:18 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: use 64bit safe scaling functions. + Got this to fail when seeking in a 14GB file (the value in bytes is + bigger than 2**32). + +2009-05-09 10:57:34 +0100 Tim-Philipp Müller + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: remove some pointless g_return_if_fail()s + +2009-05-08 14:24:47 +0100 Christian Schaller + + * ext/twolame/gsttwolame.c: + Switch twolame to primary rank + +2009-05-07 17:59:52 +0100 Christian Schaller + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + * ext/twolame/gsttwolame.c: + Add ranks to mp3 encoders + +2009-05-07 17:57:17 +0100 Christian Schaller + + * gst-plugins-ugly.spec.in: + Add twolame plugin to spec file + +2009-05-02 18:11:06 +0200 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: use upstream segment and timestamps for some interpolation + This should particularly help in case of upstream live src, e.g. rtspsrc, + and especially so if it has to perform fallback to TCP. + +2009-05-07 11:09:59 +0200 Edward Hervey + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: Add support for fragmented packet (L == 0). + This happens with rtp-over-udp. + +2009-05-07 10:10:02 +0200 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Fixup the bitrate only for CBR + Additionally clarify some property descriptions. + +2009-05-06 21:47:17 +0200 Alessandro Decina + + * ext/lame/gstlamemp3enc.c: + lame: fix format string in debug statement + +2009-05-06 15:37:44 +0100 Jan Schmidt + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: Don't reject valid Xing tables of contents + Some Xing headers apparently start the TOC at byte 1 instead of 0. Don't + reject them because of it, just subtract the initial offset when reading + the table. + +2009-05-06 15:27:01 +0100 Jan Schmidt + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: Allow more bits to change in headers during resynch + Be more lenient about what we accept as changing bits in a header - basically, + only require that the mp3 sync marker is present, for the mpeg version, + layer and samplerate. + Fixes: #581464 + +2009-05-06 13:17:35 +0200 Edward Hervey + + * ext/mad/gstmad.c: + mad: Add duration of incoming/outgoing buffers in debug statements + +2009-05-06 13:15:30 +0200 Edward Hervey + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: Remove useless checks for valid buffer duration. + The buffer duration is set to a valid value at the very top of + emit_frame(), we therefore don't need to check it later on. + +2009-05-06 13:13:35 +0200 Edward Hervey + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: Fix stop condition for outputting buffers. + Some mp3 streams have an offset in timestamps, requiring us to push the + frame *AFTER* segment.stop in order for the decoder to be able to push + all data up to the segment.stop position. + +2009-05-02 16:51:11 +0200 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: 0-base timestamps consistently (whether or not streaming) + This also makes timestamps (more) consistent before and after a possible + seek, and moreover makes for reasonable position reporting in live stream + (whose payload timestamps should not be taken for granted). + +2009-05-02 13:45:22 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: report initial latency due to internal preroll queue + +2009-05-02 13:44:48 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: enhance debug statement and refactor some initialization + +2009-05-02 13:44:11 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: handle FIXME; activate pads after internal preroll also when streaming + +2009-05-02 11:12:51 +0200 Mark Nauwelaerts + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: handle FIXME; normalize preroll + +2009-05-02 16:08:03 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + asfdemux: fixes for streaming mode + * Improve newsegment handling, e.g. upstream might live in TIME. + * Only send newsegment if we have needed info. + * Avoid reading past end of data section. + +2009-05-01 18:08:15 +0200 Mark Nauwelaerts + + * gst/asfdemux/gstasfdemux.c: + asfdemux: fixes/enhancements for streaming mode + * Do not rock the boat by reacting to FLUSH_START. + * Try to handle TIME seeking by seeking upstream in BYTES. + * Handle SEEKING query. + +2009-05-05 16:38:19 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/lame/gstlamemp3enc.c: + lame: fix compilation with LAME versions < 3.98 + lame_set_VBR_quality(), which takes a floating point value for the + quality, has been added only in v3.98. Use lame_set_VBR_q(), which + takes quality as an integer, for older LAME versions. + Fixes #581341. + +2009-05-04 20:39:14 +0100 Tim-Philipp Müller + + * win32/common/config.h: + win32: update config.h to git + Until someone ports the new win32 config.h logic from the + other modules to -ugly. + +2009-05-04 12:53:06 +0200 Sebastian Dröge + + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + Update docs + +2009-05-04 12:51:29 +0200 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lamemp3enc: Add a note to the encoding-engine-quality property + that says, that this does not affect the bitrate at all. + +2009-05-04 12:48:43 +0200 Sebastian Dröge + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame: Implement preset interface + +2009-05-04 12:47:03 +0200 Sebastian Dröge + + * ext/twolame/gsttwolame.c: + twolame: Implement preset interface + +2009-04-30 10:21:40 +0200 Sebastian Dröge + + * docs/plugins/gst-plugins-ugly-plugins.args: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + lamemp3enc: Remove fast-vbr property and rename vbr-quality to quality + +2009-04-30 10:16:45 +0200 Sebastian Dröge + + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + lame/lamemp3enc: Fix memory leak on FLUSH_STOP + +2009-04-30 10:14:54 +0200 Sebastian Dröge + + * ext/lame/gstlame.c: + lame: Deprecate the lame element + +2009-04-30 10:13:05 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + Update docs + +2009-04-30 10:10:08 +0200 Sebastian Dröge + + * ext/lame/gstlamemp3enc.c: + lame: Update example pipelines with the new properties + +2009-04-29 19:01:44 +0200 Sebastian Dröge + + * ext/lame/Makefile.am: + * ext/lame/gstlame.c: + * ext/lame/gstlamemp3enc.c: + * ext/lame/gstlamemp3enc.h: + * ext/lame/plugin.c: + lame: Add lamemp3enc element with much simplified interface + This deprecates the lame element and fixes bug #494528. + +2009-04-23 09:04:41 +0200 Edward Hervey + + * gst/asfdemux/asfpacket.c: + asfpacket: Fix pull-mode timestamping handling. + The problem that happens is the following: + * A packet with multiple payloads comes in + * Those payloads get handled one by one + * The first payload contains the first audio payload with timestamp A + * The second payload contains the first video (key)frame with timestamp V (where V < A) + With the previous code, the following would happen: + * the first payload gets processed, then passed to queue_for_stream + * queue_for_stream detects it's the first valid timestamp received and stores + first_ts = A + * the second payload gets processed, then pass to queue_for_stream + * queue_for_stream detects the timestamp is lower than first_ts... and + discards it... resulting in losing the first keyframe of the video stream + We've been having this issue for *ages*... it's just that nobody noticed it + that much with playbin. But with playbin2's aggresive multiqueue handling, this + will result in multiqueue not being able to preroll (because the video decoder will + be dropping a ton of buffers before (maybe) receiving the next keyframe). + Tested with over 200 asf files, and they all play the first frame correctly now, + even the most braindead ones. + +2009-04-21 14:12:06 -0700 Michael Smith + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: don't build seek table if we can't seek. + Fixes #573720 - unbounded memory usage increase when listening to mp3 + stream for a long time. + +2009-04-21 22:13:32 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From b3941ea to 6ab11d1 + +2009-04-21 20:17:57 +0200 Edward Hervey + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstxingmux.c: + mpegaudioparse: Remove dead assignment and duplicate code + +2009-04-21 20:21:11 +0200 Edward Hervey + + * gst/realmedia/rmdemux.c: + rmdemux: Actually return the return value for the seek handling. + +2009-04-21 20:20:02 +0200 Edward Hervey + + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + mpegstream: Remove dead assignments. + The duplicate assignment of update_time was weird... but it seems normal + that it's indeed the second statement which is the valid one. + +2009-04-21 20:17:19 +0200 Edward Hervey + + * ext/amrnb/amrnbparse.c: + armnb: Remove unused variable, adapt debug message accordingly. + +2009-04-21 20:15:56 +0200 Edward Hervey + + * gst/dvdsub/gstdvdsubdec.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegclock.c: + dvdsub/mpegstream: _class_init: Remove unused class variables + +2009-04-19 14:03:58 +0200 Edward Hervey + + * gst/asfdemux/gstasfdemux.c: + asfdemux: Initialize flow for a corner case. + This might be caused by entering the if() line 1214 and then not having + any activated_streams.. resulting in reaching line 1267 without having + any valid flow value. + +2009-04-19 14:03:38 +0200 Edward Hervey + + * ext/twolame/gsttwolame.c: + twolame: Remove unneeded variable, value assigned was never read. + +2009-04-19 14:03:19 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Remove dead assignment. Value overwritten later on. + +2009-04-19 14:02:44 +0200 Edward Hervey + + * ext/mad/gstmad.c: + mad: Remove dead assignment and variables given values which are never read. + +2009-04-19 14:02:03 +0200 Edward Hervey + + * ext/lame/gstlame.c: + lame: Remove unneeded variable, it's assigned a value never read. + +2009-04-19 13:59:24 +0200 Edward Hervey + + * gst/realmedia/rmdemux.c: + rmdemux: Remove dead assignment, value is being overwritten before being read. + +2009-04-19 13:58:31 +0200 Edward Hervey + + * gst/realmedia/rmdemux.c: + rmdemux: Remove unused accurate flag. + I couldn't see any reason why this was there in the first place. + +2009-04-19 13:57:59 +0200 Edward Hervey + + * gst/realmedia/asmrules.c: + * gst/realmedia/rdtdepay.c: + realmedia: Remove dead assignments. The results are never read. + +2009-04-19 13:57:10 +0200 Edward Hervey + + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rmdemux.c: + realmedia: Remove useless variables, only being used once (or not). + +2009-04-19 13:55:24 +0200 Edward Hervey + + * ext/mpeg2dec/gstmpeg2dec.c: + * gst/asfdemux/gstrtspwms.c: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rtspreal.c: + remove empty method implementations. + +2009-04-18 08:12:08 +0200 Josep Torra + + * gst/asfdemux/gstrtspwms.c: + rtspwms: fix condition to detect extension commands for WMS + Reply with OK to the extension commands for WMS. + +2009-04-15 11:09:56 +0200 Josep Torra + + * gst/realmedia/rtspreal.c: + realmedia: add special Real header to DESCRIBE message only for Real servers + Add headers that are specific to real only if a real server had been + detected by the OPTIONS message. + +2009-04-14 19:16:46 +0200 David Hoyt + + * gst/synaesthesia/synaescope.c: + synaesthesia: fix compilation on windows + Fix compilation under MSVC due to references to headers + that are not available with the MS SDKs. + Fixes #578524 + +2009-04-14 10:54:37 +0200 Wim Taymans + + * gst/asfdemux/gstrtspwms.c: + rtspwms: reply to extension commands + Reply with OK to the extension commands for WMS. + +2009-04-14 10:53:51 +0200 Wim Taymans + + * gst/asfdemux/gstrtpasfdepay.c: + asfdepay: fix a comment + +2009-04-14 10:53:33 +0200 Wim Taymans + + * gst/asfdemux/gstasfdemux.c: + asfdemux: add some more debugging + +2009-04-14 10:51:45 +0200 Wim Taymans + + * configure.ac: + configure.ac: require git -base + We require 0.10.22.1 of -base for the new Match-If and ETag headers in RTSP. + +2009-04-09 20:21:46 +0100 Tim-Philipp Müller + + * gst/realmedia/rtspreal.c: + realmedia: add special Real header to SETUP message only for Real servers + Fixes playback of Windows Media RTSP streams and other non-Real RTSP + streams where the server errors out because it can't handle the + Real-specific 'Required: com.real.retain-entity-for-setup' header + we've been adding unconditionally in the recent past. + For reference: + rtsp://66.111.34.191:601/broadcast/alnour.rm + rtsp://195.134.224.231/snowboard_100.wmv + +2009-04-08 11:44:53 -0700 Michael Smith + + * configure.ac: + * gst/asfdemux/Makefile.am: + asfdemux: link to all required libraries including indirectly used ones. + On win32, we're required to link to all the libraries used - including + ones only indirectly used by other libs. So, add gstaudio, gsttag, and + (for windows only) winsock. + +2009-04-04 21:19:23 +0300 Felipe Contreras + + * common: + Automatic update of common submodule + From d0ea89e to b3941ea + +2009-04-04 14:54:41 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From f8b3d91 to d0ea89e + +2009-03-26 20:23:14 +0100 Edward Hervey + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + dvdlpcmdec: Fix factory klass, It's a 'Decoder', not a 'Demuxer'. + +2009-03-25 16:39:06 +0100 Wim Taymans + + * gst/realmedia/rtspreal.c: + * gst/realmedia/rtspreal.h: + realrtsp: add more headers + Parse the ETag from the describe method and pass the sessionid as the value for + the If-Match header is subsequent setup calls. + Fixes support for more RealMedia RTSP streams. + +2009-03-22 13:08:48 -0700 David Schleef + + * configure.ac: + twolame: bump requirement to 0.3.10 + 0.3.10 is the first version with the float32 encoder functions. + Fixes #576305. + +2009-03-22 20:15:24 +0000 Jan Schmidt + + * configure.ac: + back to development -> 0.10.11.1 + +=== release 0.10.11 === + +2009-03-21 01:05:22 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * gst-plugins-ugly.doap: + * po/cs.po: + * win32/common/config.h: + Release 0.10.11 + +2009-03-21 00:28:29 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + +2009-03-13 16:45:08 +0000 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + 0.10.10.3 pre-release + +2009-03-13 16:40:38 +0000 Jan Schmidt + + * po/fi.po: + * po/id.po: + * po/pl.po: + * po/pt_BR.po: + * po/sv.po: + po: Update translations from upstream + +2009-03-13 16:38:08 +0000 Jan Schmidt + + * po/LINGUAS: + * po/tr.po: + po: Add Turkish translation + +2009-03-13 19:23:12 +0000 Jan Schmidt + + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + mp3parse: Fix glitches in the output when playing (for e.g.) AVI + Don't introduce glitches in the output by a) relaxing the threshold for + taking upstream timestamps in preference to our calculated timestamps and + b) only set the discont flag on outgoing buffers in response to an incoming + discont buffer. + Fixes: #575046 + +2009-03-12 15:57:31 +0100 Alessandro Decina + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: fix deadlock with accurate seeks. + Release pending_accurate_seeks_lock before forwarding the seek event upstream. + Fixes #575068. + +2009-03-10 00:22:35 +0000 Jan Schmidt + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/lt.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * win32/common/config.h: + 0.10.10.2 pre-release + Bump version number, update translations and win32 config.h + +2009-03-10 00:19:01 +0000 Jan Schmidt + + * po/LINGUAS: + * po/ja.po: + po: Add Japanese translation + +2009-03-10 00:10:20 +0000 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * docs/plugins/inspect/plugin-twolame.xml: + * ext/Makefile.am: + * po/POTFILES.in: + Moved twolame from Bad to Ugly + +2008-11-04 12:42:30 +0000 Stefan Kost + + [MOVED FROM BAD] Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-09-02 09:56:44 +0000 Tim-Philipp Müller + + [MOVED FROM BAD] Enable/fix up translations for these plugins. + Original commit message from CVS: + * ext/resindvd/plugin.c: (plugin_init): + * ext/resindvd/resindvdsrc.c: + * ext/twolame/gsttwolame.c: (plugin_init): + * gst/aiffparse/aiffparse.c: (plugin_init): + Enable/fix up translations for these plugins. + * po/LINGUAS: + Add 'ca' to LINGUAS. + * po/POTFILES.in: + * po/POTFILES.skip: + Add more files for translation and more files which tools + should skip. + +2008-08-07 14:34:03 +0000 Sebastian Dröge + + [MOVED FROM BAD] ext/twolame/gsttwolame.*: Allow raw float samples as input for encoding. + Original commit message from CVS: + * ext/twolame/gsttwolame.c: (gst_two_lame_sink_setcaps), + (gst_two_lame_chain): + * ext/twolame/gsttwolame.h: + Allow raw float samples as input for encoding. + +2008-08-02 17:39:13 +0000 Sebastian Dröge + + [MOVED FROM BAD] Add TwoLAME MP2 encoding element, based on the LAME element. + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/twolame/Makefile.am: + * ext/twolame/gsttwolame.c: (gst_two_lame_mode_get_type), + (gst_two_lame_padding_get_type), (gst_two_lame_emphasis_get_type), + (gst_two_lame_release_memory), (gst_two_lame_finalize), + (gst_two_lame_base_init), (gst_two_lame_class_init), + (gst_two_lame_src_setcaps), (gst_two_lame_sink_setcaps), + (gst_two_lame_init), (gst_two_lame_set_property), + (gst_two_lame_get_property), (gst_two_lame_sink_event), + (gst_two_lame_chain), (gst_two_lame_setup), + (gst_two_lame_change_state), (gst_two_lame_get_default_settings), + (plugin_init): + * ext/twolame/gsttwolame.h: + Add TwoLAME MP2 encoding element, based on the LAME element. + +2009-03-09 23:13:20 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 7032163 to f8b3d91 + +2009-03-08 12:05:57 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From ffa738d to 7032163 + +2009-03-08 11:21:32 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 3f13e4e to ffa738d + +2009-03-07 11:47:06 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 3c7456b to 3f13e4e + +2009-03-07 10:47:13 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 57c83f2 to 3c7456b + +2009-03-06 12:30:36 -0800 Michael Smith + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: be more conservative when changing layer/rate/etc. + Don't allow a change in sample rate/channels/layer/version unless we can + see another frame at the correct offset. Prevents accidently flipping + due to simple single-bit corruption. + +2009-03-04 16:52:59 +0000 Jan Schmidt + + * gst/realmedia/realhash.c: + rmdemux: Fix strict-aliasing warnings. + Use existing GST_READ_UINT32 and GST_WRITE_UINT32 macros instead of + hand-rolled ones. + +2009-03-04 16:15:00 +0200 René Stadler + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: Remove empty lines added by buggy indent. + +2009-02-27 13:41:58 +0100 Mark Nauwelaerts + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mpegaudioparse: Provide SEEKING query handling. + Since SEEK event handling might perform some conversion + from TIME to BYTES, do not let upstream fool application + into (TIME) seeking not being possible. + +2009-02-25 13:34:05 -0800 Michael Smith + + * gst/mpegaudioparse/gstmpegaudioparse.c: + mp3parse: fix accurate seeks to near 0 + Integer underflow made accurate seeks to near zero fail and seek to + completely the wrong place. Fix by clamping to zero, since we can't seek + to negative times anyway. + +2009-02-25 20:52:08 +0000 Jan Schmidt + + * common: + * configure.ac: + build: Update shave init statement for changes in common. Bump common. + +2009-02-25 18:19:20 +0100 Wim Taymans + + * gst/realmedia/rtspreal.c: + rtspreal: ignore data streams. Fixes #527112 + Ignore data streams when parsing the SDP as they don't contain anything we need + to put in the realmedia header. + +2009-02-25 11:32:37 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 9cf8c9b to a6ce5c6 + +2009-02-24 15:25:16 +0100 Wim Taymans + + * ext/mad/gstid3tag.c: + Forward unknown events + Forward unknown events upstream instead of dropping them. Also return the result + of the seek event instead of a fixed value. + +2009-02-23 10:50:50 +0200 Stefan Kost + + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: Fix the build by adding the needed include for atoi. + +2009-02-22 19:19:12 +0000 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + Use shave for the build output + +2009-02-22 16:00:02 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 5d7c9cc to 9cf8c9b + +2009-02-22 14:22:30 +0100 Edward Hervey + + * gst/asfdemux/gstasf.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtdepay.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/synaesthesia/synaescope.c: + Fix indentation. + +2009-02-22 14:21:22 +0100 Edward Hervey + + * gst/realmedia/pnmsrc.c: + pnmsrc: Error out gracefully if location is NULL. Run gst-indent + +2009-02-21 11:13:55 -0800 David Schleef + + * common: + Automatic update of common submodule + From 80c627d to 5d7c9cc + +2009-02-20 15:53:34 +0100 Wim Taymans + + * gst/realmedia/Makefile.am: + * gst/realmedia/pnmsrc.c: + * gst/realmedia/pnmsrc.h: + * gst/realmedia/rademux.c: + * gst/realmedia/rademux.h: + * gst/realmedia/realmedia.c: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + Add pnm:// uri source + Add a new utri handler for pnm:// that for now just redirects to the same uri + with the rtsp:// protocol, which usually works nowadays. + Separate the registration of the various plugins into a separate source file. + +2009-02-20 13:48:08 +0100 Wim Taymans + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstasf.c: + * gst/asfdemux/gstrtpasfdepay.c: + * gst/asfdemux/gstrtpasfdepay.h: + Add ASF depayloader + Add ASF depayloader based on latest public MicroSoft docs (MS-RTSP). + Fixes #335067. + +2009-02-19 19:10:53 +0000 Zaheer Merali + + * ext/mad/gstmad.c: + mad: remove log line added in error + +2009-02-19 19:08:10 +0000 Zaheer Merali + + * ext/mad/gstmad.c: + mad: just flush data when seeing BADDATAPTR instead of going into error state + +2009-02-18 12:55:16 +0100 Roland Moser + + * gst/realmedia/rmdemux.c: + Fix parsing of the flags in rmdemux + Fix parsing of the flags in version 1 realmedia streams. + Fixes #571358. + +2009-02-09 12:03:15 +0100 Edward Hervey + + * common: + Bump revision to use for common submodule. + +2009-01-30 22:27:05 +0200 Stefan Kost + + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + Add releaseinfo with online url. + +2009-01-30 17:34:27 +0000 Jan Schmidt + + * common: + Bump common + +2009-01-30 14:35:40 +0100 Sebastian Dröge + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + Remove redundant push_mode struct member + +2009-01-30 09:04:46 +0100 Edward Hervey + + * autogen.sh: + Fix previous commit, wasn't actually setting up a symbolic link + +2009-01-30 08:56:33 +0100 Edward Hervey + + * autogen.sh: + * common: + Use a symbolic link for the pre-commit client-side hook + +2009-01-30 08:56:24 +0100 Edward Hervey + + * .gitignore: + Ignore some more files + +2009-01-26 22:40:10 +0200 Stefan Kost + + * gst/synaesthesia/synaescope.c: + * gst/synaesthesia/synaescope.h: + Precalculate some size dependent variables. Demystify the height scaling a bit. + Adds more comments to the code about the height scaling. RIght now only certain heights are screen filling. + +2009-01-26 21:26:46 +0200 Stefan Kost + + Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly + +2009-01-26 20:12:41 +0100 Wim Taymans + + * gst/realmedia/rdtdepay.c: + Set flags on the realmedia chunks + Set the keyframe flags from the RDT packet to the realmedia chunk so that the + descrambler can be reset on keyframes. Fixes #556714. + +2009-01-26 20:10:36 +0100 Wim Taymans + + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/gstrdtbuffer.h: + Add method to get RDT flags + Add a method to get the RDT flags. We need these flags to mark keyframes to + reset the descrambing queue. See #556714. + +2009-01-26 10:00:57 +0100 Hans de Goede + + * gst/asfdemux/asfpacket.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + Add seeking support to asfdemux in push mode + Fixes bug #568836. + +2009-01-26 09:57:26 +0100 Hans de Goede + + * gst/asfdemux/asfpacket.c: + Drop packets with an invalid replicated data length + Drop packets with an invalid replicated data length + instead of continuing with an invalid timestamp + and uninitialized payload metadata. + All other code assumes that the timestamps are valid. + +2009-01-25 22:31:52 +0200 Stefan Kost + + * gst/synaesthesia/synaescope.h: + Change comment to refer to right variable. + +2009-01-24 23:27:08 +0200 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + * gst/synaesthesia/gstsynaesthesia.h: + * gst/synaesthesia/synaescope.c: + * gst/synaesthesia/synaescope.h: + Bring synaesthesia to next century. + Do proper size negotiation. Change engine API to allow resizes. Small cleanups elsewhere. + +2009-01-23 17:51:00 -0800 David Schleef + + * gst/asfdemux/gstasfdemux.c: + Fix leak of converted string + +2009-01-23 23:44:01 +0000 Jan Schmidt + + * .gitignore: + * po/.gitignore: + Add more to the gitignores + +2009-01-23 23:59:38 +0200 Stefan Kost + + * gst/synaesthesia/gstsynaesthesia.c: + Make synaesthesia build again. + _init() has no params. + +2009-01-22 18:15:36 +0200 Stefan Kost + + * common: + Update common snapshot. + +2009-01-22 13:50:09 +0100 Sebastian Dröge + + * common: + Fix pre-commit hook + +2009-01-22 06:14:31 +0100 Edward Hervey + + * autogen.sh: + * common: + Install and use pre-commit indentation hook from common + +2009-01-21 04:32:33 +0100 Edward Hervey + + * autogen.sh: + autogen.sh : Use git submodule + +2009-01-08 08:19:25 +0000 Yves Lefebvre + + gst/mpegstream/: Fix some caps leaks. Fixes bug #564885. + Original commit message from CVS: + Patch by: Yves Lefebvre + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_video_stream), + (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_reset): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init_stream), + (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), (gst_mpeg_demux_reset): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain): + Fix some caps leaks. Fixes bug #564885. + +2009-01-02 00:43:53 +0000 Alessandro Decina + + ext/cdio/gstcdio.c: Remove unused format argument. + Original commit message from CVS: + * ext/cdio/gstcdio.c: + Remove unused format argument. + +2008-12-13 20:41:40 +0000 Tim-Philipp Müller + + win32/common/: Hardcode cpu for win32 build, just like we do in the other modules, to remove VCS conflicts and incons... + Original commit message from CVS: + * win32/common/.cvsignore: + * win32/common/config.h: + * win32/common/config.h.in: + Hardcode cpu for win32 build, just like we do in the other modules, + to remove VCS conflicts and inconsistent defines between modules, + and update version defines to CVS. + +2008-12-13 16:29:38 +0000 Edward Hervey + + m4/Makefile.am: Removed two more .m4 that aren't shipped with gettext 0.17 anymore. + Original commit message from CVS: + * m4/Makefile.am: + Removed two more .m4 that aren't shipped with gettext 0.17 anymore. + +2008-12-13 13:01:49 +0000 Edward Hervey + + m4/Makefile.am: inttypes.m4 hasn't been available since gettext-0.15, and since we now require gettext >= 0.17 ... we... + Original commit message from CVS: + * m4/Makefile.am: + inttypes.m4 hasn't been available since gettext-0.15, and since we now + require gettext >= 0.17 ... we can remove it from the list of files to + dist. + +2008-12-10 15:42:21 +0000 Tim-Philipp Müller + + gst/mpegaudioparse/gstmpegaudioparse.*: Do an initial class_ref on an internal enum type from within the class_init f... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (channel_mode_class), + (GST_TYPE_MP3_CHANNEL_MODE), (mp3_type_frame_length_from_header), + (gst_mp3parse_emit_frame), (mp3parse_get_query_types): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Do an initial class_ref on an internal enum type from within the + class_init function so that there aren't any issues when multiple + mp3parse elements are started in separate threads at the same + time. (Why we use an enum type here if the tag is registered as + a string type, I don't know). Also remove custom UNUSED macro + and use GLib's instead. + +2008-12-04 20:11:33 +0000 Sebastian Dröge + + configure.ac: Apparently AC_CONFIG_MACRO_DIR breaks when using more than one macro directory, reverting last change. + Original commit message from CVS: + * configure.ac: + Apparently AC_CONFIG_MACRO_DIR breaks when using more + than one macro directory, reverting last change. + +2008-12-04 19:48:20 +0000 Sebastian Dröge + + configure.ac: Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to our M4 macros. + Original commit message from CVS: + * configure.ac: + Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to + our M4 macros. + +2008-12-01 14:39:34 +0000 Sebastian Dröge + + ext/mpeg2dec/gstmpeg2dec.c: Last change introduced a regression that made mpeg2dec handle some 4:2:2 videos as 4:4:4.... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): + Last change introduced a regression that made mpeg2dec handle + some 4:2:2 videos as 4:4:4. Fixes bug #562086. + +2008-11-29 13:33:37 +0000 Sebastian Dröge + + Require gettext 0.17 because older versions don't mix with libtool 2.2. At build time an older gettext version will s... + Original commit message from CVS: + Patch by: Cygwin Ports maintainer + + * autogen.sh: + * configure.ac: + Require gettext 0.17 because older versions don't mix with libtool + 2.2. At build time an older gettext version will still work. + Fixes bug #556091. + +2008-11-25 03:44:06 +0000 David Schleef + + ext/mpeg2dec/gstmpeg2dec.*: Add support for 4:4:4 video. Fixes #562086 + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + Add support for 4:4:4 video. Fixes #562086 + +2008-11-24 09:51:39 +0000 Simon Holm Thøgersen + + ext/mpeg2dec/gstmpeg2dec.c: Add support for the STATE_SEQUENCE_MODIFIED state in mpeg2dec >= 0.5.0. Fixes bug #562065. + Original commit message from CVS: + Patch by: Simon Holm Thøgersen + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_chain): + Add support for the STATE_SEQUENCE_MODIFIED state in mpeg2dec + >= 0.5.0. Fixes bug #562065. + +2008-11-20 21:31:19 +0000 Wim Taymans + + gst/asfdemux/gstasfdemux.c: Remove duplicate and broken code for the streaming case and simply reuse the much better ... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_chain): + Remove duplicate and broken code for the streaming case and simply reuse + the much better working pull based code. Fixes #560348. + +2008-11-20 20:42:33 +0000 Jan Schmidt + + configure.ac: Back to development -> 0.10.10.1 + Original commit message from CVS: + * configure.ac: + Back to development -> 0.10.10.1 + +=== release 0.10.10 === + +2008-11-19 14:30:44 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * gst-plugins-ugly.doap: + * po/LINGUAS: + Release 0.10.10 - "Under the House" + Original commit message from CVS: + Release 0.10.10 - "Under the House" + +2008-11-19 13:59:12 +0000 Jan Schmidt + + * po/bg.po: + * po/ca.po: + * po/da.po: + * po/id.po: + * po/it.po: + * po/mt.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-11-17 09:53:39 +0000 Sebastian Dröge + + ext/sidplay/Makefile.am: Use GST_CXXFLAGS for C++ code instead of GST_CFLAGS. The latter could contain CFLAGS that do... + Original commit message from CVS: + * ext/sidplay/Makefile.am: + Use GST_CXXFLAGS for C++ code instead of GST_CFLAGS. The latter could + contain CFLAGS that do not exist for C++, like -Wvla or + -Wdeclaration-after-statement. Fixes bug #561161. + +2008-11-12 23:19:55 +0000 Jan Schmidt + + configure.ac: 0.10.9.3 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.9.3 pre-release + +2008-11-11 17:14:46 +0000 Wim Taymans + + gst/asfdemux/gstasfdemux.c: Only copy sane aspect ratio values on the caps. Fixes #559682. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_video_stream): + Only copy sane aspect ratio values on the caps. Fixes #559682. + +2008-11-06 13:29:37 +0000 Sebastian Dröge + + * ChangeLog: + Add bug number to the mp3parse mpeg 2.5 fix + Original commit message from CVS: + Add bug number to the mp3parse mpeg 2.5 fix + +2008-11-05 11:03:07 +0000 Wim Taymans + + ext/amrnb/amrnbdec.*: Add a property to select the amr variant. Fixes #424070. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnb_variant_get_type), + (gst_amrnbdec_class_init), (gst_amrnbdec_set_property), + (gst_amrnbdec_get_property), (gst_amrnbdec_chain): + * ext/amrnb/amrnbdec.h: + Add a property to select the amr variant. Fixes #424070. + +2008-11-03 11:31:49 +0000 Tal Shalif + + gst/mpegstream/: Fix memmory corruption due to not storing the new updated pointer after a g_renew(). Fixes #558896. + Original commit message from CVS: + Patch by: Tal Shalif + * gst/mpegstream/gstdvddemux.c: + (gst_dvd_demux_get_subpicture_stream): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream): + Fix memmory corruption due to not storing the new updated pointer + after a g_renew(). Fixes #558896. + +2008-10-30 14:50:41 +0000 Stefan Kost + + tests/check/Makefile.am: Blacklist cdiocddasrc from state-change tests. Fixes #558277. + Original commit message from CVS: + * tests/check/Makefile.am: + Blacklist cdiocddasrc from state-change tests. Fixes #558277. + +2008-10-24 20:44:13 +0000 Jan Schmidt + + configure.ac: oops, forgot to bump the version back to devel after the last release 0.10.9.1 + Original commit message from CVS: + * configure.ac: + oops, forgot to bump the version back to devel + after the last release 0.10.9.1 + +2008-10-24 12:47:05 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Add suport for mpeg4 and aac audio. See #556714. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_descramble_mp4a_audio), + (gst_rmdemux_handle_scrambled_packet): + Add suport for mpeg4 and aac audio. See #556714. + +2008-10-14 19:28:05 +0000 Michael Smith + + gst/mpegaudioparse/gstmpegaudioparse.c: Calculate samples per frame correctly for "MPEG 2.5" layer 3. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + Calculate samples per frame correctly for "MPEG 2.5" layer 3. + Fixes skipping on these files. + +2008-10-14 12:51:41 +0000 Robin Stocker + + ext/mpeg2dec/gstmpeg2dec.*: Prefer the container's PAR over the stream's PAR if it's given in the srcpad caps. Fixes ... + Original commit message from CVS: + Patch by: Robin Stocker + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (handle_sequence), (gst_mpeg2dec_setcaps): + * ext/mpeg2dec/gstmpeg2dec.h: + Prefer the container's PAR over the stream's PAR if it's + given in the srcpad caps. Fixes bug #556184. + +2008-10-13 18:10:25 +0000 Stefan Kost + + Don't install static libs for plugins. Fixes #550851 for ugly. + Original commit message from CVS: + * ext/a52dec/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dvdnav/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/lame/Makefile.am: + * ext/mad/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * ext/sidplay/Makefile.am: + * gst/ac3parse/Makefile.am: + * gst/asfdemux/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/iec958/Makefile.am: + * gst/mpegaudioparse/Makefile.am: + * gst/mpegstream/Makefile.am: + * gst/realmedia/Makefile.am: + * gst/synaesthesia/Makefile.am: + Don't install static libs for plugins. Fixes #550851 for ugly. + +2008-10-13 09:04:15 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Post a GST_ELEMENT_ERROR if we get EOS before seeing any valid frames. Partia... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event): + Post a GST_ELEMENT_ERROR if we get EOS before seeing any valid + frames. Partially fixes bug #552237. + +2008-10-09 09:23:00 +0000 Stefan Kost + + ext/amrnb/amrnbparse.c: use #defines for HEADER. Unref the object in _sink_activate_pull(). + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: + use #defines for HEADER. Unref the object in _sink_activate_pull(). + +2008-10-08 13:59:57 +0000 Wim Taymans + + ext/mad/gstmad.*: track discont on incomming buffers and set discont on outgoing buffers. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_src_event), (gst_mad_chain), + (gst_mad_change_state): + * ext/mad/gstmad.h: + track discont on incomming buffers and set discont on outgoing + buffers. + Pass unknown events upstreams instead of dropping them. + +2008-09-28 17:33:43 +0000 Sameer Naik + + ext/mpeg2dec/gstmpeg2dec.*: Fix compilation with --disable-index. Fixes bug #554150. + Original commit message from CVS: + Patch by: Sameer Naik + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_class_init), + (handle_slice), (gst_mpeg2dec_sink_event), + (gst_mpeg2dec_src_event): + * ext/mpeg2dec/gstmpeg2dec.h: + Fix compilation with --disable-index. Fixes bug #554150. + +2008-09-28 17:31:37 +0000 Sameer Naik + + ext/mad/gstmad.*: Fix compilation with --disable-index. Fixes bug #554142. + Original commit message from CVS: + Patch by: Sameer Naik + * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_dispose), + (gst_mad_src_event), (gst_mad_chain): + * ext/mad/gstmad.h: + Fix compilation with --disable-index. Fixes bug #554142. + +2008-09-27 00:20:48 +0000 Thijs Vermeir + + ext/a52dec/gsta52dec.*: Fix channel re-negotiation on a change of the incoming stream. + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + Fix channel re-negotiation on a change of the incoming stream. + Patch By: Thijs Vermeir + Fixes: #551660 + +2008-09-26 14:39:42 +0000 Wim Taymans + + ext/amrnb/amrnbenc.*: Pass the discont flag from the input buffer on to the output buffer in the AMR encoder. + Original commit message from CVS: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbenc.h: + Pass the discont flag from the input buffer on to the output buffer in + the AMR encoder. + +2008-09-26 10:04:35 +0000 Benoit Fouet + + ext/amrnb/amrnbparse.*: Add flush seek handler. Fixes #536274. + Original commit message from CVS: + Patch by: Benoit Fouet + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_handle_pull_seek), + (gst_amrnbparse_handle_push_seek), (gst_amrnbparse_src_event), + (gst_amrnbparse_sink_activate_push), + (gst_amrnbparse_sink_activate_pull): + * ext/amrnb/amrnbparse.h: + Add flush seek handler. Fixes #536274. + +2008-09-26 09:57:02 +0000 Benoit Fouet + + ext/amrnb/amrnbparse.*: Fix the duration query. Fixes #536226. + Original commit message from CVS: + Patch by: Benoit Fouet + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_query), + (gst_amrnbparse_chain), (gst_amrnbparse_loop), + (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Fix the duration query. Fixes #536226. + Also set caps on the pads and buffers more correctly. + +2008-09-02 09:43:10 +0000 Tim-Philipp Müller + + po/LINGUAS: Add 'ca' to LINGUAS. + Original commit message from CVS: + * po/LINGUAS: + Add 'ca' to LINGUAS. + +2008-08-28 09:57:30 +0000 Edward Hervey + + gst/asfdemux/gstasfdemux.c: Fix aggregated GST_FLOW_RETURN check for when to send an error message on the bus. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_loop): + Fix aggregated GST_FLOW_RETURN check for when to send an error message + on the bus. + Re-fixes #546859 + +2008-08-27 15:55:05 +0000 Wim Taymans + + gst/realmedia/rdtdepay.*: Parse other values from the incomming caps. + Original commit message from CVS: + * gst/realmedia/rdtdepay.c: (gst_rdt_depay_init), + (gst_rdt_depay_setcaps), (gst_rdt_depay_sink_event), + (create_segment_event), (gst_rdt_depay_push), + (gst_rdt_depay_handle_data), (gst_rdt_depay_change_state): + * gst/realmedia/rdtdepay.h: + Parse other values from the incomming caps. + Add event handler to handle flushing and segments. + Create segment events. + * gst/realmedia/rdtjitterbuffer.c: (rdt_jitter_buffer_insert): + Do skew correction based on RDT timestamps. + * gst/realmedia/rdtmanager.c: (activate_session), + (gst_rdt_manager_parse_caps), (gst_rdt_manager_setcaps), + (create_recv_rtp): + Parse caps to get the clockrate needed for the jitterbuffer. + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_video_packet): + Apply timestamp fixup after correcting for initial timestamp and + internal base timestamp corrections. + +2008-08-27 11:28:50 +0000 Wim Taymans + + gst/realmedia/rdtdepay.*: Check seqnum gaps and drop duplicate packets or mark outgoing buffers with a DISCONT flag w... + Original commit message from CVS: + * gst/realmedia/rdtdepay.c: (gst_rdt_depay_handle_data), + (gst_rdt_depay_change_state): + * gst/realmedia/rdtdepay.h: + Check seqnum gaps and drop duplicate packets or mark outgoing buffers + with a DISCONT flag when needed. + * gst/realmedia/rdtmanager.c: (gst_rdt_manager_query_src): + Report the configure latency instead of a hardcoded value. + +2008-08-27 10:02:06 +0000 Wim Taymans + + gst/realmedia/rdtmanager.c: Include the new rdt jitterbuffer in the session manager. + Original commit message from CVS: + * gst/realmedia/rdtmanager.c: (create_session), (activate_session), + (free_session), (gst_rdt_manager_query_src), + (gst_rdt_manager_src_activate_push), + (gst_rdt_manager_handle_data_packet), (gst_rdt_manager_chain_rdt), + (gst_rdt_manager_loop), (create_recv_rtp): + Include the new rdt jitterbuffer in the session manager. + +2008-08-27 09:58:00 +0000 Wim Taymans + + gst/realmedia/rdtdepay.*: Use new RDT parsing helper functions. + Original commit message from CVS: + * gst/realmedia/rdtdepay.c: (gst_rdt_depay_class_init), + (gst_rdt_depay_finalize), (gst_rdt_depay_setcaps), + (gst_rdt_depay_push), (gst_rdt_depay_handle_data), + (gst_rdt_depay_chain), (gst_rdt_depay_change_state): + * gst/realmedia/rdtdepay.h: + Use new RDT parsing helper functions. + Copy discont flags correctly. + Push the header from the chain function instead of the setcaps function. + Copy incomming timestamp to the output buffers instead of doing magic + with the RDT timestamps. + +2008-08-27 09:52:49 +0000 Wim Taymans + + gst/realmedia/: Add first support for parsing RDT messages. + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/gstrdtbuffer.c: (gst_rdt_buffer_validate_data), + (gst_rdt_buffer_validate), (gst_rdt_buffer_get_packet_count), + (read_packet_header), (gst_rdt_buffer_get_first_packet), + (gst_rdt_packet_move_to_next), (gst_rdt_packet_get_type), + (gst_rdt_packet_get_length), (gst_rdt_packet_to_buffer), + (gst_rdt_buffer_compare_seqnum), (gst_rdt_packet_data_get_seq), + (gst_rdt_packet_data_peek_data), + (gst_rdt_packet_data_get_stream_id), + (gst_rdt_packet_data_get_timestamp): + * gst/realmedia/gstrdtbuffer.h: + Add first support for parsing RDT messages. + * gst/realmedia/rdtjitterbuffer.c: (rdt_jitter_buffer_class_init), + (rdt_jitter_buffer_init), (rdt_jitter_buffer_finalize), + (rdt_jitter_buffer_new), (rdt_jitter_buffer_reset_skew), + (calculate_skew), (rdt_jitter_buffer_insert), + (rdt_jitter_buffer_pop), (rdt_jitter_buffer_peek), + (rdt_jitter_buffer_flush), (rdt_jitter_buffer_num_packets), + (rdt_jitter_buffer_get_ts_diff): + * gst/realmedia/rdtjitterbuffer.h: + Add first version of an RDT jitterbuffer. + +2008-08-27 09:47:17 +0000 Wim Taymans + + gst/realmedia/rmdemux.*: Keep track of the first timestamp of the stream and add this to the outgoing buffer timestam... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_init), + (find_seek_offset_time), (gst_rmdemux_reset), (gst_rmdemux_chain), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_descramble_cook_audio), + (gst_rmdemux_descramble_dnet_audio), + (gst_rmdemux_parse_video_packet), (gst_rmdemux_parse_audio_packet): + * gst/realmedia/rmdemux.h: + Keep track of the first timestamp of the stream and add this to the + outgoing buffer timestamps so that we can handle live streams. + Set discont flag on the first buffers and after a seek. + +=== release 0.10.9 === + +2008-08-26 23:06:04 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * gst-plugins-ugly.doap: + Release 0.10.9 + Original commit message from CVS: + Release 0.10.9 + +2008-08-26 22:56:30 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/lt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-08-26 15:35:43 +0000 Jan Schmidt + + ext/a52dec/gsta52dec.c: Set up a default time segment for output when receiving an incoming byte segment (as for raw ... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: + Set up a default time segment for output when receiving + an incoming byte segment (as for raw AC3 files). + Fixes: #548194 + +2008-08-12 09:16:13 +0000 Jan Schmidt + + 0.10.8.2 pre-release. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * ext/Makefile.am: + 0.10.8.2 pre-release. + * po/LINGUAS: + * po/POTFILES.in: + * po/id.po: + Add new translation. + +2008-08-11 18:44:35 +0000 Michael Smith + + gst/asfdemux/gstasfdemux.c: Properly aggregate flow returns for both push and pull mode, so we shut down if all pads ... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + Properly aggregate flow returns for both push and pull mode, so we shut + down if all pads are unlinked. + Fixes #546859. + +2008-08-07 16:14:42 +0000 Frederic Crozat + + Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). + Original commit message from CVS: + Patch by: Frederic Crozat + * ext/dvdread/dvdreadsrc.c: (plugin_init): + * ext/lame/gstlame.c: (plugin_init): + * gst/asfdemux/gstasf.c: (plugin_init): + Make sure gettext returns translations in UTF-8 encoding rather + than in the current locale encoding (#546822). + +2008-07-31 14:35:40 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Don't recurse from mp3parse_bytepos_to_time() to mp3parse_total_time() if we'... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (gst_mp3parse_emit_frame), + (mp3parse_total_time), (mp3parse_bytepos_to_time): + Don't recurse from mp3parse_bytepos_to_time() to mp3parse_total_time() + if we're called from there already. Otherwise we end up in a endless + recursion and crash with a stack overflow. + This can happen when a Xing or VBRI header with TOC exists but it + doesn't contain the total time. Fixes bug #545370. + +2008-07-31 14:24:27 +0000 Sebastian Dröge + + ext/lame/gstlame.c: Use the default for the strict-iso property too. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_class_init), + (gst_lame_get_default_settings): + Use the default for the strict-iso property too. + Allow a bitrate setting of 0, which lets lame choose the default value + and which makes it possible to set the compression-ratio property. + +2008-07-29 16:57:16 +0000 Sebastian Dröge + + ext/lame/gstlame.*: Get the defaults settings of LAME in the plugin initialization function and return FALSE here if ... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init), + (gst_lame_chain), (gst_lame_get_default_settings), (plugin_init): + * ext/lame/gstlame.h: + Get the defaults settings of LAME in the plugin initialization + function and return FALSE here if something goes wrong. This removes + the hacky failing instance init function. + Use LAMEs default value for all settings instead of overwriting some + of them. Overwriting some of them gives unexpected results if one only + sets a preset. Fixes bug #498004. + +2008-07-27 15:56:27 +0000 Sebastian Dröge + + ext/lame/gstlame.c: Use LAME's default for the min/max/mean VBR bitrate. Setting our own defaults will restrict the b... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_init): + Use LAME's default for the min/max/mean VBR bitrate. Setting our own + defaults will restrict the bitrate when using the presets in a bad way. + Fixes bug #498004. + +2008-07-27 11:01:12 +0000 Sebastian Dröge + + Put the MPEG audio version into the caps as "mpegaudioversion". + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_setcaps): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header), (mp3_caps_create), + (gst_mp3parse_chain): + Put the MPEG audio version into the caps as "mpegaudioversion". + This is different from "mpegversion". + +2008-07-22 18:25:08 +0000 Sebastian Dröge + + ext/lame/gstlame.*: Fix build with lame >= 3.97. The padding type and cwlimit settings are deprecated now and the fun... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + Fix build with lame >= 3.97. The padding type and cwlimit settings + are deprecated now and the function declarations are hidden in the + headers so deprecate the GObject properties for them and remove them + in 0.11. Fixes bug #544039. + +2008-07-13 10:13:06 +0000 Sebastian Dröge + + ext/mpeg2dec/gstmpeg2dec.c: Don't allow width/height outside the spec (i.e. smaller than 16 and higher than 4096). Su... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (handle_sequence): + Don't allow width/height outside the spec (i.e. smaller than 16 + and higher than 4096). Such files are corrupted ones and setting + caps that are not a subset of the template caps confuses playbin. + Fixes bug #542646. + +2008-07-11 12:30:22 +0000 Sebastian Dröge + + ext/sidplay/Makefile.am: Fix the build. + Original commit message from CVS: + * ext/sidplay/Makefile.am: + Fix the build. + +2008-07-08 14:01:51 +0000 Sebastian Dröge + + configure.ac: Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include flags that are invalid for C++. + Original commit message from CVS: + * configure.ac: + Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include + flags that are invalid for C++. + +2008-07-05 18:57:30 +0000 Tal Shalif + + ext/dvdnav/dvdnavsrc.c: Prevent double free. Fixes bug #541697. + Original commit message from CVS: + Patch by: Tal Shalif + * ext/dvdnav/dvdnavsrc.c: (gst_dvd_nav_src_stop): + Prevent double free. Fixes bug #541697. + +2008-07-05 15:56:56 +0000 Mark Nauwelaerts + + gst/mpegstream/: Resend tags event after a FLUSH (seek) to support prerolling a partial pipeline. + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), + (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_parse_packhead), (gst_dvd_demux_reset): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init), + (gst_mpeg_demux_process_event), (gst_mpeg_demux_init_stream), + (gst_mpeg_demux_parse_packhead), (gst_mpeg_demux_reset): + * gst/mpegstream/gstmpegdemux.h: + Resend tags event after a FLUSH (seek) to support prerolling + a partial pipeline. + +2008-07-03 13:12:26 +0000 Tim-Philipp Müller + + Use correct error code for encrypted streams. + Original commit message from CVS: + * configure.ac: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_object): + Use correct error code for encrypted streams. + +2008-07-02 07:49:19 +0000 Mark Nauwelaerts + + gst/mpegstream/gstmpegdemux.c: Bridge gaps in stream by NEWSEGMENT sending. Fixes #540194. + Original commit message from CVS: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), + (gst_mpeg_demux_sync_stream_to_time): + Bridge gaps in stream by NEWSEGMENT sending. Fixes #540194. + +2008-06-27 12:58:35 +0000 Mark Nauwelaerts + + ext/dvdread/dvdreadsrc.c: Allow and implement non-flushing and/or segment seek (mainly in TIME and chapter format). + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_read), + (gst_dvd_read_src_create), (gst_dvd_read_src_handle_seek_event): + Allow and implement non-flushing and/or segment seek + (mainly in TIME and chapter format). + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event), + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_synchronise_pads), + (gst_dvd_demux_sync_stream_to_time): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_process_event), + (gst_mpeg_demux_send_subbuffer), + (gst_mpeg_demux_sync_stream_to_time), + (gst_mpeg_streams_reset_cur_ts): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_pad_added), (gst_mpeg_parse_handle_src_query): + Delegate a query to upstream if it can't be handled. + Make segment stop aware. + Fix (subtitle) stream synchronization. + Add some debug statements. + +2008-06-26 10:40:03 +0000 Edward Hervey + + gst/mpegaudioparse/gstmpegaudioparse.c: Fix build on macosx. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (head_check): + Fix build on macosx. + +2008-06-13 06:57:21 +0000 Stefan Kost + + Add missing elements to docs. Restore alphabetical order in section file. Document mad (it was included in docs alrea... + Original commit message from CVS: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbparse.c: + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstrtspwms.c: + * gst/mpegaudioparse/gstxingmux.c: + * gst/realmedia/rademux.c: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rtspreal.c: + * gst/synaesthesia/gstsynaesthesia.c: + Add missing elements to docs. Restore alphabetical order in section + file. Document mad (it was included in docs already). + Fix doc-markup: use convinience syntax for examples + (produces valid docbook), add several refsec2 when we have several + titles. Fix some types. + +2008-06-13 05:52:17 +0000 Stefan Kost + + Do not use short_description in section docs for elements. We extract them from element details and there will be war... + Original commit message from CVS: + * ext/lame/gstlame.c: + * ext/sidplay/gstsiddec.cc: + * gst/mpegaudioparse/gstxingmux.c: + Do not use short_description in section docs for elements. We extract + them from element details and there will be warnings if they differ. + +2008-06-09 20:02:05 +0000 Benjamin Kampmann + + ext/cdio/: Also extract album title and album genre from CD-TEXT if available (#537021). + Original commit message from CVS: + Patch by: Benjamin Kampmann + * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext), + (gst_cdio_add_cdtext_album_tags): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Also extract album title and album genre from CD-TEXT if + available (#537021). + +2008-06-09 07:51:00 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Don't mark MPEG headers with emphasis == 0x2 as invalid. This emphasis value ... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (head_check): + Don't mark MPEG headers with emphasis == 0x2 as invalid. This + emphasis value is reserved but unfortunately files with that + value exist and the information is not important for the decoder + anyway. Fixes bug #537235. + +2008-06-07 18:48:54 +0000 Tim-Philipp Müller + + Require libcdio >= 0.76. + Original commit message from CVS: + * configure.ac: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Require libcdio >= 0.76. + +2008-06-02 15:44:57 +0000 Wim Taymans + + ext/a52dec/gsta52dec.c: Drain queued buffers before forwarding the segment event. + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_sink_event): + Drain queued buffers before forwarding the segment event. + +2008-06-02 11:59:07 +0000 Wim Taymans + + ext/a52dec/gsta52dec.*: Add segment handling, buffer clipping and basic reverse playback. + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (clear_queued), (flush_queued), + (gst_a52dec_drain), (gst_a52dec_push), (gst_a52dec_sink_event), + (gst_a52dec_chain), (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Add segment handling, buffer clipping and basic reverse playback. + +2008-05-28 11:43:01 +0000 Stefan Kost + + Random doc of the day. Also print human readable format of newsegment in log message if we complain about it. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + * ext/a52dec/gsta52dec.c: + Random doc of the day. Also print human readable format of newsegment + in log message if we complain about it. + +2008-05-26 09:06:54 +0000 Wim Taymans + + ext/a52dec/gsta52dec.*: Mark discont on outgoing buffers after receiving a DISCONT buffer or when we have a decoding ... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_push), + (gst_a52dec_sink_event), (gst_a52dec_handle_frame), + (gst_a52dec_chain), (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Mark discont on outgoing buffers after receiving a DISCONT buffer or + when we have a decoding error. + We don't need to clear the cache when we receive a NEWSEGMENT event. + Clear buffer cache in DISCONT. + Add beginnings of GstSegment handling. + +2008-05-26 07:41:24 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstxingmux.c: Fix alignment issues that caused SIGBUS on some architectures. + Original commit message from CVS: + * gst/mpegaudioparse/gstxingmux.c: (generate_xing_header): + Fix alignment issues that caused SIGBUS on some architectures. + +2008-05-25 21:30:40 +0000 Tim-Philipp Müller + + gst/ac3parse/gstac3parse.c: Fix alignment issue which isn't really an issue at all because the plugin hasn't been por... + Original commit message from CVS: + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): + Fix alignment issue which isn't really an issue at all because + the plugin hasn't been ported to 0.10 yet. + +2008-05-25 21:03:41 +0000 Jan Schmidt + + configure.ac: Back to devel -> 0.10.8.1 + Original commit message from CVS: + * configure.ac: + Back to devel -> 0.10.8.1 + +=== release 0.10.8 === + +2008-05-21 23:03:13 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * gst-plugins-ugly.doap: + * po/LINGUAS: + Release 0.10.8 + Original commit message from CVS: + Release 0.10.8 + +2008-05-21 22:43:42 +0000 Jan Schmidt + + * common: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/it.po: + * po/lt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-05-19 21:38:16 +0000 Jan Schmidt + + configure.ac: 0.10.7.4 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.7.4 pre-release + +2008-05-19 15:07:07 +0000 Edward Hervey + + ext/mad/gstmad.c: Fix inconsistent use of rate and channels. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_convert_src), (gst_mad_chain): + Fix inconsistent use of rate and channels. + Fixes #533581 + +2008-05-19 10:23:46 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Flush timestamp correction variables on a flush. Fixes #533832. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_send_event): + Flush timestamp correction variables on a flush. Fixes #533832. + +2008-05-19 10:02:41 +0000 Jan Schmidt + + * ChangeLog: + * common: + * configure.ac: + Commit 0.10.7.3 pre-rel marker + Original commit message from CVS: + Commit 0.10.7.3 pre-rel marker + +2008-05-13 09:33:09 +0000 Edward Hervey + + gst/realmedia/rmdemux.c: Properly aggregate GstFlowReturn from downstream in order to properly stop, and doing that a... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_video_packet): + Properly aggregate GstFlowReturn from downstream in order to properly + stop, and doing that as early as possible. + Fixes #532807 + +2008-05-10 15:32:41 +0000 Jan Schmidt + + configure.ac: 0.10.7.2 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.7.2 pre-release + +2008-05-10 00:44:00 +0000 Edward Hervey + + Always let FLUSH_START events flow downstream. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_sink_event): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event): + Always let FLUSH_START events flow downstream. + +2008-05-07 08:00:24 +0000 Tim-Philipp Müller + + configure.ac: Error out if we don't have the required core/base versions. + Original commit message from CVS: + * configure.ac: + Error out if we don't have the required core/base versions. + +2008-05-06 17:53:26 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Fix video timestamps by adjusting it with the first timestamp found. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr), + (gst_rmdemux_fix_timestamp), (gst_rmdemux_parse_video_packet), + (gst_rmdemux_parse_audio_packet), (gst_rmdemux_parse_packet): + Fix video timestamps by adjusting it with the first timestamp found. + Don't assume we have a complete fragment when flushing the adapter, + packets might have been lost or the stream might just be broken. + +2008-05-06 10:30:18 +0000 Wim Taymans + + gst/realmedia/rdtmanager.c: Set Rank to NONE so that we don't accidentally try to autoplug the rdtmanager. + Original commit message from CVS: + * gst/realmedia/rdtmanager.c: (gst_rdt_manager_plugin_init): + Set Rank to NONE so that we don't accidentally try to autoplug the + rdtmanager. + +2008-05-05 08:43:38 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Send a new duration message if the average bitrate changed and we don't know ... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + Send a new duration message if the average bitrate changed and + we don't know the duration from the Xing or VBRI header. + Fixes bug #321857. + +2008-04-30 17:16:47 +0000 Wim Taymans + + gst/realmedia/rtspreal.*: Move assembly rule parsing to the place where we parse the SDP as it's also there that we c... + Original commit message from CVS: + * gst/realmedia/rtspreal.c: (rtsp_ext_real_before_send), + (rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select): + * gst/realmedia/rtspreal.h: + Move assembly rule parsing to the place where we parse the SDP as it's + also there that we create the MDPR and we need the currently selected + asmrule in order to select the right MTLI. + Fixes #529359. + +2008-04-29 17:34:19 +0000 Michael Smith + + gst/realmedia/: Include generated "_stdint.h" instead of which might not exist on some systems. + Original commit message from CVS: + * gst/realmedia/realhash.c: + * gst/realmedia/rtspreal.c: + Include generated "_stdint.h" instead of which might not + exist on some systems. + +2008-04-25 23:10:54 +0000 Sebastian Dröge + + ext/sidplay/gstsiddec.cc: Cast NULL sentinels to void * as NULL is defined as an integer constant in most environment... + Original commit message from CVS: + * ext/sidplay/gstsiddec.cc: + Cast NULL sentinels to void * as NULL is defined as an integer + constant in most environments when using C++ and it's size might + be different from a pointer. Fixes #529488. + +2008-04-22 12:11:30 +0000 Edgard Lima + + * ChangeLog: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstrtspwms.c: + Fix "unused var" compiler error when --disable-gst-debug is used. + Original commit message from CVS: + Fix "unused var" compiler error when --disable-gst-debug is used. + +2008-04-17 20:58:00 +0000 Tim-Philipp Müller + + ext/amrnb/amrnbparse.c: We should also stop the streaming task when we get a NOT_LINKED flow return, which is not cov... + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_loop): + We should also stop the streaming task when we get a NOT_LINKED + flow return, which is not covered by FLOW_IS_FATAL. + +2008-04-17 10:24:32 +0000 Edward Hervey + + ext/: gst_atomic_int_set ==> g_atomic_int_set + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdemux.c: + gst_atomic_int_set ==> g_atomic_int_set + +2008-04-11 08:09:55 +0000 Julien Moutte + + gst/mpegaudioparse/gstxingmux.c: Fix argument formats. + Original commit message from CVS: + 2008-04-11 Julien Moutte + * gst/mpegaudioparse/gstxingmux.c: (generate_xing_header): Fix + argument formats. + +2008-04-06 08:57:33 +0000 Damien Lespiau + + configure.ac: Actually build dlls when cross-compiling with mingw32. + Original commit message from CVS: + Patch by: Damien Lespiau + * configure.ac: + Actually build dlls when cross-compiling with mingw32. + Fixes bug #526247. + +2008-04-04 19:04:20 +0000 Sebastian Dröge + + Depend on GLib 2.12 and use it unconditionally as we do in other modules too already. + Original commit message from CVS: + * configure.ac: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mpeg_audio_seek_entry_free): + * gst/mpegaudioparse/gstxingmux.c: (gst_xing_seek_entry_free): + Depend on GLib 2.12 and use it unconditionally as we do in other + modules too already. + +2008-04-03 15:21:50 +0000 Sebastian Dröge + + gst/mpegaudioparse/: Use GSlice for allocating the seek table entries if we compile with + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mpeg_audio_seek_entry_new), (mpeg_audio_seek_entry_free), + (gst_mp3parse_reset), (gst_mp3parse_emit_frame): + * gst/mpegaudioparse/gstxingmux.c: (gst_xing_seek_entry_new), + (gst_xing_seek_entry_free), (gst_xing_mux_finalize), (xing_reset), + (gst_xing_mux_chain): + Use GSlice for allocating the seek table entries if we compile with + GLib 2.10 or newer. + +2008-04-01 14:39:24 +0000 Wim Taymans + + gst/asfdemux/gstasfdemux.c: Remove some debug code. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_stream_props): + Remove some debug code. + +2008-04-01 14:29:32 +0000 Wim Taymans + + gst/asfdemux/gstasfdemux.c: Guard against division by 0 and fall back to 25/1 framerate. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_stream_props): + Guard against division by 0 and fall back to 25/1 framerate. + +2008-04-01 14:00:32 +0000 Wim Taymans + + gst/asfdemux/gstasfdemux.c: Instead of adding a fixes 25/1 framerate to the video caps, use the average frame duratio... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_ext_stream_props): + Instead of adding a fixes 25/1 framerate to the video caps, use the + average frame duration in the extended properties of the video stream as + the framerate. Fixes #524346. + +2008-03-21 14:15:27 +0000 Sebastian Dröge + + configure.ac: Check if the compiler supports do { } while (0) macros. This fixes a warning when compiling with g++ 4.... + Original commit message from CVS: + * configure.ac: + Check if the compiler supports do { } while (0) macros. This fixes + a warning when compiling with g++ 4.3, resulting in a build failure + because of -Werror. + +2008-03-19 11:01:25 +0000 Wim Taymans + + gst/realmedia/asmrules.c: make ) also a delimiter for rules. + Original commit message from CVS: + * gst/realmedia/asmrules.c: (gst_asm_scan_string), (main): + make ) also a delimiter for rules. + Skip \\ when scanning strings. + Add new testcase for these problems. + +2008-03-12 16:09:48 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Don't take the stream lock when caching events. This is not necessary and res... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event): + Don't take the stream lock when caching events. This is not necessary + and results in a deadlock when seeking with rhythmbox (but not with + totem or banshee for some reason). + +2008-03-10 15:17:24 +0000 Pizpot Gargravarr + + gst/realmedia/rtspreal.c: Add the version field when creating the CONT chunk resulting in the Author, Comment and Cop... + Original commit message from CVS: + Patch by: Pizpot Gargravarr + * gst/realmedia/rtspreal.c: (rtsp_ext_real_parse_sdp): + Add the version field when creating the CONT chunk resulting in + the Author, Comment and Copyright tags not being parsed correctly. + Fixes #521459. + +2008-03-10 15:13:10 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.c: Remove trailing newlines from debug statements. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (gst_mp3parse_chain): + Remove trailing newlines from debug statements. + +2008-03-04 22:54:21 +0000 Simone Gotti + + ext/dvdnav/dvdnavsrc.*: Apply patch that adds some seeking support to dvdnav, and fixes it in various other ways. Thi... + Original commit message from CVS: + * ext/dvdnav/dvdnavsrc.c: + * ext/dvdnav/dvdnavsrc.h: + Apply patch that adds some seeking support to dvdnav, and fixes it + in various other ways. This doesn't make dvdnavsrc fully functional, + but moves it forward. + Fixes: #476149 + Patch By: Simone Gotti + * ext/dvdnav/gst-dvd: + Update the simple dvdnavsrc gst-launch example to work for 0.10 + +2008-03-03 12:50:56 +0000 Peter Kjellerstedt + + configure.ac: Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which plug-ins are included/excluded. (#4... + Original commit message from CVS: + * configure.ac: + Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which + plug-ins are included/excluded. (#498222) + +2008-02-27 15:23:51 +0000 Sebastian Dröge + + Push EOS, FLUSH_STOP and NEWSEGMENT immediately instead of dropping and leaking them. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_sink_event): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event): + Push EOS, FLUSH_STOP and NEWSEGMENT immediately instead + of dropping and leaking them. + +2008-02-27 13:18:57 +0000 Sebastian Dröge + + Cache all events except EOS if we still have to send a NEWSEGMENT event. This will let TAG events be forwarded until ... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_dispose), (gst_mad_sink_event), + (gst_mad_chain): + * ext/mad/gstmad.h: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_dispose), + (gst_mp3parse_sink_event), (gst_mp3parse_emit_frame): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Cache all events except EOS if we still have to send a NEWSEGMENT + event. This will let TAG events be forwarded until after decodebin + to an encoder for example as decodebin only links the pads + after NEWSEGMENT. Fixes bug #518933. + +2008-02-27 12:48:41 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstxingmux.c: Write Xing header at the correct position in the MP3 frame for stereo files. Fixes b... + Original commit message from CVS: + * gst/mpegaudioparse/gstxingmux.c: (get_xing_offset): + Write Xing header at the correct position in the MP3 frame for + stereo files. Fixes bug #518676. + +2008-02-23 12:35:53 +0000 Tim-Philipp Müller + + Check for and define ERROR_CXXFLAGS and GST_CXXFLAGS and use them when building C++ code (#516509). + Original commit message from CVS: + * configure.ac: + * ext/sidplay/Makefile.am: + Check for and define ERROR_CXXFLAGS and GST_CXXFLAGS and use them + when building C++ code (#516509). + +2008-02-22 14:55:57 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: Fix broken GST_ELEMENT_ERROR macro, fixes compile with the Sun + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_setcaps): + Fix broken GST_ELEMENT_ERROR macro, fixes compile with the Sun + Workshop 12 compiler, but probably also crashes (#517985). + +2008-02-22 07:11:17 +0000 Thiago Sousa Santos + + gst/mpegaudioparse/gstmpegaudioparse.*: Post channel mode and CRC as tags. Fixes bug #504493. + Original commit message from CVS: + Patch by: Thiago Sousa Santos + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3_channel_mode_get_type), + (mp3_type_frame_length_from_header), (gst_mp3parse_class_init), + (gst_mp3parse_reset), (gst_mp3parse_emit_frame), + (gst_mp3parse_chain): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Post channel mode and CRC as tags. Fixes bug #504493. + +2008-02-22 06:27:11 +0000 Sebastian Dröge + + ext/dvdnav/dvdnavsrc.c: Correctly chain up to the parent's finalize function. + Original commit message from CVS: + * ext/dvdnav/dvdnavsrc.c: (gst_dvd_nav_src_finalize): + Correctly chain up to the parent's finalize function. + +2008-02-22 06:25:28 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Try a bit harder to get valid timestamps, especially if upstream gives us one... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame), (gst_mp3parse_chain): + Try a bit harder to get valid timestamps, especially if upstream + gives us one and we are at the first frame or resyncing. + Return UNEXPECTED if we get a valid timestamp that is outside of + our configured segment. After all changes done so far this doesn't + seem to cause any regression, please test. + +2008-02-22 06:19:41 +0000 Sebastian Dröge + + gst/asfdemux/gstasfdemux.c: If we don't have the position to seek to in our index first try to convert from TIME to B... + Original commit message from CVS: + Patch by: + Hans de Goede + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_seek_event): + If we don't have the position to seek to in our index first try + to convert from TIME to BYTES upstream and only if that fails + too use the old hack to simply seek to an earlier position + and let the sink drop everything before segment start. + Partially fixes bug #469930. + +2008-02-21 23:54:25 +0000 Jan Schmidt + + configure.ac: Back to development... + Original commit message from CVS: + * configure.ac: + Back to development... + +=== release 0.10.7 === + +2008-02-21 00:15:22 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * gst-plugins-ugly.doap: + * po/LINGUAS: + Release 0.10.7 - I Cheated Time + Original commit message from CVS: + Release 0.10.7 - I Cheated Time + +2008-02-20 23:51:56 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/fi.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-02-18 20:40:29 +0000 Jan Schmidt + + tests/check/Makefile.am: Exclude dvdreadsrc from the states test too. + Original commit message from CVS: + * tests/check/Makefile.am: + Exclude dvdreadsrc from the states test too. + +2008-02-18 10:25:16 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Handler buffers without valid timestamp more correctly: Don't drop them and d... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + Handler buffers without valid timestamp more correctly: Don't drop + them and don't use the invalid timestamp to calculate the next + timestamp. Fixes bug #516811. + +2008-02-18 05:16:44 +0000 Tal Shalif + + ext/dvdread/dvdreadsrc.c: Add some gint64 casts to prevent 32 bit integer overflows. + Original commit message from CVS: + Patch by: Tal Shalif + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_create), + (gst_dvd_read_src_do_seek), (gst_dvd_read_src_do_position_query): + Add some gint64 casts to prevent 32 bit integer overflows. + Fixes bug #516989. + +2008-02-17 18:49:30 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.c: Revert previous commit to mp3parse, as it breaks playback of AVI files. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + Revert previous commit to mp3parse, as it breaks playback + of AVI files. + +2008-02-14 13:58:42 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Return GST_FLOW_UNEXPECTED if we get data that is after our configured segmen... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + Return GST_FLOW_UNEXPECTED if we get data that is after our + configured segment. This makes upstream go EOS immediately instead + of sending us the complete stream. Also improve debugging a bit. + +2008-02-13 22:57:54 +0000 Jan Schmidt + + ext/dvdread/dvdreadsrc.c: Fix regression in DVD seeking - when a pack we expect to be a NAV block turns out not to be... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: + Fix regression in DVD seeking - when a pack we + expect to be a NAV block turns out not to be, scan forwards + for up to 2MB (at most ~1sec) until we find one. + Fixes: #516278 + +2008-02-12 21:42:19 +0000 Sébastien Moutte + + win32/vs6/libgstmpegaudioparse.dsp: Add xing files to VS project file. + Original commit message from CVS: + * win32/vs6/libgstmpegaudioparse.dsp: + Add xing files to VS project file. + +2008-02-11 13:31:06 +0000 Sebastian Dröge + + gst/dvdsub/gstdvdsubparse.c: Stop leaking src pad templates. Fixes bug #515708. + Original commit message from CVS: + * gst/dvdsub/gstdvdsubparse.c: (gst_dvd_sub_parse_init): + Stop leaking src pad templates. Fixes bug #515708. + +2008-02-11 13:29:07 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstxingmux.c: Correctly write the size in bytes on big endian systems. + Original commit message from CVS: + * gst/mpegaudioparse/gstxingmux.c: (generate_xing_header): + Correctly write the size in bytes on big endian systems. + Fixes bug #515725. + +2008-02-11 09:13:33 +0000 Sebastian Dröge + + ext/lame/gstlame.c: Don't leak the allowed caps. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_setup): + Don't leak the allowed caps. + * tests/check/pipelines/lame.c: (GST_START_TEST): + Stop leaking all buffers. Fixes bug #515575. + +2008-02-08 10:17:11 +0000 Jan Schmidt + + gst/mpegaudioparse/plugin.c: Commit new file I forgot to add. + Original commit message from CVS: + * gst/mpegaudioparse/plugin.c: + Commit new file I forgot to add. + +2008-02-08 01:09:53 +0000 Jan Schmidt + + configure.ac: Make DISABLE_DEPRECATED defined *only* during CVS, not during pre-releases or releases. + Original commit message from CVS: + * configure.ac: + Make DISABLE_DEPRECATED defined *only* during CVS, not during + pre-releases or releases. + +2008-02-08 00:44:19 +0000 Jan Schmidt + + * ChangeLog: + Mention bug 511497 fixed in previous commit + Original commit message from CVS: + Mention bug 511497 fixed in previous commit + +2008-02-08 00:36:51 +0000 Jan Schmidt + + Move xingmux from -bad. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * gst/mpegaudioparse/Makefile.am: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstxingmux.c: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + Move xingmux from -bad. + +2008-02-07 19:25:08 +0000 Sébastien Moutte + + gst/mpegaudioparse/gstmpegaudioparse.c: Use gst_guint64_to_gdouble for conversion + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c:(mp3parse_time_to_bytepos): + Use gst_guint64_to_gdouble for conversion + * win32/vs6/libgstasfdemux.dsp: + * win32/vs6/libgstdvdsub.dsp: + * win32/vs6/libgstrealmedia.dsp: + Update project dependencies and add new source files + +2008-02-04 14:27:32 +0000 Zaheer Abbas Merali + + ext/mpeg2dec/gstmpeg2dec.c: Reset decoder when handling sequence where libmpeg2 has set frame period to 0, probably d... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: + Reset decoder when handling sequence where libmpeg2 has set + frame period to 0, probably due to a corrupt packet. + Fixes bug #514297 + +2008-01-29 19:10:38 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Don't set new caps on the srcpad everytime the bitrate or MPEG version change... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_caps_create), + (gst_mp3parse_chain): + Don't set new caps on the srcpad everytime the bitrate or MPEG + version changes but calculate new spf value when the MPEG version + changes. + +2008-01-23 10:34:40 +0000 Sebastian Dröge + + Add documentation for the xingheader plugin. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * gst/xingheader/gstxingmux.c: + * gst/xingheader/gstxingmux.h: + Add documentation for the xingheader plugin. + * tests/check/elements/xingmux.c: (GST_START_TEST): + Set element state to PLAYING before doing something else. + +2008-01-23 10:11:44 +0000 Sebastian Dröge + + tests/check/: Add simple unit test for the xingmux element. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/xingmux.c: (setup_xingmux), + (cleanup_xingmux), (GST_START_TEST), (xingmux_suite), (main): + * tests/check/elements/xingmux_testdata.h: + Add simple unit test for the xingmux element. + * gst/xingheader/gstxingmux.c: (generate_xing_header), + (gst_xing_mux_finalize), (xing_reset): + Fix a memleak and invalid seek tables with less than 100 MP3 frames. + +2008-01-21 13:35:02 +0000 Stefan Kost + + docs/plugins/: Add the real and rtsp elements and update the lists. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + Add the real and rtsp elements and update the lists. + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-siddec.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + Regenerate docs. + * gst/iec958/ac3_padder.c: + * gst/iec958/ac3_padder.h: + Do not use gtk-doc style comments for non gtk-doc comments. Note - + there are functions defined using extern in the .c file - does that + make sense? + +2008-01-21 12:43:37 +0000 Stefan Kost + + ext/mad/gstmad.c: Chain up at the end of the function. + Original commit message from CVS: + * ext/mad/gstmad.c: + Chain up at the end of the function. + +2008-01-19 16:04:14 +0000 Sebastian Dröge + + ext/mad/gstid3tag.c: Don't add pad templates for the base class but only in the subclasses. + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_id3_tag_class_init): + Don't add pad templates for the base class but only in the + subclasses. + +2008-01-17 17:26:48 +0000 Zaheer Abbas Merali + + ext/lame/gstlame.*: Fix the case where you initially have stereo input, and so lame's mode is not set to mono, and th... + Original commit message from CVS: + * ext/lame/gstlame.c: + * ext/lame/gstlame.h: + Fix the case where you initially have stereo input, and so lame's + mode is not set to mono, and then you get input with mono audio and + soon after you get stereo input again. What happened before this + commit is that it would keep the encoding mode as mono. It should + change it back to the one requested by the app (or the default one) + if not requested. + +2008-01-15 17:18:31 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Interpolate the VBRI seek table entries to get better results, support 3 byte... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_handle_first_frame), (mp3parse_time_to_bytepos), + (mp3parse_bytepos_to_time): + Interpolate the VBRI seek table entries to get better results, + support 3 byte seek table entries and prevent overflows in the + seek table by adding the relative offsets when using the seek + table in a large enough data type. + +2008-01-14 15:02:13 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.*: Add support for seeking based on the VBRI seek table. Might make sense to use... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), + (gst_mp3parse_handle_first_frame), (mp3parse_time_to_bytepos), + (mp3parse_bytepos_to_time): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Add support for seeking based on the VBRI seek table. Might make + sense to use interpolation in the table later to get hopefully a + bit more accurate values. + +2008-01-14 11:41:32 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.c: Fix compilation error. Fixes #509313. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (clear_queued), (flush_queued), + (handle_picture), (handle_slice): + Fix compilation error. Fixes #509313. + +2008-01-14 11:24:57 +0000 Sebastian Dröge + + ext/lame/gstlame.c: Use gst_util_uint64_scale instead of gst_util_uint64_scale_int as 8 * GST_SECOND is too large for... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_event): + Use gst_util_uint64_scale instead of gst_util_uint64_scale_int + as 8 * GST_SECOND is too large for int. + +2008-01-14 10:52:20 +0000 Sebastian Dröge + + gst/xingheader/gstxingmux.c: Bitrate is 4 bits, not 8 so check for 0xe as maximum value instead of 0xfe. + Original commit message from CVS: + * gst/xingheader/gstxingmux.c: (generate_xing_header): + Bitrate is 4 bits, not 8 so check for 0xe as maximum value instead + of 0xfe. + +2008-01-14 10:42:48 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.*: Add initial support for reading VBRI headers as found in VBR files created by... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), + (gst_mp3parse_emit_frame), (gst_mp3parse_handle_first_frame), + (mp3parse_total_bytes), (mp3parse_total_time): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Add initial support for reading VBRI headers as found in VBR files + created by some Fraunhofer encoders. Currently we only read the + number of frames and bytes (and calculate duration, etc from this) + but there is also a seek table that we currently don't use. + +2008-01-14 09:17:47 +0000 Mark Nauwelaerts + + ext/lame/gstlame.c: Correctly set number of channels when using mono-encoding mode and fix the duration calculation o... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * ext/lame/gstlame.c: (gst_lame_sink_setcaps), + (gst_lame_sink_event): + Correctly set number of channels when using mono-encoding mode + and fix the duration calculation of the EOS buffer. + +2008-01-14 09:13:29 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Guard against 0 values in the Xing header as frame count and byte count and c... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_handle_first_frame): + Guard against 0 values in the Xing header as frame count and + byte count and calculate the bitrate when we have all values + we need and not before. + +2008-01-14 09:09:49 +0000 Sebastian Dröge + + gst/xingheader/gstxingmux.c: Remove accidentially leftover debug printf. + Original commit message from CVS: + * gst/xingheader/gstxingmux.c: (generate_xing_header): + Remove accidentially leftover debug printf. + +2008-01-14 08:56:31 +0000 Sebastian Dröge + + gst/xingheader/gstxingmux.c: Choose smallest possible frame size for the Xing header, properly set the timestamp, dur... + Original commit message from CVS: + * gst/xingheader/gstxingmux.c: (has_xing_header), + (generate_xing_header), (gst_xing_mux_chain), + (gst_xing_mux_sink_event): + Choose smallest possible frame size for the Xing header, properly + set the timestamp, duration and offset on the outgoing buffers, + only send NEWSEGMENT events in BYTE format downstream and also + drop VBRI headers if already existing. + +2008-01-12 09:22:06 +0000 Sebastian Dröge + + gst/xingheader/: Major cleanup and rewrite of xingmux with less bugs and new features: + Original commit message from CVS: + * gst/xingheader/Makefile.am: + * gst/xingheader/gstxingmux.c: (parse_header), (get_xing_offset), + (has_xing_header), (generate_xing_header), + (gst_xing_mux_base_init), (gst_xing_mux_finalize), (xing_reset), + (gst_xing_mux_init), (gst_xing_mux_chain), + (gst_xing_mux_sink_event), (gst_xing_mux_change_state): + * gst/xingheader/gstxingmux.h: + Major cleanup and rewrite of xingmux with less bugs and new features: + - Handles other layers as 3 + - Write TOC + +2008-01-10 17:24:09 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Call g_type_class_ref() from a thread-safe context and not from the streaming thread to avoid GLib ... + Original commit message from CVS: + * ext/mad/gstmad.c: (GST_TYPE_MAD_MODE), + (GST_TYPE_MAD_EMPHASIS), (GST_TAG_EMPHASIS), (CHECK_HEADER): + Call g_type_class_ref() from a thread-safe context and not + from the streaming thread to avoid GLib screwing up (see + bug #349410 and #493432). Comment out unused code. + +2008-01-10 15:24:08 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.*: Add buffer clipping. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (clear_queued), (flush_queued), + (handle_picture), (clip_buffer), (handle_slice), + (gst_mpeg2dec_chain), (gst_mpeg2dec_sink_event), + (gst_mpeg2dec_change_state): + * ext/mpeg2dec/gstmpeg2dec.h: + Add buffer clipping. + Add basic reverse playback support. Not complete yet when dealing with + non-closed GOPs. + +2008-01-10 12:28:19 +0000 Sebastian Dröge + + autogen.sh: Add -Wno-portability to the automake parameters to stop warnings about GNU make extensions being used. We... + Original commit message from CVS: + * autogen.sh: + Add -Wno-portability to the automake parameters to stop warnings + about GNU make extensions being used. We require GNU make in almost + every Makefile anyway. + * configure.ac: + Use AM_PROG_CC_C_O as a compiler that accepts both -c and -o + at the same time is required for per target flags. + +2008-01-09 13:51:38 +0000 Stefan Kost + + Makefile.am: Include lcov.mak to allow building coverage reports. + Original commit message from CVS: + * Makefile.am: + Include lcov.mak to allow building coverage reports. + +2008-01-08 19:42:38 +0000 Sebastian Dröge + + Make sure that the Xing TOC starts with 0 and the entries are increasing over time. Otherwise it's broken and should ... + Original commit message from CVS: + * ext/mad/gstmad.c: (mpg123_parse_xing_header): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_handle_first_frame): + Make sure that the Xing TOC starts with 0 and the entries + are increasing over time. Otherwise it's broken and should + be skipped. Fixes bug #507821. + +2008-01-08 16:31:29 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.*: Parse metadata object and extract pixel aspect ratio. Fixes #507844. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (asfdemux_dbg), (gst_asf_demux_reset), + (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_get_metadata_for_stream), + (gst_asf_demux_process_metadata), (gst_asf_demux_process_object), + (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Parse metadata object and extract pixel aspect ratio. Fixes #507844. + +2007-12-31 21:41:52 +0000 David Schleef + + docs/plugins/.cvsignore: Add *-undeclared.txt + Original commit message from CVS: + * docs/plugins/.cvsignore: + Add *-undeclared.txt + +2007-12-21 14:01:06 +0000 Wim Taymans + + gst/realmedia/rdtmanager.*: Implement some more signals that rtspsrc connects to. + Original commit message from CVS: + * gst/realmedia/rdtmanager.c: + (gst_rdt_manager_marshal_VOID__UINT_UINT), + (gst_rdt_manager_class_init): + * gst/realmedia/rdtmanager.h: + Implement some more signals that rtspsrc connects to. + Fixes #504671. + +2007-12-18 09:07:53 +0000 Tim-Philipp Müller + + Makefile.am: Include common/win32.mak for CRLF check of win32 project files (see #393626). + Original commit message from CVS: + * Makefile.am: + Include common/win32.mak for CRLF check of win32 project + files (see #393626). + +2007-12-13 11:20:11 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Don't post SEGMENT_START messages on the bus, only the element driving the pi... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (mp3parse_handle_seek): + Don't post SEGMENT_START messages on the bus, only the element + driving the pipeline should do that. + +2007-12-09 04:29:35 +0000 Sebastian Dröge + + configure.ac: Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. + Original commit message from CVS: + * configure.ac: + Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. + +2007-12-03 19:05:20 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.h: Use G_GINT64_CONSTANT, fixes compilation with MSVC 6.0. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.h: + Use G_GINT64_CONSTANT, fixes compilation with MSVC 6.0. + Fixes #500808. + +2007-11-20 12:15:51 +0000 Julien Moutte + + gst/realmedia/rtspreal.c: Fix build on Mac OS X. + Original commit message from CVS: + 2007-11-20 Julien MOUTTE + * gst/realmedia/rtspreal.c: (rtsp_ext_real_parse_sdp): Fix build + on Mac OS X. + +2007-11-19 11:38:49 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.c: Restore the segment handling logic. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + Restore the segment handling logic. + Please don't do behavioural changes under the heading of 'leak fixes' + or 'whitespace changes', people. + +2007-11-19 09:50:58 +0000 Stefan Kost + + gst/mpegaudioparse/gstmpegaudioparse.c: Plug some leaks. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + Plug some leaks. + +2007-11-13 06:57:57 +0000 Stefan Kost + + gst/asfdemux/gstasfdemux.c: Sync _activate_pull() a little more with other demuxers. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + Sync _activate_pull() a little more with other demuxers. + +2007-11-11 20:41:32 +0000 Thijs Vermeir + + gst/mpegstream/gstmpegdemux.c: recognize the padding stream + Original commit message from CVS: + * gst/mpegstream/gstmpegdemux.c: + recognize the padding stream + +2007-10-31 14:33:03 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Convert tags that come as string into the type required by + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): + Convert tags that come as string into the type required by + GstTagList. + +2007-10-30 12:27:32 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.c: Remove some more broken code, it seems to clip even when it should not. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + Remove some more broken code, it seems to clip even when it should not. + See #491305. + +2007-10-30 11:13:49 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.c: When the element is not driving the streaming thread it is not supposed to em... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + When the element is not driving the streaming thread it is not supposed + to emit EOS or post SEGMENT done. It is allowed to return UNEXPECTED + upstream when it detects EOS. See #491305. + +2007-10-13 15:13:34 +0000 Mark Nauwelaerts + + gst/dvdsub/: Add dvd subtitle parser, which just packetizes the input stream. This is needed to mux dvd subtitles int... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/dvdsub/Makefile.am: + * gst/dvdsub/gstdvdsubdec.c: + * gst/dvdsub/gstdvdsubparse.c: + * gst/dvdsub/gstdvdsubparse.h: + Add dvd subtitle parser, which just packetizes the input + stream. This is needed to mux dvd subtitles into matroska + files, since the muxer expects unfragmented and properly + timestamped input (#415754). + +2007-10-10 12:02:30 +0000 Tim-Philipp Müller + + configure.ac: Update requirements from past CVS versions to released versions (0.10.14 in this case). + Original commit message from CVS: + * configure.ac: + Update requirements from past CVS versions to released + versions (0.10.14 in this case). + * ext/sidplay/gstsiddec.cc: + Fix compilation with g++-4.2. + +2007-10-08 17:51:33 +0000 Jan Schmidt + + gst/realmedia/: Fix some compiler warnings shown on Forte. + Original commit message from CVS: + * gst/realmedia/asmrules.c: (gst_asm_scan_parse_expression), + (gst_asm_scan_parse_condition): + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_video_packet): + Fix some compiler warnings shown on Forte. + +2007-10-05 08:51:44 +0000 Gautier Portet + + gst/xingheader/gstxingmux.c: The size of the Xing header is actually 417 as it's rounded to the next smaller integer.... + Original commit message from CVS: + Patch by: Gautier Portet + * gst/xingheader/gstxingmux.c: + The size of the Xing header is actually 417 as it's rounded to the + next smaller integer. Fixes #397759. + * gst/xingheader/gstxingmux.c: (xing_generate_header), + (xing_push_header): + Some random cleanup, add FIXMEs and TODOs and check if the newsegment + event to the beginning was successful before pushing the header again. + +2007-09-29 17:11:16 +0000 Sébastien Moutte + + gst/mpegaudioparse/gstmpegaudioparse.c: Use gst_util_guint64_to_gdouble for conversions. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3parse_time_to_bytepos), + (mp3parse_bytepos_to_time): + Use gst_util_guint64_to_gdouble for conversions. + * win32/vs6/libgstmad.dsp: + Add a link to libgstaudio. + +2007-09-26 13:40:35 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: Fix up case where there is no peer, in which case _get_allowed_caps() will return NULL. + Original commit message from CVS: + * ext/lame/gstlame.c: + Fix up case where there is no peer, in which case + _get_allowed_caps() will return NULL. + +2007-09-25 13:20:27 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: Use GST_PTR_FORMAT to print caps in debug statement. + Original commit message from CVS: + * ext/lame/gstlame.c: + Use GST_PTR_FORMAT to print caps in debug statement. + +2007-09-25 09:16:05 +0000 Sebastian Dröge + + configure.ac: Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and + Original commit message from CVS: + * configure.ac: + Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and + AG_GST_ARG_ENABLE_EXPERIMENTAL instead of duplicating those macros + in configure.ac. + +2007-09-24 10:26:21 +0000 Thomas Vander Stichele + + ext/lame/gstlame.c: Allow fixing the sample rate lame converts to by negotiating fixed sample rate on the src pad caps. + Original commit message from CVS: + * ext/lame/gstlame.c: + Allow fixing the sample rate lame converts to by negotiating fixed + sample rate on the src pad caps. + Add docs for it. + * tests/check/Makefile.am: + * tests/check/pipelines/lame.c: + Add a check for it. + +2007-09-22 18:22:12 +0000 Thomas Vander Stichele + + po/: Updated translations. + Original commit message from CVS: + * po/LINGUAS: + * po/da.po: + Updated translations. + +2007-09-22 18:20:50 +0000 Thomas Vander Stichele + + po/pl.po: Added Polish translation. + Original commit message from CVS: + translated by: Jakub Bogusz + * po/pl.po: + Added Polish translation. + +2007-09-22 18:19:08 +0000 Thomas Vander Stichele + + po/fi.po: Added Finnish translation. + Original commit message from CVS: + translated by: Ilkka Tuohela + * po/fi.po: + Added Finnish translation. + +2007-09-22 18:17:52 +0000 Thomas Vander Stichele + + po/es.po: Added Spanish translation. + Original commit message from CVS: + translated by: Jorge González González + * po/es.po: + Added Spanish translation. + +2007-09-22 18:17:08 +0000 Thomas Vander Stichele + + po/bg.po: Added Bulgarian translation. + Original commit message from CVS: + translated by: Alexander Shopov + * po/bg.po: + Added Bulgarian translation. + +2007-09-20 11:47:52 +0000 Stefan Kost + + gst/iec958/ac3iec.c: Chainup in finalize. + Original commit message from CVS: + * gst/iec958/ac3iec.c: + Chainup in finalize. + * tests/check/Makefile.am: + * tests/check/generic/states.c: + Improved state change unit test. + +2007-09-19 18:20:41 +0000 Stefan Kost + + Ignore registries in any format. + Original commit message from CVS: + * docs/plugins/.cvsignore: + * tests/check/.cvsignore: + Ignore registries in any format. + +2007-09-08 20:54:54 +0000 Tim-Philipp Müller + + configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for a define in the lame headers. This has the advan... + Original commit message from CVS: + * configure.ac: + Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for a + define in the lame headers. This has the advantage that + it should still work when we're cross-compiling (#452025). + +2007-08-24 15:55:03 +0000 Jan Schmidt + + gst/dvdlpcmdec/gstdvdlpcmdec.c: Add other allowed rates to the pad templates. + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + Add other allowed rates to the pad templates. + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_dispose): + Reset the parser to release memory in dispose. + +2007-08-17 06:56:53 +0000 Stefan Kost + + ext/: Fix more leaks. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbparse.c: + * ext/sidplay/gstsiddec.cc: + Fix more leaks. + +2007-08-16 14:49:11 +0000 Daniel Charles + + ext/amrnb/amrnbenc.*: Add property to select the BandMode of the AMR encoder. + Original commit message from CVS: + Patch by: Daniel Charles + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_bandmode_get_type), + (gst_amrnbenc_set_property), (gst_amrnbenc_get_property), + (gst_amrnbenc_base_init), (gst_amrnbenc_class_init), + (gst_amrnbenc_chain), (gst_amrnbenc_state_change): + * ext/amrnb/amrnbenc.h: + Add property to select the BandMode of the AMR encoder. + See #466442. + +2007-08-16 12:15:32 +0000 Stefan Kost + + gst/realmedia/asmrules.c: Make ro memory to share. + Original commit message from CVS: + * gst/realmedia/asmrules.c: + Make ro memory to share. + +2007-08-16 11:52:57 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.*: Queue segment event and push it after we know the caps on the pad or else an ... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (gst_mp3parse_emit_frame): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Queue segment event and push it after we know the caps on the pad or + else an autoplugger might not have plugged the element yet and the + segment is lost. + +2007-08-16 07:17:13 +0000 Stefan Kost + + gst/iec958/ac3iec.c: Fix tests. + Original commit message from CVS: + * gst/iec958/ac3iec.c: + Fix tests. + +2007-08-16 06:48:13 +0000 Stefan Kost + + tests/check/: Add generic state-change test suite to help to fi leaks. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/generic/.cvsignore: + * tests/check/generic/states.c: + Add generic state-change test suite to help to fi leaks. + +2007-08-09 10:57:11 +0000 Thomas Vander Stichele + + po/: Added Portuguese (Brazilian) translation. + Original commit message from CVS: + translated by: Raphael Higino + * po/LINGUAS: + * po/pt_BR.po: + Added Portuguese (Brazilian) translation. + +2007-08-09 10:55:59 +0000 Thomas Vander Stichele + + po/: Updated translations. + Original commit message from CVS: + * po/hu.po: + * po/nl.po: + * po/sv.po: + * po/uk.po: + Updated translations. + +2007-08-07 11:50:44 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Activate timestamp fixing code. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_fix_timestamp), + (gst_rmdemux_parse_video_packet): + Activate timestamp fixing code. + +2007-08-07 10:57:09 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Do fragment collection in the demuxer so that we can now work with both ffmpeg and realvideo... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_reset), + (gst_rmdemux_chain), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_fix_timestamp), (gst_rmdemux_parse_video_packet), + (gst_rmdemux_parse_audio_packet), (gst_rmdemux_parse_packet): + Do fragment collection in the demuxer so that we can now work with + both ffmpeg and realvideodec to decoder real video content. + +2007-08-04 12:59:24 +0000 Stefan Kost + + gst/realmedia/asmrules.c: Include stdlib.h. + Original commit message from CVS: + * gst/realmedia/asmrules.c: + Include stdlib.h. + +2007-08-03 16:21:19 +0000 Wim Taymans + + gst/realmedia/rdtmanager.c: Fix caps. + Original commit message from CVS: + * gst/realmedia/rdtmanager.c: + Fix caps. + +2007-08-03 16:11:09 +0000 Wim Taymans + + gst/realmedia/rtspreal.c: Disable UDP transport for now. + Original commit message from CVS: + * gst/realmedia/rtspreal.c: (rtsp_ext_real_get_transports), + (rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select): + Disable UDP transport for now. + +2007-08-03 16:09:01 +0000 Wim Taymans + + gst/realmedia/: Add simple rdt manager. + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/rdtmanager.c: (find_session_by_id), + (create_session), (free_session), (gst_rdt_manager_base_init), + (gst_rdt_manager_marshal_BOXED__UINT_UINT), + (gst_rdt_manager_class_init), (gst_rdt_manager_init), + (gst_rdt_manager_finalize), (gst_rdt_manager_query_src), + (gst_rdt_manager_chain_rtp), (gst_rdt_manager_chain_rtcp), + (gst_rdt_manager_set_property), (gst_rdt_manager_get_property), + (gst_rdt_manager_provide_clock), (gst_rdt_manager_change_state), + (create_recv_rtp), (create_recv_rtcp), (create_rtcp), + (gst_rdt_manager_request_new_pad), (gst_rdt_manager_release_pad), + (gst_rdt_manager_plugin_init): + * gst/realmedia/rdtmanager.h: + * gst/realmedia/rmdemux.c: (plugin_init): + Add simple rdt manager. + +2007-08-03 14:19:50 +0000 Wim Taymans + + gst/realmedia/rdtdepay.c: Fix the encoding-name so that it matches what the rtsp extension sets. + Original commit message from CVS: + * gst/realmedia/rdtdepay.c: + Fix the encoding-name so that it matches what the rtsp extension sets. + +2007-08-02 19:37:41 +0000 Wim Taymans + + gst/realmedia/: Use g_hash_table_destroy instead of _unref which is too new. + Original commit message from CVS: + * gst/realmedia/asmrules.c: (gst_asm_node_free), + (gst_asm_node_evaluate), (gst_asm_scan_new), (gst_asm_scan_free), + (gst_asm_scan_string), (gst_asm_scan_number), + (gst_asm_scan_identifier), (gst_asm_scan_print_token), + (gst_asm_scan_next_token), (gst_asm_rule_free), + (gst_asm_rule_add_property), (gst_asm_scan_parse_operand), + (gst_asm_scan_parse_expression), (gst_asm_scan_parse_condition), + (gst_asm_scan_parse_property), (gst_asm_scan_parse_rule), + (gst_asm_rule_evaluate), (gst_asm_rule_book_new), + (gst_asm_rule_book_n_rules), (gst_asm_rule_book_free), + (gst_asm_rule_book_match), (main): + * gst/realmedia/rtspreal.c: (rtsp_ext_real_parse_sdp), + (rtsp_ext_real_stream_select), (gst_rtsp_real_plugin_init): + Use g_hash_table_destroy instead of _unref which is too new. + +2007-08-02 19:30:05 +0000 Wim Taymans + + gst/realmedia/.cvsignore: Add test to ignore. + Original commit message from CVS: + * gst/realmedia/.cvsignore: + Add test to ignore. + * gst/realmedia/Makefile.am: + * gst/realmedia/asmrules.c: (gst_asm_node_new), + (gst_asm_node_free), (gst_asm_operator_eval), + (gst_asm_node_evaluate), (gst_asm_scan_new), (gst_asm_scan_free), + (gst_asm_scan_string), (gst_asm_scan_number), + (gst_asm_scan_identifier), (gst_asm_scan_print_token), + (gst_asm_scan_next_token), (gst_asm_rule_new), (gst_asm_rule_free), + (gst_asm_rule_add_property), (gst_asm_scan_parse_operand), + (gst_asm_scan_parse_expression), (gst_asm_scan_parse_condition), + (gst_asm_scan_parse_property), (gst_asm_scan_parse_rule), + (gst_asm_rule_evaluate), (gst_asm_rule_book_new), + (gst_asm_rule_book_n_rules), (gst_asm_rule_book_free), + (gst_asm_rule_book_match), (main): + * gst/realmedia/asmrules.h: + Added asembler rule book parser and evaluator. + * gst/realmedia/rtspreal.c: (rtsp_ext_real_parse_sdp), + (rtsp_ext_real_stream_select), (gst_rtsp_real_plugin_init): + * gst/realmedia/rtspreal.h: + Keep per stream config info. + Parse and evaluate asm rule books for stream selection. + +2007-07-31 19:16:44 +0000 Stefan Kost + + gst/realmedia/rtspreal.c: Include stdlib. + Original commit message from CVS: + * gst/realmedia/rtspreal.c: + Include stdlib. + +2007-07-27 16:39:45 +0000 Wim Taymans + + gst/realmedia/: Split out hash code in separate file. + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/realhash.c: (hash), (call_hash), + (gst_rtsp_ext_real_calc_response_and_checksum): + * gst/realmedia/realhash.h: + * gst/realmedia/rtspreal.c: (rtsp_ext_real_get_transports), + (rtsp_ext_real_after_send), (rtsp_ext_real_stream_select): + Split out hash code in separate file. + +2007-07-27 10:12:55 +0000 Wim Taymans + + gst/: Fix include paths and link dependecies for rtsp extension. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstrtspwms.c: (gst_rtsp_wms_parse_sdp), (_do_init), + (gst_rtsp_wms_class_init): + * gst/realmedia/Makefile.am: + * gst/realmedia/rtspreal.c: (rtsp_ext_real_get_transports), + (rtsp_ext_real_before_send), (rtsp_ext_real_after_send), + (rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select), + (_do_init), (gst_rtsp_real_class_init): + Fix include paths and link dependecies for rtsp extension. + +2007-07-26 15:52:43 +0000 Wim Taymans + + gst/realmedia/: Add RealMedia RTSP extension module. It has rank NONE until it is fully functional. + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/rmdemux.c: (plugin_init): + * gst/realmedia/rtspreal.c: (rtsp_ext_real_get_transports), + (rtsp_ext_real_before_send), (rtsp_ext_real_after_send), (hash), + (call_hash), (rtsp_ext_real_calc_response_and_checksum), + (rtsp_ext_real_parse_sdp), (rtsp_ext_real_stream_select), + (_do_init), (gst_rtsp_real_base_init), (gst_rtsp_real_class_init), + (gst_rtsp_real_init), (gst_rtsp_real_finalize), + (gst_rtsp_real_change_state), (gst_rtsp_real_extension_init), + (gst_rtsp_real_plugin_init): + * gst/realmedia/rtspreal.h: + Add RealMedia RTSP extension module. It has rank NONE until it is fully + functional. + +2007-07-25 18:38:42 +0000 Wim Taymans + + gst/asfdemux/: Move WMS RTSP extension from -good to here. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstrtspwms.c: (gst_rtsp_wms_before_send), + (gst_rtsp_wms_after_send), (gst_rtsp_wms_parse_sdp), + (gst_rtsp_wms_configure_stream), (_do_init), + (gst_rtsp_wms_base_init), (gst_rtsp_wms_class_init), + (gst_rtsp_wms_init), (gst_rtsp_wms_finalize), + (gst_rtsp_wms_change_state), (gst_rtsp_wms_extension_init): + * gst/asfdemux/gstrtspwms.h: + Move WMS RTSP extension from -good to here. + Port it to the new pluggable extension interface. + +2007-07-24 06:58:41 +0000 Stefan Kost + + ext/mad/Makefile.am: Link to audio helper from plugins-base. + Original commit message from CVS: + * ext/mad/Makefile.am: + Link to audio helper from plugins-base. + +2007-07-24 05:05:29 +0000 Sebastian Dröge + + Use the new buffer clipping function from gstaudio here and require gst-plugins-base CVS. + Original commit message from CVS: + * configure.ac: + * ext/mad/gstmad.c: (gst_mad_chain): + Use the new buffer clipping function from gstaudio here and + require gst-plugins-base CVS. + +2007-07-23 09:07:19 +0000 Stefan Kost + + configure.ac: Sync liboil check with plugins-base. Add libm check. + Original commit message from CVS: + * configure.ac: + Sync liboil check with plugins-base. Add libm check. + * gst/synaesthesia/Makefile.am: + Link against libm. We're using sqrt here. + +2007-07-20 07:58:25 +0000 Stefan Kost + + gst/asfdemux/gstasfdemux.c: Include stdlib. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + Include stdlib. + +2007-07-20 07:41:57 +0000 Stefan Kost + + ext/annodex/Makefile.am: Fix CFLAGS/LIBS. + Original commit message from CVS: + * ext/annodex/Makefile.am: + Fix CFLAGS/LIBS. + * ext/cdio/gstcdiocddasrc.c: + * ext/libpng/gstpngdec.c: (gst_pngdec_task): + Include stdlib + * ext/cairo/Makefile.am: + * gst/videofilter/Makefile.am: + * tests/examples/level/Makefile.am: + Use $(LIBM) instead of -lm + +2007-07-18 17:51:55 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.*: Save some memory for each frame by only saving the start timestamp and start ... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), + (gst_mp3parse_emit_frame), (mp3parse_handle_seek): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Save some memory for each frame by only saving the start timestamp + and start byte position instead of additionally the stop timestamp + and stop byte position. This requires us to use a doubly-linked list + but still saves 8-12 bytes per frame. + +2007-07-16 09:14:18 +0000 Sebastian Dröge + + ext/mad/gstmad.c: Fix buffer clipping to correctly clip to the segment stop. + Original commit message from CVS: + * ext/mad/gstmad.c: (clip_outgoing_buffer): + Fix buffer clipping to correctly clip to the segment stop. + +2007-07-15 19:39:46 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.c: Fix a calculation that was causing mp3parse to drop every incoming frame when... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_emit_frame): + Fix a calculation that was causing mp3parse to drop every incoming + frame when upstream delivered a segment in TIME format, breaking + playback of all mpeg system streams. + +2007-07-13 16:46:35 +0000 Jan Schmidt + + Remove bogus check for libcheck, since we check for gstreamer-check and it pulls in the required info from and we wer... + Original commit message from CVS: + * Makefile.am: + * configure.ac: + * tests/Makefile.am: + Remove bogus check for libcheck, since we check for + gstreamer-check and it pulls in the required info from + and we weren't actually _using_ the information for + libcheck ourselves anyway. + +2007-07-13 16:27:56 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.*: Implement accurate seeking in mpegaudioparse. Fixes #308312. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), + (gst_mp3parse_init), (gst_mp3parse_dispose), + (gst_mp3parse_sink_event), (mp3parse_seek_table_last_entry), + (gst_mp3parse_emit_frame), (gst_mp3parse_chain), + (mp3parse_handle_seek), (mp3parse_src_query): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Implement accurate seeking in mpegaudioparse. Fixes #308312. + Also implement segment seeks. + +2007-07-13 15:46:13 +0000 Sebastian Dröge + + ext/mad/gstmad.*: Implement buffer clipping and use GST_BOILERPLATE instead of manual + Original commit message from CVS: + * ext/mad/gstmad.c: (_do_init), (gst_mad_init), (index_seek), + (normal_seek), (gst_mad_sink_event), (clip_outgoing_buffer), + (gst_mad_chain), (gst_mad_change_state): + * ext/mad/gstmad.h: + Implement buffer clipping and use GST_BOILERPLATE instead of manual + GType magic. Part one of bug #308312. + +2007-07-12 11:21:23 +0000 Stefan Kost + + configure.ac: Use pkg-config to locate check. + Original commit message from CVS: + * configure.ac: + Use pkg-config to locate check. + +2007-07-11 23:18:14 +0000 Tim-Philipp Müller + + Fix build against core CVS by not using deprecated API. Bump requirements for new API (overdue anyway). + Original commit message from CVS: + * configure.ac: + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_descramble_buffer): + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain_raw): + Fix build against core CVS by not using deprecated API. Bump + requirements for new API (overdue anyway). + +2007-07-09 06:05:48 +0000 Stefan Kost + + REQUIREMENTS: Also add amr-libs here and update a little. + Original commit message from CVS: + * REQUIREMENTS: + Also add amr-libs here and update a little. + +2007-07-06 17:59:29 +0000 Tim-Philipp Müller + + docs/plugins/inspect/: Add inspect file for synaesthesia so the docs can be built even if the plugin isn't built yet.... + Original commit message from CVS: + * docs/plugins/inspect/plugin-dvdnav.xml: + * docs/plugins/inspect/plugin-realmedia.xml: + * docs/plugins/inspect/plugin-synaesthesia.xml: + Add inspect file for synaesthesia so the docs can be built even if + the plugin isn't built yet. Fixes #454311. Also add inspect files + for dvdnavsrc and realmedia. + +2007-07-05 08:44:30 +0000 Stefan Kost + + docs/plugins/Makefile.am: Simplify --extra-dir as gtkdoc scans recursively. + Original commit message from CVS: + * docs/plugins/Makefile.am: + Simplify --extra-dir as gtkdoc scans recursively. + +2007-07-03 13:05:01 +0000 Stefan Kost + + And yet more docs enabled. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * gst/synaesthesia/Makefile.am: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/synaesthesia/gstsynaesthesia.h: + And yet more docs enabled. + +2007-07-03 11:55:45 +0000 Stefan Kost + + docs/plugins/: Add new docs. Scan c++ files too. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + Add new docs. Scan c++ files too. + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_base_init), + (gst_amrnbdec_event): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_base_init): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_base_init), + (gst_amrnbparse_loop): + Add documentation headers. + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + Refactor for docs. + +2007-07-01 19:12:32 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Use GST_BOILERPLATE instead of manual GType magic. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_base_init), + (gst_mp3parse_init): + Use GST_BOILERPLATE instead of manual GType magic. + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_handle_first_frame), (mp3parse_time_to_bytepos), + (mp3parse_bytepos_to_time): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Implement seeking, byte->time, time->byte conversions with the Xing + seek table if available. This allows better at least a bit more + accurate seeks and file position reporting. + +2007-06-28 20:33:51 +0000 Sebastian Dröge + + gst/mpegaudioparse/gstmpegaudioparse.c: Copy the complete Xing seek table in the 100 byte array instead of copying th... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_handle_first_frame): + Copy the complete Xing seek table in the 100 byte array instead of + copying the first byte 100 times. + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3parse_total_bytes), + (mp3parse_total_time), (mp3parse_time_to_bytepos): + Add seeking support based on the Xing header but comment it out for + now as it seems to yield worse result than the other method. + Also use gst_pad_query_peer_duration() instead of getting the peer pad + ourself, creating a new GstQuery, etc. + +2007-06-25 12:46:47 +0000 Stefan Kost + + docs/plugins/: Update docs with caps info. + Original commit message from CVS: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + Update docs with caps info. + +2007-06-25 12:25:09 +0000 Tim-Philipp Müller + + po/POTFILES.in: Make sure dvdnav strings get translated too (no reason not to have them in the .po file, even if the ... + Original commit message from CVS: + * po/POTFILES.in: + Make sure dvdnav strings get translated too (no reason not to have + them in the .po file, even if the plugin is disabled for now). + Fixes #450879. + +2007-06-25 11:46:24 +0000 Stefan Kost + + ext/amrnb/: Add newsegment and discont handling. Some code cleanups. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_base_init), + (gst_amrnbdec_event), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_base_init), + (gst_amrnbparse_loop): + Add newsegment and discont handling. Some code cleanups. + +2007-06-25 07:55:51 +0000 David Schleef + + ext/dvdread/dvdreadsrc.c: check for an error from + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: check for an error from + DVDReadBlocks() correctly. + +2007-06-25 07:22:10 +0000 David Schleef + + ext/dvdread/dvdreadsrc.c: If we can't read a nav packet, or it doesn't look like a nav packet, that's an error. Prev... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: + If we can't read a nav packet, or it doesn't look like a nav + packet, that's an error. Previous behavior was to look at + the next packet; I can't find any justification for doing that. + Fixes: #358891. + +2007-06-23 22:57:29 +0000 Thomas Vander Stichele + + po/it.po: Updated Italian translation. + Original commit message from CVS: + * po/it.po: + Updated Italian translation. + +2007-06-23 11:22:39 +0000 Thomas Vander Stichele + + po/vi.po: Updated Vietnames translation. + Original commit message from CVS: + * po/vi.po: + Updated Vietnames translation. + +2007-06-23 11:21:54 +0000 Thomas Vander Stichele + + po/: Added Chinese (simplified) translation. + Original commit message from CVS: + contributed by: Wenzheng Hu + * po/LINGUAS: + * po/zh_CN.po: + Added Chinese (simplified) translation. + +2007-06-22 14:27:18 +0000 Jan Schmidt + + MAINTAINERS: Updating all the maintainers files + Original commit message from CVS: + * MAINTAINERS: + Updating all the maintainers files + +2007-06-22 10:57:06 +0000 Edward Hervey + + Fix leaks some more. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_init): + * gst/asfdemux/gstasfmux.c: (gst_asfmux_init): + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_init): + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_init): + * gst/iec958/ac3iec.c: (ac3iec_init): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_init): + Fix leaks some more. + +2007-06-21 14:33:58 +0000 Edward Hervey + + gst/mpegaudioparse/gstmpegaudioparse.c: "She's leaking me", said valgrind. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init): + "She's leaking me", said valgrind. + +2007-06-19 14:40:20 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.c: Fix "pad caps are not a real subset of its template caps" warning. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_caps_create): + Fix "pad caps are not a real subset of its template caps" warning. + +2007-06-19 14:15:50 +0000 Laurent Glayal + + ext/amrnb/amrnbdec.c: Don't leak the adapter, unref it in a new finalize method instead. + Original commit message from CVS: + Patch by: Laurent Glayal + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_class_init), + (gst_amrnbdec_finalize): + Don't leak the adapter, unref it in a new finalize method instead. + Fixes #448782. + +2007-06-19 10:43:26 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + * gst-plugins-ugly.doap: + Add 0.10.6 to the list of releases. + +=== release 0.10.6 === + +2007-06-19 10:31:04 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-siddec.xml: + Release 0.10.6 + Original commit message from CVS: + Release 0.10.6 + +2007-06-19 10:21:25 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2007-06-15 09:31:16 +0000 Jan Schmidt + + win32/vs6/: Convert line endings to CRLF and mark as binary files. + Original commit message from CVS: + * win32/vs6/gst_plugins_ugly.dsw: + * win32/vs6/libgstac3parse.dsp: + * win32/vs6/libgstasfdemux.dsp: + * win32/vs6/libgstdvdlpcmdec.dsp: + * win32/vs6/libgstdvdsub.dsp: + * win32/vs6/libgstiec958.dsp: + * win32/vs6/libgstlame.dsp: + * win32/vs6/libgstmad.dsp: + * win32/vs6/libgstmpegaudioparse.dsp: + * win32/vs6/libgstmpegstream.dsp: + * win32/vs6/libgstrealmedia.dsp: + * win32/vs6/libgstsynaesthesia.dsp: + Convert line endings to CRLF and mark as binary files. + +2007-06-13 14:29:39 +0000 Tim-Philipp Müller + + ext/dvdnav/dvdnavsrc.c: Don't forget to unlock when setting the device property, or we'll sooner or later deadlock. + Original commit message from CVS: + * ext/dvdnav/dvdnavsrc.c: (gst_dvd_nav_src_set_property): + Don't forget to unlock when setting the device property, or + we'll sooner or later deadlock. + +2007-06-12 21:46:10 +0000 Sébastien Moutte + + gst/dvdsub/gstdvdsubdec.c: Use gst_util_guint64_to_gdouble for conversion. + Original commit message from CVS: + * gst/dvdsub/gstdvdsubdec.c:(gst_dvd_sub_dec_parse_subpic): + Use gst_util_guint64_to_gdouble for conversion. + * win32/vs6/libgstasfdemux.dsp: + Add asfpacket.c to the build. + +2007-06-08 08:39:43 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.*: If the Xing header provides a total time, use it to calculate the correct ave... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), + (gst_mp3parse_emit_frame), (gst_mp3parse_handle_first_frame): + * gst/mpegaudioparse/gstmpegaudioparse.h: + If the Xing header provides a total time, use it to calculate the + correct average bitrate immediately, instead of sending updates as + we parse the stream. + +2007-06-05 21:47:29 +0000 by Mark Nauwelaerts + + gst/dvdsub/gstdvdsubdec.c: Use GstClockTime instead of guint for a time variable to prevent overflows on too large su... + Original commit message from CVS: + Patch by by: Mark Nauwelaerts + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_parse_subpic): + Use GstClockTime instead of guint for a time variable to prevent + overflows on too large subtitle durations. Fixes #444514. + +2007-05-31 22:33:26 +0000 Mark Nauwelaerts + + gst/dvdsub/gstdvdsubdec.c: Clear state when handling the serialized FLUSH_STOP event instead of the FLUSH_START event... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_sink_event): + Clear state when handling the serialized FLUSH_STOP event instead of + the FLUSH_START event, thereby making sure we don't free buffers the + chain function is still using. Fixes dvdsubdec crashing when flusing + or seeking (#442706). + +2007-05-23 11:16:09 +0000 Tim-Philipp Müller + + gst/mpegaudioparse/gstmpegaudioparse.c: Initialise variable to make fc4 build bot happy. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Initialise variable to make fc4 build bot happy. + +2007-05-21 15:11:45 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegdemux.c: Add sanity check so we don't abort for broken or non-MPEG streams, but instead error o... + Original commit message from CVS: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + Add sanity check so we don't abort for broken or non-MPEG streams, + but instead error out. Fixes crashes/aborts for when our typefinder + wrongly identifies quicktime files as mpeg (which should be fixed in + -base now too). (#440120). + +2007-05-18 09:35:17 +0000 Stefan Kost + + * ChangeLog: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbparse.c: + ext/amrnb/amrnbdec.c (gst_amrnbdec_debug, GST_CAT_DEFAULT, block_size, _do_init, gst_amrnbdec_base_init, gst_amrnbdec... + Original commit message from CVS: + * ext/amrnb/amrnbdec.c (gst_amrnbdec_debug, GST_CAT_DEFAULT, + block_size, _do_init, gst_amrnbdec_base_init, + gst_amrnbdec_class_init, gst_amrnbdec_init): + * ext/amrnb/amrnbenc.c (gst_amrnbenc_debug, GST_CAT_DEFAULT, _do_init, + gst_amrnbenc_base_init, gst_amrnbenc_class_init, gst_amrnbenc_init): + * ext/amrnb/amrnbparse.c (gst_amrnbparse_debug, GST_CAT_DEFAULT, + block_size, _do_init, gst_amrnbparse_base_init, + gst_amrnbparse_class_init, gst_amrnbparse_init): + First round of cleanups, that use GST_BOILERPLATE, GST_ELEMENT_DETAILS, + GST_DEBUG_FUNCPTR and add log-category. + +2007-05-18 08:42:25 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.*: Implement parsing of Xing headers from the first frame of the stream, and use... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header), (gst_mp3parse_reset), + (gst_mp3parse_emit_frame), (gst_mp3parse_handle_first_frame), + (gst_mp3parse_chain), (mp3parse_total_bytes), + (mp3parse_total_time): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Implement parsing of Xing headers from the first frame of the stream, + and use it to report duration correctly where possible. + +2007-05-16 19:15:13 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: After descrambling, push the packets out as individual packets instead of one big descramble... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_descramble_cook_audio): + After descrambling, push the packets out as individual packets + instead of one big descrambled buffer. Makes cook audio decoding + work with the 'realaudiodec' decoder from gst-plugins-bad. + +2007-05-16 19:07:45 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.*: Remember first timestamp encountered in stream and re-timestamp stream to start from zero (f... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_init), + (gst_rmdemux_sink_event), (gst_rmdemux_perform_seek), + (gst_rmdemux_reset), (gst_rmdemux_chain), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_packet): + * gst/realmedia/rmdemux.h: + Remember first timestamp encountered in stream and re-timestamp + stream to start from zero (fixes #397219); only send one newsegment + event, not two; when seeking, send newsegment events from the + streaming thread and not from the seeking thread. + +2007-05-16 12:48:43 +0000 Mark Nauwelaerts + + gst/mpegstream/: Reset last_flow values for the various streams after a flushing seek, otherwise we might aggregate w... + Original commit message from CVS: + Based on patch by: Mark Nauwelaerts + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_process_event), (gst_mpeg_streams_reset_last_flow): + * gst/mpegstream/gstmpegdemux.h: + Reset last_flow values for the various streams after a flushing + seek, otherwise we might aggregate wrong flow returns afterwards + that will make upstream pause silently. This should fix seeking + in DVDs and also fix the Thoggen cropping dialog (#438610). + +2007-05-07 13:51:43 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.*: Activate streams (ie. add the pads to the element) depending on whether we actually get d... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_reset), + (gst_asf_demux_chain_headers), + (gst_asf_demux_parse_data_object_start), (all_streams_prerolled), + (gst_asf_demux_have_mutually_exclusive_active_stream), + (gst_asf_demux_check_activate_streams), + (gst_asf_demux_find_stream_with_complete_payload), + (gst_asf_demux_push_complete_payloads), (gst_asf_demux_loop), + (gst_asf_demux_activate_ext_props_streams), + (gst_asf_demux_process_object): + * gst/asfdemux/gstasfdemux.h: + Activate streams (ie. add the pads to the element) depending on + whether we actually get data for those streams within the ASF + preroll value specified. Currently only done in pull-mode though + (this will fix problems with playbin hanging on mms streams once + we use this in push-mode as well). + +2007-05-04 11:04:16 +0000 Tim-Philipp Müller + + gst/asfdemux/: Make all timestamps start from zero in pull-mode too; some small clean-ups and FIXMEs here and there. + Original commit message from CVS: + * gst/asfdemux/asfpacket.c: (gst_asf_payload_queue_for_stream): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_reset), + (gst_asf_demux_init), (gst_asf_demux_push_complete_payloads), + (gst_asf_demux_process_file): + * gst/asfdemux/gstasfdemux.h: + Make all timestamps start from zero in pull-mode too; some small + clean-ups and FIXMEs here and there. + +2007-05-01 11:10:31 +0000 Tim-Philipp Müller + + gst/asfdemux/asfpacket.c: If packet size is specified within the packet and smaller than the actual packet size, don'... + Original commit message from CVS: + * gst/asfdemux/asfpacket.c: (gst_asf_demux_parse_payload), + (gst_asf_demux_parse_packet): + If packet size is specified within the packet and smaller than + the actual packet size, don't parse beyond the size specified in + the packet (this makes us parse some cases of packets with single + compressed payloads cleanly, see e.g stream from #431318). Also + add a sanity check when parsing compressed single payloads. + +2007-05-01 09:19:13 +0000 Tim-Philipp Müller + + gst/asfdemux/: Seeking improvements: honour the KEY_UNIT seek flag; after a seek, only send data from the keyframe ri... + Original commit message from CVS: + * gst/asfdemux/asfpacket.c: (gst_asf_payload_queue_for_stream): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_seek_index_lookup), + (gst_asf_demux_handle_seek_event), + (gst_asf_demux_push_complete_payloads): + Seeking improvements: honour the KEY_UNIT seek flag; after a seek, only + send data from the keyframe right before the new segment start to + make sure the decoder doesn't have to decode more than absolutely + necessary. + +2007-04-30 15:36:00 +0000 Tim-Philipp Müller + + gst/asfdemux/: Implement payload extension system/extended replicated data parsing, so we can extract payload duratio... + Original commit message from CVS: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/asfpacket.c: + (asf_payload_parse_replicated_data_extensions), + (gst_asf_demux_parse_payload): + * gst/asfdemux/asfpacket.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_free_stream), + (gst_asf_demux_push_complete_payloads), + (gst_asf_demux_process_ext_stream_props): + * gst/asfdemux/gstasfdemux.h: + Implement payload extension system/extended replicated data parsing, + so we can extract payload durations if they're specified. + +2007-04-30 11:41:22 +0000 Tim-Philipp Müller + + gst/asfdemux/: Refactor stream parse/activation a bit (stream activation heuristics are still the same though); some ... + Original commit message from CVS: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_free_stream), + (gst_asf_demux_reset), (gst_asf_demux_parse_data_object_start), + (gst_asf_demux_loop), (gst_asf_demux_setup_pad), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_activate_stream), + (gst_asf_demux_parse_stream_object), + (gst_asf_demux_process_ext_stream_props), + (gst_asf_demux_process_queued_extended_stream_objects), + (gst_asf_demux_activate_ext_props_streams), + (gst_asf_demux_process_object): + * gst/asfdemux/gstasfdemux.h: + Refactor stream parse/activation a bit (stream activation heuristics + are still the same though); some more clean-ups. + +2007-04-28 12:23:16 +0000 Tim-Philipp Müller + + win32/common/.cvsignore: Ignore generated config.h file to make build bot happy. + Original commit message from CVS: + * win32/common/.cvsignore: + Ignore generated config.h file to make build bot happy. + +2007-04-28 10:49:17 +0000 Tim-Philipp Müller + + gst/asfdemux/: Init debug category before using it. + Original commit message from CVS: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init): + * gst/asfdemux/gstasfdemux.h: + Init debug category before using it. + +2007-04-27 18:39:21 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Fix silly bug when we can't pull as much data as we want; don't forget to announce pendin... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_pull_data), + (gst_asf_demux_push_complete_payloads), (gst_asf_demux_loop): + Fix silly bug when we can't pull as much data as we want; don't + forget to announce pending tags in the new packet parsing code. + +2007-04-25 17:23:33 +0000 Tim-Philipp Müller + + Generate a win32 config.h into win32/common and add to MANIFEST so it gets disted (#393890). Looks like win32/common/... + Original commit message from CVS: + * configure.ac: + * win32/MANIFEST: + Generate a win32 config.h into win32/common and add to MANIFEST so + it gets disted (#393890). Looks like win32/common/config.h.in needs + some work though. + +2007-04-22 22:41:20 +0000 Tim-Philipp Müller + + ext/amrnb/amrnbparse.c: Fix pull mode operation some more: send newsegment event before sending data; handle EOS and ... + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), + (gst_amrnbparse_class_init), (gst_amrnbparse_init), + (gst_amrnbparse_pull_header), (gst_amrnbparse_loop): + Fix pull mode operation some more: send newsegment event before + sending data; handle EOS and fatal flow returns a bit better; don't + leak buffers in some cases. Misc. minor cleanups. Fixes #431707. + +2007-04-20 20:57:56 +0000 Tim-Philipp Müller + + gst/asfdemux/: New packet parsing code: should put halfway decent timestamps on buffers, and might even set the appro... + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + * gst/asfdemux/asfpacket.c: (asf_packet_read_varlen_int), + (asf_packet_create_payload_buffer), + (asf_payload_find_previous_fragment), + (gst_asf_payload_queue_for_stream), (gst_asf_demux_parse_payload), + (gst_asf_demux_parse_packet): + * gst/asfdemux/asfpacket.h: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_reset_stream_state_after_discont), + (gst_asf_demux_push_complete_payloads), (gst_asf_demux_loop), + (gst_asf_demux_setup_pad), (gst_asf_demux_descramble_buffer), + (gst_asf_demux_process_chunk): + * gst/asfdemux/gstasfdemux.h: + New packet parsing code: should put halfway decent timestamps on + buffers, and might even set the appropriate keyframe/discont buffer + flags from time to time (and even if it doesn't, I'm at least able + to debug this code); only used in pull-mode so far. Still needs + some more work, like payload extensions parsing and proper flow + aggregation, and stream activation based on preroll. Stay tuned. + +2007-04-20 17:32:00 +0000 Tim-Philipp Müller + + gst/asfdemux/: Some clean-ups and small fixes: rename asf_stream_context structure to + Original commit message from CVS: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_free_stream), + (gst_asf_demux_seek_index_lookup), + (gst_asf_demux_handle_seek_event), (gst_asf_demux_get_stream), + (gst_asf_demux_setup_pad), (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_process_file), (gst_asf_demux_descramble_segment), + (gst_asf_demux_push_buffer), (gst_asf_demux_process_chunk), + (gst_asf_demux_process_segment), (gst_asf_demux_handle_data): + * gst/asfdemux/gstasfdemux.h: + Some clean-ups and small fixes: rename asf_stream_context structure to + AsfStream; inline some three-line utility functions that are only used + once anyway and get rid of their associated helper structs; make debug + category global so that it is used by the debug statements in the other + file as well; simplify gst_asf_demux_get_stream(); fix accidental + implicit initialisation of stream->last_buffer_timestamp to 0, which + would lead to missing timestamps on the first buffer; put fourcc format + into video caps to make certain proprietary wmv decoders happy (for the + case of WMVA in particular); play_time is offset by preroll as well, so + fix overreporting of duration for some files. + +2007-04-17 10:21:50 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Printf format fixes. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_seek_event), + (gst_asf_demux_pull_indices): + Printf format fixes. + +2007-04-16 16:30:50 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegparse.c: Post an error message if EOS wasn't handled by anything downstream. + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_send_event): + Post an error message if EOS wasn't handled by anything downstream. + This should fix playbin freezing/hanging with small VobSub subtitle + files (background: not-linked flow returns from downstream are + ignored for a while at the beginning, so if the file is small + upstream will never get a not-linked flow return even if nothing + is connected downstream). (#429960). + +2007-04-16 15:15:07 +0000 Michael Smith + + ext/amrnb/amrnbparse.c: Rewrite terminally broken sinkpad activation code. and push mode activation doesn't leave the... + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_sink_activate), + (gst_amrnbparse_sink_activate_pull): + Rewrite terminally broken sinkpad activation code. + Now actually supports pull-mode activation (didn't before), and push + mode activation doesn't leave the sinkpad flushing. + +2007-04-12 13:38:03 +0000 Tim-Philipp Müller + + gst/asfdemux/: Make asfdemux work in pull mode where possible. If there's an index at the end of the file, read it an... + Original commit message from CVS: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_free_stream), + (gst_asf_demux_reset), (gst_asf_demux_init), + (gst_asf_demux_activate), (gst_asf_demux_activate_push), + (gst_asf_demux_activate_pull), (gst_asf_demux_sink_event), + (gst_asf_demux_seek_index_lookup), + (gst_asf_demux_reset_stream_state_after_discont), + (gst_asf_demux_handle_seek_event), + (gst_asf_demux_handle_src_event), (gst_asf_demux_chain_headers), + (gst_asf_demux_chain), (gst_asf_demux_pull_data), + (gst_asf_demux_pull_indices), + (gst_asf_demux_parse_data_object_start), + (gst_asf_demux_pull_headers), (gst_asf_demux_loop), + (gst_asf_demux_setup_pad), (gst_asf_demux_process_file), + (gst_asf_demux_process_simple_index), + (gst_asf_demux_process_object), + (gst_asf_demux_send_event_unlocked), (gst_asf_demux_push_buffer), + (gst_asf_demux_handle_data), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Make asfdemux work in pull mode where possible. If there's an index + at the end of the file, read it and use it for seeking purposes. + +2007-04-12 10:19:18 +0000 Wim Taymans + + gst/synaesthesia/gstsynaesthesia.c: Some timestamp fixes. + Original commit message from CVS: + * gst/synaesthesia/gstsynaesthesia.c: (gst_synaesthesia_init), + (gst_synaesthesia_sink_setcaps), (gst_synaesthesia_src_setcaps), + (gst_synaesthesia_chain), (gst_synaesthesia_change_state): + Some timestamp fixes. + * gst/synaesthesia/synaescope.c: (synaescope_coreGo): + Fix for 64-bit machines. + +2007-04-12 10:10:22 +0000 René Stadler + + gst/realmedia/rmdemux.*: Make rmdemux handle any number of logical streams. Fixes #428698. + Original commit message from CVS: + Patch by: René Stadler + * gst/realmedia/rmdemux.c: (find_seek_offset_bytes), + (find_seek_offset_time), (gst_rmdemux_reset), + (gst_rmdemux_get_stream_by_id), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream), (gst_rmdemux_combine_flows): + * gst/realmedia/rmdemux.h: + Make rmdemux handle any number of logical streams. Fixes #428698. + +2007-04-05 13:48:52 +0000 Thomas Vander Stichele + + * po/nl.po: + update dutch + Original commit message from CVS: + update dutch + +2007-04-05 13:48:12 +0000 Thomas Vander Stichele + + po/: Added Danish translation. + Original commit message from CVS: + submitted by: Mogens Jaeger + * po/LINGUAS: + * po/da.po: + Added Danish translation. + +2007-03-28 16:01:06 +0000 Zaheer Abbas Merali + + po/.cvsignore: Add pot. + Original commit message from CVS: + * po/.cvsignore: + Add pot. + +2007-03-27 12:02:49 +0000 Julien Moutte + + ext/mad/gstmad.c: Generate a perfect stream and try to adapt to incoming timestamps lack of precision up to half a fr... + Original commit message from CVS: + 2007-03-27 Julien MOUTTE + * ext/mad/gstmad.c: (gst_mad_chain): Generate a perfect + stream and try to adapt to incoming timestamps lack of + precision up to half a frame. This allows generating + a perfect stream even with muxed formats like FLV where + the timestamps are stored in milliseconds. + +2007-03-22 21:44:45 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Remove unused zlib.h include. Fixes #421594. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: + Remove unused zlib.h include. Fixes #421594. + +2007-03-21 12:53:57 +0000 Jan Schmidt + + ext/lame/gstlame.c: Disable the bitrate checking when the user has requested + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_setup): + Disable the bitrate checking when the user has requested + Free Format mode, as all bitrates less than the maximum + are valid then. + +2007-03-14 15:21:41 +0000 Thomas Vander Stichele + + po/: Update translations. + Original commit message from CVS: + * po/hu.po: + * po/it.po: + * po/sv.po: + Update translations. + +2007-03-12 17:26:13 +0000 Jan Schmidt + + ext/mad/gstmad.c: When handling seeks, don't convert -1 start or stop values to a bogus byte position - pass them ups... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_convert_sink), (gst_mad_convert_src): + When handling seeks, don't convert -1 start or stop values to a bogus + byte position - pass them upstream as -1. + +2007-03-12 10:47:01 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.*: Implement seeking via average bitrate, and position+duration querying in mp3p... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header), (gst_mp3parse_reset), + (gst_mp3parse_init), (gst_mp3parse_sink_event), + (gst_mp3parse_emit_frame), (gst_mp3parse_chain), + (gst_mp3parse_change_state), (mp3parse_time_to_bytepos), + (mp3parse_bytepos_to_time), (mp3parse_total_bytes), + (mp3parse_total_time), (mp3parse_handle_seek), + (mp3parse_src_event), (mp3parse_src_query), + (mp3parse_get_query_types), (plugin_init): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Implement seeking via average bitrate, and position+duration + querying in mp3parse. Later, it will support frame-accurate seeking by + building a seek table as it parses. + Add 'parsed=false' to the sink pad caps, and 'parsed=true' to the src + pad caps. Bump the priority to PRIMARY+1 so that it is autoplugged + before any extant MP3 decoder plugin. This allows us to remove framing + support from the decoders, if we want, and will provide them with + accurate seeking automatically once it is finished. + Fix the handling of MPEG-1 Layer 1 files. + Partially fix timestamping of packets arriving from a demuxer by + queueing the incoming timestamp until the next packet starts, rather + than applying it immediately to the next pushed buffer. + +2007-03-10 15:56:26 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Printf format fix. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_header_ext): + Printf format fix. + +2007-03-04 17:13:19 +0000 Jan Schmidt + + ext/cdio/gstcdiocddasrc.c: Make sure we always destroy our libcdio handle. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open), + (gst_cdio_cdda_src_finalize): + Make sure we always destroy our libcdio handle. + +2007-03-02 16:08:17 +0000 Wim Taymans + + ext/cdio/gstcdiocddasrc.c: Small code cleanups. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_probe_devices), + (gst_cdio_cdda_src_read_sector), (gst_cdio_cdda_src_open), + (gst_cdio_cdda_src_finalize): + Small code cleanups. + Don't use pad_alloc as the base class cannot deal with the error codes. + +2007-03-02 13:01:48 +0000 Zaheer Abbas Merali + + ext/mpeg2dec/gstmpeg2dec.c: Never post a (fatal) error message on the bus on decoding errors. We should only do this ... + Original commit message from CVS: + Patch by: Zaheer Abbas Merali + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_chain): + Never post a (fatal) error message on the bus on decoding errors. We + should only do this if we can't recover, but mpeg2dec can always + recover. This is needed for DVB streams, for example, where there + may be temporary glitches in the stream. Instead of an error + message, post a warning message on the bus for every N decoding + errors. Fixes #370020. + +2007-02-28 19:30:35 +0000 Thomas Vander Stichele + + configure.ac: Convert to new AG_GST style. + Original commit message from CVS: + * configure.ac: + Convert to new AG_GST style. + +2007-02-28 18:41:38 +0000 Jan Schmidt + + ext/lame/gstlame.c: Display sensible defaults and limits for the vbr-min/max/mean properties. Fix the 'hard-limit' VB... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init), + (gst_lame_setup): + Display sensible defaults and limits for the + vbr-min/max/mean properties. Fix the 'hard-limit' VBR min + property - it's supposed to be a boolean 0/1 value. + +2007-02-28 16:01:08 +0000 Jan Schmidt + + ext/lame/gstlame.c: Initialise the variables so gcc doesn't complain about possibly uninitialised uses, even though t... + Original commit message from CVS: + * ext/lame/gstlame.c: + Initialise the variables so gcc doesn't complain about possibly + uninitialised uses, even though they can't actually happen. + +2007-02-28 15:52:23 +0000 Wim Taymans + + gst/dvdlpcmdec/gstdvdlpcmdec.*: Implement all sample rates. + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcm_reset), + (update_timestamps), (parse_header), (gst_dvdlpcmdec_chain_dvd), + (gst_dvdlpcmdec_chain_raw), (dvdlpcmdec_sink_event): + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + Implement all sample rates. + Implement sample permutation a little smarter avoiding a memcpy. + Fix timestamps, use segments, fix seeking. + +2007-02-28 15:49:35 +0000 Wim Taymans + + Document siddec. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * docs/plugins/inspect/plugin-siddec.xml: + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + Document siddec. + +2007-02-21 16:02:33 +0000 Thomas Vander Stichele + + ext/lame/gstlame.c: Fix up bitrate checking macro. Make it give us a + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_setcaps), + (gst_lame_set_property), (gst_lame_setup): + Fix up bitrate checking macro. Make it give us a + GST_ELEMENT_WARNING message so the application has a chance of + reporting this to the user. Move the checking to _setup, so we + are sure it runs in the READY state, when we hope to have a pipeline + and a bus that is not flushing. + This fixes e.g. using 96 kbit/sec as a bitrate. + +2007-02-15 19:55:55 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.*: Parse advanced mutual exclusion object and only add pads for 'hidden' streams (those in a... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_file), + (gst_asf_demux_process_advanced_mutual_exclusion), + (gst_asf_demux_process_queued_extended_stream_objects), + (gst_asf_demux_process_object), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Parse advanced mutual exclusion object and only add pads for + 'hidden' streams (those in an extended stream header) that are + mutually exclusive with an already existing 'main stream' if + the broadcasting flag is not set. If the broadcasting flag is set, + assume that data for this stream isn't sent. (This should ideally be + solved better by making playbin more robust against this and/or by + making mmssrc send some information downstream about which streams + will be streamed). Fixes #353116. + +2007-02-13 12:00:59 +0000 Jan Schmidt + + gst/synaesthesia/: Move all the mutable engine state into a structure so that multiple element instances can run with... + Original commit message from CVS: + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init), (gst_synaesthesia_init), + (gst_synaesthesia_finalize), (gst_synaesthesia_chain): + * gst/synaesthesia/synaescope.c: (synaescope_coreGo), + (synaescope32), (synaescope_set_data), (synaesthesia_update), + (synaesthesia_init), (synaesthesia_new), (synaesthesia_close): + * gst/synaesthesia/synaescope.h: + Move all the mutable engine state into a structure so that + multiple element instances can run without interfering. + +2007-02-13 09:15:41 +0000 Stefan Kost + + Add crossreferences to glib/gobject/gstream docs. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + Add crossreferences to glib/gobject/gstream docs. + +2007-02-12 12:46:20 +0000 Stefan Kost + + gst/synaesthesia/: More source cleanups and add FIXME comments. + Original commit message from CVS: + * gst/synaesthesia/gstsynaesthesia.c: (gst_synaesthesia_init), + (gst_synaesthesia_sink_setcaps), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_src_setcaps), (gst_synaesthesia_chain), + (plugin_init): + * gst/synaesthesia/synaescope.c: (synaescope_coreGo), + (synaescope8): + More source cleanups and add FIXME comments. + +2007-02-11 13:42:45 +0000 Sébastien Moutte + + gst/realmedia/rmdemux.c: Use gst_guint64_to_gdouble for conversions. + Original commit message from CVS: + * gst/realmedia/rmdemux.c:(gst_rmdemux_parse_indx_data): + Use gst_guint64_to_gdouble for conversions. + * gst/synaesthesia/synaescope.c: + Define M_PI and do not include and + for G_OS_WIN32 + * win32/vs6/libgstrealmedia.dsp: + * win32/vs6/synaesthesia.dsp: + Update projects files. + * win32/common/config.h.in: + Add config.h.in for autogen of config.h + +2007-02-11 10:51:42 +0000 Stefan Kost + + configure.ac: Add --enable-experimental support. Activate synaesthesia when building with --enable-experimental. Fix ... + Original commit message from CVS: + * configure.ac: + Add --enable-experimental support. Activate synaesthesia when building + with --enable-experimental. Fix --enable external configure switch + description. + +2007-02-09 16:24:45 +0000 Tim-Philipp Müller + + ext/lame/gstlame.*: On receiving EOS, we try to push a last buffer with the remaining samples. Don't do that if we go... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_event), (gst_lame_chain), + (gst_lame_change_state): + * ext/lame/gstlame.h: + On receiving EOS, we try to push a last buffer with the remaining + samples. Don't do that if we got an unclean flow return on the last + gst_pad_push(), downstream might not handle this very gracefully + (see #403168). + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Pass flow returns upstream (helps #403168). + +2007-02-09 08:03:09 +0000 Stefan Kost + + gst/synaesthesia/gstsynaesthesia.c: check result of gst_pad_push() in _chain. + Original commit message from CVS: + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init), (gst_synaesthesia_init), + (gst_synaesthesia_sink_setcaps), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_chain), (plugin_init): + check result of gst_pad_push() in _chain. + +2007-02-09 07:48:50 +0000 Stefan Kost + + gst/synaesthesia/: Added docs (not yet added to gst-plugins-ugl/docs/plugins as plugin is not built by default). Fixe... + Original commit message from CVS: + * gst/synaesthesia/Makefile.am: + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init), (gst_synaesthesia_init), + (gst_synaesthesia_sink_setcaps), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_chain), (plugin_init): + * gst/synaesthesia/synaescope.c: + * gst/synaesthesia/synaescope.h: + Added docs (not yet added to gst-plugins-ugl/docs/plugins as plugin is not + built by default). Fixed Makefile.am. Fixed license headers (its GPL as it + is derived from GPL code). Fixed GST_SYNAESTHESIA_CLASS macro. Added + GST_DEBUG_FUNCPTR. Reflowed _setcaps. Updated pad setup in _init. Fix + possible leak in _chain. (#356882) + +2007-02-08 21:07:27 +0000 Tim-Philipp Müller + + gst/asfdemux/: Refactor and clean up header parsing and chain function a bit; get rid of some cruft; make header pars... + Original commit message from CVS: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), + (gst_asf_demux_sink_event), (gst_asf_demux_handle_seek_event), + (gst_asf_demux_identify_guid), (asf_demux_peek_object), + (gst_asf_demux_chain_headers), (gst_asf_demux_chain), + (gst_asf_demux_setup_pad), (gst_asf_demux_process_stream), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_get_object_header), (gst_asf_demux_process_header), + (gst_asf_demux_process_file), (gst_asf_demux_process_comment), + (gst_asf_demux_process_bitrate_props_object), + (gst_asf_demux_process_header_ext), + (gst_asf_demux_process_language_list), + (gst_asf_demux_process_ext_stream_props), + (gst_asf_demux_process_queued_extended_stream_objects), + (gst_asf_demux_process_object), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Refactor and clean up header parsing and chain function a bit; get + rid of some cruft; make header parsing a tad more robust, fixing + #403188. + +2007-02-01 11:12:25 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Post an error if we receive an EOS event while still waiting for the + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_sink_event): + Post an error if we receive an EOS event while still waiting for the + ASF header object to come through. + +2007-01-24 17:36:36 +0000 Xavier B + + gst/asfdemux/gstasfdemux.c: Guard places where we assume that a certain amount of data is available better against le... + Original commit message from CVS: + Patch by: Xavier B. + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_guid), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_process_data), + (gst_asf_demux_process_language_list), + (gst_asf_demux_process_ext_stream_props), + (gst_asf_demux_process_segment), (gst_asf_demux_handle_data): + Guard places where we assume that a certain amount of data is + available better against less data being available (should fix + infamous assertion crasher bug #336370). Also fixes a small + memory leak. + +2007-01-11 12:49:23 +0000 Tim-Philipp Müller + + gst/realmedia/: Add demuxer for RealAudio files (#349779). + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/rademux.c: + * gst/realmedia/rademux.h: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_descramble_dnet_audio), (gst_rmdemux_plugin_init): + * gst/realmedia/rmutils.c: (gst_rm_utils_descramble_dnet_buffer): + * gst/realmedia/rmutils.h: + Add demuxer for RealAudio files (#349779). + +2007-01-07 13:37:19 +0000 Sébastien Moutte + + Makefile.am: Add win32/MANIFEST to EXTRA_DIST so win32 files will be include in the next release. + Original commit message from CVS: + * Makefile.am: + Add win32/MANIFEST to EXTRA_DIST so win32 files will + be include in the next release. + * win32/MANIFEST: + Remove win32/common/config.h is which is not autogenerated yet. + +2006-12-30 20:01:35 +0000 Thomas Vander Stichele + + ext/lame/gstlame.c: warn when outgoing sample rate is different from incoming + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_setcaps), (gst_lame_chain): + warn when outgoing sample rate is different from incoming + +2006-12-29 14:51:19 +0000 Jan Schmidt + + gst/mpegaudioparse/gstmpegaudioparse.c: All sample-rates < 32khz come from the LSF extensions, which only use 1 granu... + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + All sample-rates < 32khz come from the LSF extensions, which only + use 1 granule. Fixes parsing of 22.05khz, 24khz and 16khz files. + Use gst_util_uint64_scale because we can. + +2006-12-22 13:06:24 +0000 Stefan Kost + + tests/check/elements/amrnbenc.c: and fix compilation of this test + Original commit message from CVS: + * tests/check/elements/amrnbenc.c: (setup_amrnbenc), + (cleanup_amrnbenc): + and fix compilation of this test + +2006-12-22 12:41:52 +0000 Stefan Kost + + tests/check/elements/: re-apply as it was -bad and not -ugly that is frozen, doh + Original commit message from CVS: + * tests/check/elements/amrnbenc.c: (setup_amrnbenc), + (cleanup_amrnbenc): + * tests/check/elements/mpeg2dec.c: (setup_mpeg2dec), + (cleanup_mpeg2dec): + re-apply as it was -bad and not -ugly that is frozen, doh + +2006-12-21 12:50:00 +0000 Stefan Kost + + tests/check/elements/: revert my freeze breakage + Original commit message from CVS: + * tests/check/elements/amrnbenc.c: (setup_amrnbenc), + (cleanup_amrnbenc): + * tests/check/elements/mpeg2dec.c: (setup_mpeg2dec), + (cleanup_mpeg2dec): + revert my freeze breakage + +2006-12-21 08:16:41 +0000 Stefan Kost + + gst/asfdemux/gstasfdemux.c: add a comment about a future change + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_get_gst_tag_from_tag_name), + (gst_asf_demux_process_ext_content_desc): + add a comment about a future change + * tests/check/elements/amrnbenc.c: (setup_amrnbenc), + (cleanup_amrnbenc): + * tests/check/elements/mpeg2dec.c: (setup_mpeg2dec), + (cleanup_mpeg2dec): + consistent pad (de)activation + +2006-12-15 18:26:41 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Update query_types function too. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_src_query_types): + Update query_types function too. + +2006-12-15 18:25:17 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Implement SEEKING query, make query function thread-safe. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_src_query), + (gst_rmdemux_src_query_types): + Implement SEEKING query, make query function thread-safe. + +2006-12-15 17:59:47 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Use alignment-safe macros here too (subbuffers ...); guard against hypothetical memory acces... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_descramble_dnet_audio): + Use alignment-safe macros here too (subbuffers ...); guard against + hypothetical memory access beyond our given buffer in the case + where the buffer size is not a multiple of 2. + +2006-12-15 17:54:48 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.*: Don't crash in the seek event handling code when playtime is 0, as may be the case with l... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_seek_event), + (gst_asf_demux_process_data), (gst_asf_demux_process_file), + (gst_asf_demux_handle_src_query), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Don't crash in the seek event handling code when playtime is 0, + as may be the case with live streams (#386218). Implement SEEKING + query so applications can query seekability without second-guessing + based on whether we have a duration or not. + +2006-12-15 11:12:21 +0000 Thomas Vander Stichele + + add doap file + Original commit message from CVS: + * Makefile.am: + * gst-plugins-ugly.doap: + * gst-plugins-ugly.spec.in: + add doap file + +2006-12-14 12:05:49 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegparse.c: Use our alignment-safe macros here too, since we can't assume that + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Use our alignment-safe macros here too, since we can't assume that + GST_BUFFER_DATA is aligned (these are subbuffers we're dealing with + here). + +2006-12-14 11:49:39 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Also, don't read the index for a stream a second time when operating in pull-mode and reachi... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_indx_data): + Also, don't read the index for a stream a second time when + operating in pull-mode and reaching the end of the file. + +2006-12-14 11:25:00 +0000 Roland Kay + + gst/realmedia/rmdemux.c: Don't leak stream index (#385292). + Original commit message from CVS: + Patch by: Roland Kay + * gst/realmedia/rmdemux.c: (gst_rmdemux_reset): + Don't leak stream index (#385292). + +2006-12-14 10:15:24 +0000 Roland Kay + + ext/lame/gstlame.*: Fix leak (by calling lame_init_params() before lame_close()); handle + Original commit message from CVS: + Based on patch by: Roland Kay + * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain), + (gst_lame_setup): + * ext/lame/gstlame.h: + Fix leak (by calling lame_init_params() before lame_close()); handle + NULL return from lame_init() more gracefully. Fixes #385311. + +2006-12-14 09:57:12 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + +=== release 0.10.5 === + +2006-12-13 21:04:12 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-siddec.xml: + Release 0.10.5 + Original commit message from CVS: + Release 0.10.5 + +2006-12-12 21:09:16 +0000 David Schleef + + gst/mpegstream/gstmpegparse.c: Use the GST_READ macro I meant to in the previous checkin. see #385192. You can have... + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: Use the GST_READ macro I meant + to in the previous checkin. see #385192. You can have your + cheese back now. + +2006-12-12 20:56:58 +0000 David Schleef + + gst/mpegstream/gstmpegparse.c: Fix unaligned load that loads from the dereferenced integer, not the pointer itself. ... + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: Fix unaligned load that loads + from the dereferenced integer, not the pointer itself. Fixes + #385192. + I'm takin ur cheese! + +2006-12-12 10:29:32 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery: fix bug number + Original commit message from CVS: + ChangeLog surgery: fix bug number + +2006-12-12 10:24:40 +0000 Roland Kay + + gst/realmedia/rmdemux.c: For version 4 streams, read the extra codec data size from the header instead of assuming it... + Original commit message from CVS: + Based on patch by: Roland Kay + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr): + For version 4 streams, read the extra codec data size from the + header instead of assuming it is always 16 (also read it from the + right position) (#384989). For version 4 and 5 streams, check that + the specified extra codec data size doesn't make us read beyond the + chunk boundary (#384989). + +2006-12-10 21:27:03 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2006-11-21 12:33:25 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Cosmetic changes: fix misleading debug statement, update comment, add cast. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_sized_buf): + Cosmetic changes: fix misleading debug statement, update + comment, add cast. + +2006-11-21 12:15:58 +0000 Sebastian Dröge + + ext/mpeg2dec/gstmpeg2dec.*: Align buffers to a 16 byte boundary so the altivec optimisations don't crash. Fixes #327350. + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_reset), (gst_mpeg2dec_alloc_sized_buf), + (gst_mpeg2dec_alloc_buffer), (init_dummybuf), (handle_slice): + * ext/mpeg2dec/gstmpeg2dec.h: + Align buffers to a 16 byte boundary so the altivec optimisations + don't crash. Fixes #327350. + +2006-11-20 15:52:42 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: The availability of extra codec data isn't something that warrants debug messages at WARN... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_audio_stream): + The availability of extra codec data isn't something that + warrants debug messages at WARNING level (see #376958). + +2006-11-19 13:08:30 +0000 Tim-Philipp Müller + + gst/mpegstream/: Fix flow value combination; this fixes playbin/totem locking up if a VobSub file is specified as sub... + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), + (gst_dvd_demux_class_init), (gst_dvd_demux_combine_flows), + (gst_dvd_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_init_stream), (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_combine_flows), + (gst_mpeg_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_chain): + Fix flow value combination; this fixes playbin/totem locking up if + a VobSub file is specified as subtitle file (#334322). Flow value + combination should only happen once we are fairly sure we've got all + pads that are available for now. Since there isn't a well-specified + time when this is the case in MPEG, we'll just assume this is the + case once there has been a certain number of packets for each + stream we've found so far. + +2006-11-15 13:57:21 +0000 Jan Arne Petersen + + ext/mpeg2dec/gstmpeg2dec.c: Simplify the framerate code and support more framerates. Fixes #361584. + Original commit message from CVS: + Patch by: Jan Arne Petersen + * ext/mpeg2dec/gstmpeg2dec.c: (handle_sequence), (handle_slice): + Simplify the framerate code and support more framerates. Fixes #361584. + +2006-11-15 11:41:39 +0000 Sebastian Dröge + + ext/mpeg2dec/gstmpeg2dec.c: Fix minor memleak when creating pads from static pad templates (#369627). + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init): + Fix minor memleak when creating pads from static pad templates (#369627). + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/mpeg2dec.c: (setup_mpeg2dec), + (cleanup_mpeg2dec), (GST_START_TEST), (mpeg2dec_suite), (main): + Add unit tests for mpeg2dec (#369627). + +2006-11-14 10:31:11 +0000 Wim Taymans + + * ChangeLog: + give credit + Original commit message from CVS: + give credit + +2006-11-14 10:29:37 +0000 Wim Taymans + + ext/lame/gstlame.*: Make lame timestamp flushed eos buffer by some additional timestamp accounting. Fixes #374760. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_event), (gst_lame_chain), + (gst_lame_change_state): + * ext/lame/gstlame.h: + Make lame timestamp flushed eos buffer by some additional timestamp + accounting. Fixes #374760. + +2006-11-13 17:01:15 +0000 Michael Smith + + gst/mpegaudioparse/gstmpegaudioparse.*: Make timestamp handling in mp3parse saner; now works for at least simple cases. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header), (gst_mp3parse_reset), + (gst_mp3parse_init), (gst_mp3parse_dispose), + (gst_mp3parse_sink_event), (gst_mp3parse_chain), (head_check), + (gst_mp3parse_change_state): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Make timestamp handling in mp3parse saner; now works for at least + simple cases. + +2006-11-13 16:23:22 +0000 Michael Smith + + gst/mpegaudioparse/: Bring mp3parse into the 21st century. + Original commit message from CVS: + * gst/mpegaudioparse/Makefile.am: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header), (gst_mp3parse_class_init), + (gst_mp3parse_reset), (gst_mp3parse_init), (gst_mp3parse_dispose), + (gst_mp3parse_sink_event), (gst_mp3parse_chain), (head_check), + (gst_mp3parse_change_state), (plugin_init): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Bring mp3parse into the 21st century. + Use its own debug category, use gstadapter, format nicely to 80 + columns, and fix incorrect handling of 32 kHz and less files. + +2006-11-03 09:52:12 +0000 Sebastian Droege + + ext/mpeg2dec/gstmpeg2dec.*: libmpeg2 requires its output buffers to start at a 16byte aligned address or the altivec ... + Original commit message from CVS: + Patch by: Sebastian Droege + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_finalize), + (gst_mpeg2dec_alloc_buffer), (init_dummybuf), (handle_slice): + * ext/mpeg2dec/gstmpeg2dec.h: + libmpeg2 requires its output buffers to start at a 16byte aligned + address or the altivec optimizations will explode. + +2006-11-02 14:43:11 +0000 Tim-Philipp Müller + + ext/cdio/: Move CD-TEXT utility function into common file so it can also be used by a future cdioparanoiasrc. + Original commit message from CVS: + * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Move CD-TEXT utility function into common file so it can also be + used by a future cdioparanoiasrc. + +2006-10-19 10:17:14 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Use dsi_pack.dsi_gi.vobu_ea correctly, add some more debugging information (fixes #340433). + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_read): + Use dsi_pack.dsi_gi.vobu_ea correctly, add some more debugging + information (fixes #340433). + +2006-10-16 18:07:23 +0000 Josep Torra Valles + + gst/: Misc. fixes for problems discovered by Forte (different return types in function declaration and definition, po... + Original commit message from CVS: + Patch by: Josep Torra Valles + * gst/iec958/ac3_padder.c: (ac3p_init): + * gst/mpegstream/gstmpegparse.c: + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse__rmf), + (gst_rmdemux_parse_prop), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_parse_indx), (gst_rmdemux_parse_indx_data), + (gst_rmdemux_parse_data), (gst_rmdemux_parse_cont), + (gst_rmdemux_parse_packet): + Misc. fixes for problems discovered by Forte (different return types + in function declaration and definition, pointer arithmetics with + void pointers). Fixes #362639. + +2006-10-13 19:11:26 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Don't announce audio or subtitle streams that aren't really present, it makes dvddemux crea... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_goto_title): + Don't announce audio or subtitle streams that aren't really present, + it makes dvddemux create pads that will never carry any data, which + is not good. + +2006-10-13 14:45:11 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: Round up not allowed bitrates to the next higher allowed one (Closes: #361140). + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_set_property): + Round up not allowed bitrates to the next higher allowed one + (Closes: #361140). + +2006-10-13 14:19:24 +0000 Tim-Philipp Müller + + Add docs for lame and lame to docs. Specify allowed bitrates in the properties description (#361140). Canonicalise ob... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/gst-plugins-ugly-plugins-sections.txt: + * ext/lame/gstlame.c: (gst_lame_class_init): + * ext/lame/gstlame.h: + Add docs for lame and lame to docs. Specify allowed bitrates + in the properties description (#361140). Canonicalise object + property names (ie. use hyphen instead of underscore). + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-siddec.xml: + Update version to CVS. + +2006-10-13 10:00:27 +0000 Tim-Philipp Müller + + Add i18n magic to lame plugin. Throw decent error message when we fail to setup the encoder (#361140, 361151); misc. ... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_setcaps), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_chain), + (plugin_init): + * po/POTFILES.in: + Add i18n magic to lame plugin. Throw decent error message when we + fail to setup the encoder (#361140, 361151); misc. minor clean-ups. + +2006-10-10 17:02:05 +0000 Wim Taymans + + gst/realmedia/rdtdepay.c: Change caps to x-rdt, because it's not x-rtp. + Original commit message from CVS: + * gst/realmedia/rdtdepay.c: (gst_rdt_depay_base_init), + (gst_rdt_depay_init), (gst_rdt_depay_setcaps), + (gst_rdt_depay_chain), (gst_rdt_depay_change_state): + Change caps to x-rdt, because it's not x-rtp. + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_parse_packet), + (gst_rmdemux_plugin_init): + Activate pad before adding to the element. + Return the combined stream return values after pad_alloc. + +2006-10-10 16:58:32 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.*: Add some debugging to timestamp handling. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (handle_slice): + * ext/mpeg2dec/gstmpeg2dec.h: + Add some debugging to timestamp handling. + Make sure we don't convert invalid timestamps. + +2006-10-09 12:09:14 +0000 Tim-Philipp Müller + + gst/: Active pads before adding them to the running element. Don't assert on non-BYTE format newsegment events in asf... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_sink_event), + (gst_asf_demux_setup_pad), (gst_asf_demux_process_segment): + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), + (gst_mpeg_demux_get_private_stream): + Active pads before adding them to the running element. Don't assert + on non-BYTE format newsegment events in asfdemux. + +2006-10-05 17:07:52 +0000 Tim-Philipp Müller + + Printf format fixes. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_goto_title), + (gst_dvd_read_src_handle_seek_event): + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_chain): + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_parse_data): + * gst/realmedia/rmdemux.c: (gst_rmdemux_loop), + (gst_rmdemux_parse_packet): + Printf format fixes. + +2006-10-03 10:55:42 +0000 Wim Taymans + + gst/realmedia/: Added RDT depayloader. + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/rdtdepay.c: (gst_rdt_depay_base_init), + (gst_rdt_depay_class_init), (gst_rdt_depay_init), + (gst_rdt_depay_setcaps), (gst_rdt_depay_chain), + (gst_rdt_depay_set_property), (gst_rdt_depay_get_property), + (gst_rdt_depay_change_state), (gst_rdt_depay_plugin_init): + * gst/realmedia/rdtdepay.h: + Added RDT depayloader. + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr), + (gst_rmdemux_plugin_init), (plugin_init): + Remove unused function. + Added some more mime-types. + +2006-09-28 21:44:49 +0000 Jan Schmidt + + gst/dvdlpcmdec/gstdvdlpcmdec.c: If an incoming timestamp is within one sample of our current timestamp, then keep it.... + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (update_timestamps): + If an incoming timestamp is within one sample of our current + timestamp, then keep it. This prevents imprecision in the + PTS (which only has 90khz granularity) from affecting our stream. + +2006-09-28 09:16:38 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegparse.c: Reflow code so that compiler doesn't complain about possible use of uninitialised vari... + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_query): + Reflow code so that compiler doesn't complain about possible use + of uninitialised variable any longer; but just in case, initialise + it anyway; also take object ref in query function and do peer pad + stuff in a more thread-safe way. + +2006-09-27 09:54:01 +0000 Wim Taymans + + ext/dvdread/dvdreadsrc.c: Init a variable to make compilers happy. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_do_convert_query): + Init a variable to make compilers happy. + +2006-09-21 13:34:59 +0000 Martin Zlomek + + gst/mpegstream/: Send newsegment updates for sparse streams (#350778). + Original commit message from CVS: + Patch by: Martin Zlomek + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_reset), + (gst_dvd_demux_sync_stream_to_time): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), + (gst_mpeg_demux_synchronise_pads), + (gst_mpeg_demux_sync_stream_to_time): + Send newsegment updates for sparse streams (#350778). + +2006-09-20 16:18:24 +0000 Thomas Vander Stichele + + ext/dvdread/dvdreadsrc.c: fix compile warning + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_do_convert_query): + fix compile warning + +2006-09-20 16:16:18 +0000 Thomas Vander Stichele + + * configure.ac: + bump the nano bitches + Original commit message from CVS: + bump the nano bitches + +2006-09-20 11:55:00 +0000 Stefan Kost + + configure.ac: As another attempt, synaesthesia can be enabled by passing + Original commit message from CVS: + * configure.ac: + As another attempt, synaesthesia can be enabled by passing + --with-plugins="synaesthesia" to configure + +2006-09-20 11:12:22 +0000 Stefan Kost + + configure.ac: Don't build synaesthesia by default, until someone confirms that it is okay (filed as #356882) + Original commit message from CVS: + * configure.ac: + Don't build synaesthesia by default, until someone confirms that it + is okay (filed as #356882) + +2006-09-20 11:11:26 +0000 Stefan Kost + + configure.ac: Don't build synaesthesia by default, until someone confirms that it is okay (filed as #356882) + Original commit message from CVS: + * configure.ac: + Don't build synaesthesia by default, until someone confirms that it + is okay (filed as #356882) + +2006-09-18 12:29:09 +0000 Stefan Kost + + Port synaesthesia. + Original commit message from CVS: + * configure.ac: + * gst/synaesthesia/Makefile.am: + * gst/synaesthesia/gstsynaesthesia.c: (gst_synaesthesia_init), + (gst_synaesthesia_sink_setcaps), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_src_setcaps), (gst_synaesthesia_chain), + (gst_synaesthesia_change_state), (plugin_init): + Port synaesthesia. + +2006-09-16 21:58:48 +0000 Stefan Kost + + More G_OBJECT macro fixing. + Original commit message from CVS: + * ext/mad/gstid3tag.c: + * gst/mpegstream/gstrfc2250enc.h: + * gst/synaesthesia/gstsynaesthesia.c: + More G_OBJECT macro fixing. + +2006-09-15 16:14:15 +0000 Yves Lefebvre + + ext/mpeg2dec/gstmpeg2dec.c: Fix initialisation dummy buffer, the offsets are relative to the start of the buffers. Fi... + Original commit message from CVS: + Patch by: Yves Lefebvre + * ext/mpeg2dec/gstmpeg2dec.c: (init_dummybuf): + Fix initialisation dummy buffer, the offsets are relative to the start + of the buffers. Fixes #356004. + +2006-09-12 10:14:29 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + update spec file + Original commit message from CVS: + update spec file + +2006-09-09 15:22:58 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Add convert query (needed for later when we just operate in time format and let the base so... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_read): + Add convert query (needed for later when we just operate in time + format and let the base source class handle all the seeking stuff). + +2006-09-07 16:05:31 +0000 Stefan Kost + + gst/asfdemux/gstasfdemux.c: Erm, lets properly fix it. The only non-text tag that we support is the track-number and ... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_get_gst_tag_from_tag_name), + (gst_asf_demux_process_ext_content_desc): + Erm, lets properly fix it. The only non-text tag that we support is + the track-number and that is an UINT. asfdemux was returning a GValue + initialized as INT. Further the Track and not the TrackNumber tag + (the latter is a string too). + +2006-09-07 14:08:42 +0000 Stefan Kost + + gst/asfdemux/gstasfdemux.c: Skip tags that are unknown (was producing an uninialized GValue). + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_get_gst_tag_from_tag_name), + (gst_asf_demux_process_ext_content_desc): + Skip tags that are unknown (was producing an uninialized GValue). + +2006-09-01 16:21:43 +0000 from Michal Benes + + ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type), + (gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels), + (gst_a52dec_handle_frame), (gst_a52dec_change_state), + (gst_a52dec_set_property), (gst_a52dec_get_property): + * ext/a52dec/gsta52dec.h: + Patch from from Michal Benes : + Add two things to a52dec: configure the exact output format for ac3 + decoding through properties, if desired. + By default, configure an output format preferred by downstream. Now + that audioconvert lists caps by preference, this means that a52dec + can do downmixing (iff required) rather than audioconvert, so it can + use the ac3 downmix levels from the bitstream. + +2006-08-31 13:04:31 +0000 Jan Schmidt + + Add missing GST_LIBS to the link flags + Original commit message from CVS: + * ext/lame/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdsub/Makefile.am: + * gst/mpegaudioparse/Makefile.am: + Add missing GST_LIBS to the link flags + +2006-08-29 13:28:41 +0000 Tim-Philipp Müller + + configure.ac: Up requirements to core 0.10.6 for gst_event_new_new_segment_full(). + Original commit message from CVS: + * configure.ac: + Up requirements to core 0.10.6 for gst_event_new_new_segment_full(). + +2006-08-27 20:46:54 +0000 Stefan Kost + + gst/mpegstream/gstmpegpacketize.c: fix build for debug disabled + Original commit message from CVS: + * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_new): + fix build for debug disabled + +2006-08-22 15:52:16 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Use static pad templates with ANY caps for the source pads for simplicity and to avoid wa... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream): + Use static pad templates with ANY caps for the source pads for + simplicity and to avoid warnings when creating pads for unhandled + codec IDs (#351795). + +2006-08-16 10:34:57 +0000 Michal Benes + + ext/mad/gstmad.c: Fix timestamping in mad by only activating a new timestamp when the previous frame has been decoded... + Original commit message from CVS: + Patch by: Michal Benes + * ext/mad/gstmad.c: (gst_mad_chain): + Fix timestamping in mad by only activating a new timestamp when the + previous frame has been decoded. Fixes #350723. + Also clean up some of the non fatal warnings when the input buffer is + too small to decode a header. + +=== release 0.10.4 === + +2006-08-14 11:15:09 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + * docs/plugins/inspect/plugin-siddec.xml: + releasing 0.10.4 + Original commit message from CVS: + releasing 0.10.4 + +2006-08-14 11:06:29 +0000 Thomas Vander Stichele + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2006-08-14 10:19:41 +0000 Wim Taymans + + ext/a52dec/gsta52dec.c: Instead of forwarding the event in the wrong format, unref it and set a boolean that we still... + Original commit message from CVS: + Patch by: Wim Taymans + * ext/a52dec/gsta52dec.c: (gst_a52dec_sink_event): + Instead of forwarding the event in the wrong format, unref it and set + a boolean that we still need to send it in the streaming thread. + Fixes #350554 + +2006-08-14 09:50:26 +0000 Thomas Vander Stichele + + ext/dvdread/dvdreadsrc.c: Put debug category initialization before use of GST_DEBUG, in order to remove a fatal warni... + Original commit message from CVS: + Patch by: Edward Hervey (edward at fluendo dot com) + * ext/dvdread/dvdreadsrc.c: (plugin_init): + Put debug category initialization before use of GST_DEBUG, in order + to remove a fatal warning. Fixes #350895 + +2006-08-08 13:23:27 +0000 Tim-Philipp Müller + + gst/dvdsub/gstdvdsubdec.c: Set rank to NONE for the time being until we make playbin handle subtitle pictures again (... + Original commit message from CVS: + * gst/dvdsub/gstdvdsubdec.c: (plugin_init): + Set rank to NONE for the time being until we make playbin handle + subtitle pictures again (dvdsubdec seems to be a bit shaky at + times when seeking, so it's probably better if it doesn't get + autoplugged for the time being). + +2006-08-07 19:01:40 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Handle audio streams with stream_version 3 properly; warn about unknown stream versions; han... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr): + Handle audio streams with stream_version 3 properly; warn about + unknown stream versions; handle unknown fourccs a tad more + gracefully (setting bogus caps). Also, use GST_FOURCC_ARGS + with GST_FOURCC_FORMAT. + +2006-08-07 16:25:45 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Error out properly if this is an interactive DVD (fixes #345694). + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_goto_title): + Error out properly if this is an interactive DVD (fixes #345694). + +2006-08-07 16:18:33 +0000 Jan Schmidt + + ext/a52dec/gsta52dec.c: When the first_access is 1 or 0, we should copy the timestamp from the incoming buffer if the... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_chain): + When the first_access is 1 or 0, we should copy the timestamp from + the incoming buffer if there is one. + +2006-08-07 14:01:33 +0000 Tim-Philipp Müller + + ext/a52dec/gsta52dec.c: Use GST_ELEMENT_ERROR for error reporting; post errors in some more places; remove superfluou... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push), + (gst_a52dec_reneg), (gst_a52dec_handle_frame), (gst_a52dec_chain): + Use GST_ELEMENT_ERROR for error reporting; post errors in some + more places; remove superfluous newlines from debug statements. + +2006-08-07 09:17:01 +0000 Frédéric Riss + + gst/dvdsub/gstdvdsubdec.c: which happens when you use macros that got changed during the last unstable cycle because ... + Original commit message from CVS: + Patch by: Frédéric Riss + * gst/dvdsub/gstdvdsubdec.c: (gst_send_subtitle_frame): + Don't set negative durations on outgoing buffers (#350044), + which happens when you use macros that got changed during + the last unstable cycle because they were thought not to + be used anywhere. + +2006-08-06 19:47:40 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.*: Add basic support for time-based seeking; set timestamps on outgoing buffers if we have the... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_stop), + (gst_dvd_read_src_goto_chapter), + (gst_dvd_read_src_get_chapter_starts), + (gst_dvd_read_src_goto_title), (gst_dvd_read_src_get_next_cell), + (gst_dvd_read_src_get_time_for_sector), + (gst_dvd_read_src_get_sector_from_time), (gst_dvd_read_src_read), + (gst_dvd_read_src_handle_seek_event), (gst_dvd_read_src_do_seek), + (gst_dvd_read_src_goto_sector): + * ext/dvdread/dvdreadsrc.h: + Add basic support for time-based seeking; set timestamps on + outgoing buffers if we have them; create table with + chapter to time mapping when opening a title; rename + gst_dvd_read_src_get_next_cell_for() to _get_next_cell() and + make it take an explicit pgc argument; fix up some debugging + messages so that title/chapter numbers are printed as starting + from 1 for easier readability. + +2006-08-04 13:05:01 +0000 Tim-Philipp Müller + + gst/realmedia/: Factor out some code into rmutils.[ch]; when reading strings, don't read beyond the available data; r... + Original commit message from CVS: + * gst/realmedia/Makefile.am: + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr), + (gst_rmdemux_parse_cont): + * gst/realmedia/rmutils.c: (gst_rm_utils_read_string8), + (gst_rm_utils_read_string16), (gst_rm_utils_read_tags): + * gst/realmedia/rmutils.h: + Factor out some code into rmutils.[ch]; when reading + strings, don't read beyond the available data; read + metadata strings correctly (string length is 16 bits + here, not just 8). + +2006-07-31 09:53:05 +0000 Jan Schmidt + + Fix dist by including gst-libs/ + Original commit message from CVS: + * Makefile.am: + * configure.ac: + * gst/asfdemux/gstasfdemux.c: + Fix dist by including gst-libs/ + +2006-07-29 11:20:30 +0000 Tim-Philipp Müller + + Make custom error messages translatable. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (plugin_init): + * po/POTFILES.in: + Make custom error messages translatable. + * gst/asfdemux/gstasf.c: (plugin_init): + Remove setlocale() call, doesn't seem to be needed or recommended for + plugins, at least not according to gstreamer/docs/random/i18n. + +2006-07-28 15:15:15 +0000 Tim-Philipp Müller + + gst/asfdemux/: Error out when the stream is encrypted (rather than feeding garbage to the decoders). Fixes #349025. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_object): + Error out when the stream is encrypted (rather than feeding + garbage to the decoders). Fixes #349025. + +2006-07-28 15:11:42 +0000 Tim-Philipp Müller + + Add/enable autofoo magic for translations. + Original commit message from CVS: + * Makefile.am: + * autogen.sh: + * configure.ac: + * po/POTFILES.in: + Add/enable autofoo magic for translations. + +2006-07-28 13:28:19 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Don't leak streams, strings or caps. Get rid of unnecessary getcaps() function. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_reset), + (gst_rmdemux_change_state), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_cont), (gst_rmdemux_descramble_cook_audio), + (gst_rmdemux_handle_scrambled_packet), (gst_rmdemux_parse_packet): + Don't leak streams, strings or caps. Get rid of unnecessary + getcaps() function. + +2006-07-27 20:34:25 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Descramble cook audio streams before sending them to the decoder. Fixes #347292. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), + (gst_rmdemux_init), (gst_rmdemux_chain), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_parse_data), + (gst_rmdemux_stream_clear_cached_subpackets), + (gst_rmdemux_descramble_cook_audio), + (gst_rmdemux_descramble_dnet_audio), + (gst_rmdemux_handle_scrambled_packet), (gst_rmdemux_parse_packet): + Descramble cook audio streams before sending them to the + decoder. Fixes #347292. + Also miscellaneous clean-ups and log-level changes. + +2006-07-26 17:09:04 +0000 Zaheer Abbas Merali + + ext/lame/gstlame.c: Fix lame putting lots of 0's at start of mp3. Fixes bug #348786. + Original commit message from CVS: + 2006-07-26 Zaheer Abbas Merali + * ext/lame/gstlame.c: (gst_lame_setup): + Fix lame putting lots of 0's at start of mp3. Fixes bug #348786. + +2006-07-21 11:01:55 +0000 Wim Taymans + + ext/sidplay/gstsiddec.*: Remove old metadata thing. + Original commit message from CVS: + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + Remove old metadata thing. + +2006-07-15 13:33:38 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Find language codes for audio streams if they are available. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_get_ext_stream_props_for_stream), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_change_state): + Find language codes for audio streams if they are available. + +2006-07-14 13:02:53 +0000 Tim-Philipp Müller + + gst/asfdemux/: Parse extended stream properties objects and stream objects hidden inside them (but delay creation of ... + Original commit message from CVS: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_obj_stream), + (gst_asf_demux_process_stream), + (gst_asf_demux_process_language_list), + (gst_asf_demux_process_ext_stream_props), + (gst_asf_demux_process_queued_extended_stream_objects), + (gst_asf_demux_process_object), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Parse extended stream properties objects and stream objects + hidden inside them (but delay creation of the appropriate + pads until after all the 'normal' stream objects have been + dealt with) (#343763). Also parse language list object. + +2006-07-13 11:28:32 +0000 Wim Taymans + + gst/realmedia/rmdemux.*: Cleanups, use GstSegment for seeking. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), + (gst_rmdemux_finalize), (gst_rmdemux_src_event), + (find_seek_offset_time), (gst_rmdemux_perform_seek), + (gst_rmdemux_src_query), (gst_rmdemux_change_state), + (gst_rmdemux_loop), (gst_rmdemux_chain), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_combine_flows), (gst_rmdemux_parse_packet): + * gst/realmedia/rmdemux.h: + Cleanups, use GstSegment for seeking. + Fix error handling. + Combine flow return from all streams. + +2006-07-11 22:46:47 +0000 Tim-Philipp Müller + + ext/cdio/gstcdiocddasrc.c: Remove g_assert that shouldn't be there. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_close): + Remove g_assert that shouldn't be there. + +2006-07-10 11:52:58 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.c: Fix refcounting when cropping. Fixes #341677. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), (handle_slice): + Fix refcounting when cropping. Fixes #341677. + +2006-07-09 14:07:31 +0000 Grzegorz Lukasik + + gst/asfdemux/gstasfdemux.c: Fix typo. Closes #347029. + Original commit message from CVS: + Patch by: Grzegorz Lukasik + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_segment): + Fix typo. Closes #347029. + +2006-07-08 20:29:56 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Skip chunks for unknown streams properly. Fixes broken sound and/or video for files that ... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + Skip chunks for unknown streams properly. Fixes broken sound + and/or video for files that have additional streams that + we don't recognise yet (e.g. if they are embedded in extended + stream properties). Partly fixes #343763. + +2006-07-07 19:26:40 +0000 Tim-Philipp Müller + + gst/asfdemux/: Add some more GUIDs and make debug log more readable and easier to follow when parsing the headers. + Original commit message from CVS: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_identify_guid), + (gst_asf_demux_process_header), (gst_asf_demux_push_obj), + (gst_asf_demux_pop_obj), (gst_asf_demux_process_object), + (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + Add some more GUIDs and make debug log more readable + and easier to follow when parsing the headers. + +2006-06-30 11:26:22 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.*: Rewrite seeking code and make seeking in DVDs work (#337834). + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_init), + (gst_dvd_read_src_is_seekable), (gst_dvd_read_src_class_init), + (gst_dvd_read_src_stop), (gst_dvd_read_src_goto_title), + (gst_dvd_read_src_create), (gst_dvd_read_src_handle_seek_event), + (gst_dvd_read_src_do_seek), (gst_dvd_read_src_src_event): + * ext/dvdread/dvdreadsrc.h: + Rewrite seeking code and make seeking in DVDs work (#337834). + +2006-06-29 14:31:55 +0000 Tim-Philipp Müller + + autogen.sh: Check for automake-1.9 as well. + Original commit message from CVS: + * autogen.sh: + Check for automake-1.9 as well. + +2006-06-29 12:25:15 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Make check stronger. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_is_nav_pack): + Make check stronger. + +2006-06-28 11:20:03 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.*: Handle unknown codec IDs/fourccs properly (#345879); send tag events after newsegment eve... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_setup_pad), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream), + (gst_asf_demux_push_buffer): + * gst/asfdemux/gstasfdemux.h: + Handle unknown codec IDs/fourccs properly (#345879); send tag + events after newsegment event; fix use of GST_FOURCC_FORMAT + macro. + +2006-06-23 16:29:41 +0000 Jan Schmidt + + ext/a52dec/gsta52dec.c: Call the channel positions get_type() method in plugin_init to ensure that it isn't simultane... + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (plugin_init): + Call the channel positions get_type() method in plugin_init + to ensure that it isn't simultaneously called later from + multiple threads. + +2006-06-23 12:24:56 +0000 Tim-Philipp Müller + + gst/mpegstream/: Also flush packetizer cache when we get a buffer that has the + Original commit message from CVS: + * gst/mpegstream/gstmpegpacketize.c: + (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_put): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain): + Also flush packetizer cache when we get a buffer that has the + DISCONT flag set; update current byte position from buffer + offset after a flush. + +2006-06-23 11:22:04 +0000 Tim-Philipp Müller + + gst/mpegstream/: Flush packetizer cache when we get a FLUSH_STOP event; remove unused source pad member from packetiz... + Original commit message from CVS: + * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_new), + (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_destroy), + (gst_mpeg_packetize_read): + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_change_state): + Flush packetizer cache when we get a FLUSH_STOP event; + remove unused source pad member from packetizer; add debug + category for packetizer. + +2006-06-23 09:28:28 +0000 Jan Schmidt + + ext/a52dec/gsta52dec.c: Treat dual-mono as stereo. It should really be output on 2 separate pads, but isn't for now. + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (plugin_init): + Treat dual-mono as stereo. It should really be output on 2 separate + pads, but isn't for now. + +2006-06-19 15:16:43 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Assume 4:3 DAR rather than 4:3 PAR (#345184). + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): + Assume 4:3 DAR rather than 4:3 PAR (#345184). + +2006-06-19 11:59:14 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Assume pixel-aspect-ratio of 4:3 if libmpeg2dec doesn't give us any PAR whatsoever (rathe... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): + Assume pixel-aspect-ratio of 4:3 if libmpeg2dec doesn't give us + any PAR whatsoever (rather than using 0/0, which will lead to + an abort later on). Fixes #345184. + +2006-06-17 19:35:41 +0000 Michael Dominic K + + ext/mad/gstmad.c: Send newsegment event before calling gst_pad_alloc_buffer_and_set_caps(), makes mad behave better i... + Original commit message from CVS: + Patch by: Michael Dominic K. < mdk at mdk org pl> + * ext/mad/gstmad.c: (gst_mad_chain): + Send newsegment event before calling + gst_pad_alloc_buffer_and_set_caps(), makes mad behave better + in connection with pad blocking (#342594). While we're at it, + do some minor clean-ups. + +2006-06-17 14:48:04 +0000 Tim-Philipp Müller + + configure.ac: Fix --disable-external (can't set conditionals conditionally, #343602). + Original commit message from CVS: + * configure.ac: + Fix --disable-external (can't set conditionals conditionally, + #343602). + +2006-06-15 17:10:09 +0000 Tim-Philipp Müller + + ext/a52dec/Makefile.am: ... and then he said "When you go and fix the build you better make sure you have some spare ... + Original commit message from CVS: + * ext/a52dec/Makefile.am: + ... and then he said "When you go and fix the build you + better make sure you have some spare backslashes in your + pocket". + +2006-06-13 15:46:09 +0000 Wim Taymans + + ext/sidplay/gstsiddec.cc: Fix copyright, email addresses and descriptions. + Original commit message from CVS: + * ext/sidplay/gstsiddec.cc: + Fix copyright, email addresses and descriptions. + Use saner defaults for arguments. Fixes #344667. + constify some stuff. + Fix memleaks. + Add tags. + Fix negotiation to do mono/44100 by default. + Post error messages. + Use _scale_int where possible. + +2006-06-12 14:09:20 +0000 Wim Taymans + + ext/dvdnav/.cvsignore: More ignore + Original commit message from CVS: + * ext/dvdnav/.cvsignore: + More ignore + +2006-06-12 13:49:42 +0000 Wim Taymans + + tests/check/elements/amrnbenc.c: Init memory before feeding it to the encoder to make the valgrind test succeed. + Original commit message from CVS: + * tests/check/elements/amrnbenc.c: (push_data): + Init memory before feeding it to the encoder to make + the valgrind test succeed. + +2006-06-12 13:27:18 +0000 Edward Hervey + + gst/asfdemux/.cvsignore: More ignore + Original commit message from CVS: + * gst/asfdemux/.cvsignore: + More ignore + +2006-06-11 20:38:54 +0000 Tim-Philipp Müller + + .cvsignore: Ignore files generated by 'make dist'. + Original commit message from CVS: + * .cvsignore: + Ignore files generated by 'make dist'. + +2006-06-11 17:08:11 +0000 Thomas Vander Stichele + + update build files + Original commit message from CVS: + * autogen.sh: + * configure.ac: + * ext/a52dec/Makefile.am: + * ext/dvdnav/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/lame/Makefile.am: + * ext/mad/Makefile.am: + * ext/mpeg2dec/Makefile.am: + * ext/sidplay/Makefile.am: + update build files + +2006-06-11 13:57:18 +0000 Thomas Vander Stichele + + autogen.sh: require am17 + Original commit message from CVS: + * autogen.sh: + require am17 + * configure.ac: + * ext/annodex/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dv/Makefile.am: + * ext/esd/Makefile.am: + * ext/flac/Makefile.am: + * ext/gdk_pixbuf/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/speex/Makefile.am: + * ext/taglib/Makefile.am: + * sys/oss/Makefile.am: + * sys/sunaudio/Makefile.am: + * sys/ximage/Makefile.am: + clean up build further + +2006-06-07 17:05:48 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.*: Simplify and don't leak our buffer pool. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_finalize), + (gst_mpeg2dec_reset), (clear_buffers), (handle_picture), + (gst_mpeg2dec_sink_convert), (gst_mpeg2dec_src_convert), + (gst_mpeg2dec_change_state): + * ext/mpeg2dec/gstmpeg2dec.h: + Simplify and don't leak our buffer pool. + Use _scale_int. + Remove unfixed bug number from previous ChangeLog entry. + +2006-06-07 16:15:42 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.*: Fix padtemplate as we can now do fractional framerates. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), + (gst_mpeg2dec_class_init), (gst_mpeg2dec_init), + (gst_mpeg2dec_finalize), (gst_mpeg2dec_reset), + (gst_mpeg2dec_qos_reset), (gst_mpeg2dec_alloc_buffer), + (gst_mpeg2dec_negotiate_format), (init_dummybuf), + (handle_sequence), (handle_picture), (handle_slice), + (gst_mpeg2dec_chain), (gst_mpeg2dec_sink_event), + (gst_mpeg2dec_src_event), (gst_mpeg2dec_change_state): + * ext/mpeg2dec/gstmpeg2dec.h: + Fix padtemplate as we can now do fractional framerates. + Small cleanups. + Use GstSegment. + Add simple frame dropping QoS. + Precalc buffer output sizes and UV offsets. + Always give libmpeg2 a valid fbuf when it wants one. + don't trust libmpeg to discard our buffers but manage it + ourselves. + Fixes #343627, #327350, #335288 + +2006-06-05 20:57:12 +0000 Sébastien Moutte + + win32/MANIFEST: Add a manifest for futures ugly win32 releases. + Original commit message from CVS: + * win32/MANIFEST: + Add a manifest for futures ugly win32 releases. + * gst/iec958/ac3iec.c: (ac3iec_chain_raw): + Move bufcaps declaration at the begining of the instructions + block. + +2006-06-01 22:00:26 +0000 Stefan Kost + + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + Original commit message from CVS: + * ext/alsaspdif/alsaspdifsink.h: + * ext/amrwb/gstamrwbdec.h: + * ext/amrwb/gstamrwbenc.h: + * ext/amrwb/gstamrwbparse.h: + * ext/arts/gst_arts.h: + * ext/artsd/gstartsdsink.h: + * ext/audiofile/gstafparse.h: + * ext/audiofile/gstafsink.h: + * ext/audiofile/gstafsrc.h: + * ext/audioresample/gstaudioresample.h: + * ext/bz2/gstbz2dec.h: + * ext/bz2/gstbz2enc.h: + * ext/dirac/gstdiracdec.h: + * ext/directfb/dfbvideosink.h: + * ext/divx/gstdivxdec.h: + * ext/divx/gstdivxenc.h: + * ext/dts/gstdtsdec.h: + * ext/faac/gstfaac.h: + * ext/gsm/gstgsmdec.h: + * ext/gsm/gstgsmenc.h: + * ext/ivorbis/vorbisenc.h: + * ext/libfame/gstlibfame.h: + * ext/nas/nassink.h: + * ext/neon/gstneonhttpsrc.h: + * ext/polyp/polypsink.h: + * ext/sdl/sdlaudiosink.h: + * ext/sdl/sdlvideosink.h: + * ext/shout/gstshout.h: + * ext/snapshot/gstsnapshot.h: + * ext/sndfile/gstsf.h: + * ext/swfdec/gstswfdec.h: + * ext/tarkin/gsttarkindec.h: + * ext/tarkin/gsttarkinenc.h: + * ext/theora/theoradec.h: + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackparse.h: + * ext/xine/gstxine.h: + * ext/xvid/gstxviddec.h: + * ext/xvid/gstxvidenc.h: + * gst/cdxaparse/gstcdxaparse.h: + * gst/cdxaparse/gstcdxastrip.h: + * gst/colorspace/gstcolorspace.h: + * gst/festival/gstfestival.h: + * gst/freeze/gstfreeze.h: + * gst/gdp/gstgdpdepay.h: + * gst/gdp/gstgdppay.h: + * gst/modplug/gstmodplug.h: + * gst/mpeg1sys/gstmpeg1systemencode.h: + * gst/mpeg1videoparse/gstmp1videoparse.h: + * gst/mpeg2sub/gstmpeg2subt.h: + * gst/mpegaudioparse/gstmpegaudioparse.h: + * gst/multifilesink/gstmultifilesink.h: + * gst/overlay/gstoverlay.h: + * gst/playondemand/gstplayondemand.h: + * gst/qtdemux/qtdemux.h: + * gst/rtjpeg/gstrtjpegdec.h: + * gst/rtjpeg/gstrtjpegenc.h: + * gst/smooth/gstsmooth.h: + * gst/smoothwave/gstsmoothwave.h: + * gst/spectrum/gstspectrum.h: + * gst/speed/gstspeed.h: + * gst/stereo/gststereo.h: + * gst/switch/gstswitch.h: + * gst/tta/gstttadec.h: + * gst/tta/gstttaparse.h: + * gst/videodrop/gstvideodrop.h: + * gst/xingheader/gstxingmux.h: + * sys/directdraw/gstdirectdrawsink.h: + * sys/directsound/gstdirectsoundsink.h: + * sys/dxr3/dxr3audiosink.h: + * sys/dxr3/dxr3spusink.h: + * sys/dxr3/dxr3videosink.h: + * sys/qcam/gstqcamsrc.h: + * sys/vcd/vcdsrc.h: + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + +2006-06-01 21:11:41 +0000 Stefan Kost + + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + Original commit message from CVS: + * ext/a52dec/gsta52dec.h: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.h: + * ext/amrnb/amrnbparse.h: + * ext/mpeg2dec/gstmpeg2dec.h: + * ext/sidplay/gstsiddec.h: + * gst/ac3parse/gstac3parse.h: + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstasfmux.h: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + * gst/iec958/ac3iec.h: + * gst/mpegaudioparse/gstmpegaudioparse.h: + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegclock.h: + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.h: + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + +2006-05-27 11:35:11 +0000 Tim-Philipp Müller + + README: Replace current README (containing the release notes from some 0.9.x version) with a proper README taken from... + Original commit message from CVS: + * README: + Replace current README (containing the release notes from + some 0.9.x version) with a proper README taken from the core. + +2006-05-24 15:56:13 +0000 Wim Taymans + + ext/amrnb/: Sortof first quick cleanup of all this mess... + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_event), (gst_amrnbdec_chain): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_sink_event), (gst_amrnbparse_chain), + (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Sortof first quick cleanup of all this mess... + Don't crap out on empty and invalid FTs but treat them as + empty packets, the decoder handles them fine. + Fixes #342222. + +2006-05-22 08:24:09 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasf.c: Call gst_riff_init() so the riff debug category gets set up before it is being used. + Original commit message from CVS: + * gst/asfdemux/gstasf.c: (plugin_init): + Call gst_riff_init() so the riff debug category gets set up + before it is being used. + +2006-05-19 13:55:11 +0000 Michael Smith + + gst/iec958/: Write rate into the caps, for the allowed ac3 rates. Some minor cleanups. + Original commit message from CVS: + * gst/iec958/ac3_padder.c: (ac3p_parse): + * gst/iec958/ac3_padder.h: + * gst/iec958/ac3iec.c: (ac3iec_init), (ac3iec_set_property), + (ac3iec_chain_raw), (ac3iec_change_state): + * gst/iec958/ac3iec.h: + Write rate into the caps, for the allowed ac3 rates. Some minor + cleanups. + +2006-05-18 13:00:21 +0000 James Doc Livingston + + ext/mad/gstid3tag.c: Do tag merging correctly (#339918). Output taglists properly in debug statements too while we're... + Original commit message from CVS: + Patch by: James "Doc" Livingston + * ext/mad/gstid3tag.c: (gst_id3_tag_get_tag_to_render): + Do tag merging correctly (#339918). Output taglists + properly in debug statements too while we're at it. + +2006-05-11 16:17:44 +0000 Jan Schmidt + + ext/a52dec/gsta52dec.c: Add more debug + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_chain): + Add more debug + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcm_reset), + (gst_dvdlpcmdec_init), (update_timestamps), + (gst_dvdlpcmdec_chain_dvd), (gst_dvdlpcmdec_chain_raw), + (dvdlpcmdec_sink_event): + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + If we have a first_access offset but no current timestamp (might + happen after a seek), then calculate a start time for the first + portion so that it will align with the timestamp given for the + first_access portion. + If a new-segment arrives with format time, store the start + time as a failsafe timestamp in case we never get any further + timestamp info (unlikely) + Mask out the 'frame number' section of the incoming header so + that we don't consider it to be changing on every buffer and + reset the caps constantly. + Use gst_util_uint64_scale for duration calculation + +2006-05-11 14:34:10 +0000 Michael Smith + + gst/dvdlpcmdec/gstdvdlpcmdec.c: Fix timestamping for cases where the first_access parameter is 4. + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain_dvd): + Fix timestamping for cases where the first_access parameter is 4. + Ensure we don't overrun buffers in other cases. + +2006-05-10 14:40:03 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: Fix silly bug when reading metadata (#341254). + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_string): + Fix silly bug when reading metadata (#341254). + +2006-05-08 11:57:26 +0000 Edward Hervey + + autogen.sh: libtoolize on Darwin/MacOSX is called glibtoolize + Original commit message from CVS: + * autogen.sh: (CONFIGURE_DEF_OPT): + libtoolize on Darwin/MacOSX is called glibtoolize + +2006-05-06 11:38:30 +0000 Tim-Philipp Müller + + ext/lame/gstlame.*: Remove tag writing from lame (which was completely broken anyway, #329184). Leaving GstTagSetter ... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_get_type), + (gst_lame_release_memory), (gst_lame_init), (gst_lame_sink_event), + (gst_lame_setup), (gst_lame_change_state): + * ext/lame/gstlame.h: + Remove tag writing from lame (which was completely broken + anyway, #329184). Leaving GstTagSetter interface around for + now, albeit non-functional. Should be removed completely + in 0.11. Use the 'id3v2mux' plugin from -good for writing + tags. + +2006-05-06 00:18:31 +0000 Maciej Katafiasz + + * ChangeLog: + * ext/dvdread/dvdreadsrc.c: + * gst/asfdemux/gstasfdemux.c: + Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. + Original commit message from CVS: + Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. + +2006-05-05 08:23:39 +0000 Andres Salomon + + ext/lame/gstlame.c: Fix typo (comma vs. semicolon) (#340710). + Original commit message from CVS: + Patch by: Andres Salomon + * ext/lame/gstlame.c: (gst_lame_sink_event): + Fix typo (comma vs. semicolon) (#340710). + +2006-05-04 08:24:52 +0000 Lutz Müller + + ext/mad/gstmad.c: Make mad the second element to support the highly useful + Original commit message from CVS: + Patch by: Lutz Müller + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_src_query): + Make mad the second element to support the highly useful + FORMATS query (#340594) + +2006-05-02 10:28:48 +0000 Edward Hervey + + ext/mpeg2dec/gstmpeg2dec.c: Remember the query duration format before passing it upstream since it could have been mo... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_sink_convert), + (gst_mpeg2dec_src_query): + Remember the query duration format before passing it upstream since it + could have been modified. + Add GST_WARNING_OBJECT in sink convert function to detail why the + conversion didn't work. + +2006-04-25 21:56:37 +0000 Stefan Kost + + Define GstElementDetails as const and also static (when defined as global) + Original commit message from CVS: + * ext/amrwb/gstamrwbdec.c: + * ext/amrwb/gstamrwbenc.c: + * ext/amrwb/gstamrwbparse.c: + * ext/arts/gst_arts.c: + * ext/artsd/gstartsdsink.c: + * ext/audiofile/gstafparse.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/audioresample/gstaudioresample.c: + * ext/bz2/gstbz2dec.c: + * ext/bz2/gstbz2enc.c: + * ext/cdaudio/gstcdaudio.c: + * ext/directfb/dfbvideosink.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): + * ext/faac/gstfaac.c: (gst_faac_base_init): + * ext/faad/gstfaad.c: + * ext/gsm/gstgsmdec.c: + * ext/gsm/gstgsmenc.c: + * ext/hermes/gsthermescolorspace.c: + * ext/ivorbis/vorbisfile.c: + * ext/lcs/gstcolorspace.c: + * ext/libfame/gstlibfame.c: + * ext/libmms/gstmms.c: (gst_mms_base_init): + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/nas/nassink.c: (gst_nassink_base_init): + * ext/neon/gstneonhttpsrc.c: + * ext/sdl/sdlaudiosink.c: + * ext/sdl/sdlvideosink.c: + * ext/shout/gstshout.c: + * ext/snapshot/gstsnapshot.c: + * ext/sndfile/gstsf.c: + * ext/swfdec/gstswfdec.c: + * ext/tarkin/gsttarkindec.c: + * ext/tarkin/gsttarkinenc.c: + * ext/theora/theoradec.c: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): + * gst/chart/gstchart.c: + * gst/colorspace/gstcolorspace.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): + * gst/festival/gstfestival.c: + * gst/filter/gstbpwsinc.c: + * gst/filter/gstiir.c: + * gst/filter/gstlpwsinc.c: + * gst/freeze/gstfreeze.c: + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + * gst/librfb/gstrfbsrc.c: + * gst/mixmatrix/mixmatrix.c: + * gst/mpeg1sys/gstmpeg1systemencode.c: + * gst/mpeg1videoparse/gstmp1videoparse.c: + * gst/mpeg2sub/gstmpeg2subt.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/multifilesink/gstmultifilesink.c: + * gst/overlay/gstoverlay.c: + * gst/passthrough/gstpassthrough.c: + * gst/playondemand/gstplayondemand.c: + * gst/qtdemux/qtdemux.c: + * gst/rtjpeg/gstrtjpegdec.c: + * gst/rtjpeg/gstrtjpegenc.c: + * gst/smooth/gstsmooth.c: + * gst/smoothwave/gstsmoothwave.c: + * gst/spectrum/gstspectrum.c: + * gst/speed/gstspeed.c: + * gst/stereo/gststereo.c: + * gst/switch/gstswitch.c: + * gst/tta/gstttadec.c: (gst_tta_dec_base_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): + * gst/vbidec/gstvbidec.c: + * gst/videocrop/gstvideocrop.c: + * gst/videodrop/gstvideodrop.c: + * gst/virtualdub/gstxsharpen.c: + * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): + * gst/y4m/gsty4mencode.c: + * sys/cdrom/gstcdplayer.c: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/glsink/glimagesink.c: + * sys/qcam/gstqcamsrc.c: + * sys/v4l2/gstv4l2src.c: + * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): + * sys/ximagesrc/ximagesrc.c: + Define GstElementDetails as const and also static (when defined as + global) + +2006-04-25 21:47:03 +0000 Stefan Kost + + Define GstElementDetails as const and also static (when defined as global) + Original commit message from CVS: + * ext/mad/gstid3tag.c: + * ext/mad/gstmad.c: + * gst/ac3parse/gstac3parse.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/synaesthesia/gstsynaesthesia.c: + Define GstElementDetails as const and also static (when defined as + global) + +2006-04-25 21:39:40 +0000 Stefan Kost + + Define GstElementDetails as const and also static (when defined as global) + Original commit message from CVS: + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/shout2/gstshout2.c: (gst_shout2send_init): + * ext/shout2/gstshout2.h: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/apetag/gstapedemux.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init): + * gst/avi/gstavidemux.c: (gst_avi_demux_base_init): + * gst/avi/gstavimux.c: (gst_avimux_base_init): + * gst/cutter/gstcutter.c: + * gst/debug/breakmydata.c: + * gst/debug/efence.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/gstnavseek.c: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/testplugin.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/icydemux/gsticydemux.c: + * gst/id3demux/gstid3demux.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/law/alaw-decode.c: (gst_alawdec_base_init): + * gst/law/alaw-encode.c: (gst_alawenc_base_init): + * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): + * gst/level/gstlevel.c: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstfdsink.c: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gststatistics.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstsmpte.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: (gst_gamma_base_init): + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + (gst_videotemplate_base_init): + * gst/videomixer/videomixer.c: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_class_init), (gst_wavparse_dispose), + (gst_wavparse_reset), (gst_wavparse_init), + (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), + (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), + (gst_wavparse_parse_stream_init), (gst_wavparse_send_event), + (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), + (gst_wavparse_chain), (gst_wavparse_srcpad_event), + (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiosink.c: + Define GstElementDetails as const and also static (when defined as + global) + +2006-04-25 12:17:02 +0000 Tim-Philipp Müller + + ext/dvdnav/dvdnavsrc.c: Fix name of custom event (use same as dvdreadsrc). + Original commit message from CVS: + * ext/dvdnav/dvdnavsrc.c: (gst_dvd_nav_src_push_titlelang_event): + Fix name of custom event (use same as dvdreadsrc). + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_chain), + (gst_dvd_sub_dec_sink_event), (gst_dvd_sub_dec_handle_dvd_event): + Fix event parsing (the event name is in the structure, not the + name of the structure itself); also fix indentation after + boilerplate macro. + +2006-04-23 09:49:14 +0000 Tim-Philipp Müller + + ext/mad/gstid3tag.c: Change debug category to 'id3mux'. + Original commit message from CVS: + * ext/mad/gstid3tag.c: (plugin_init): + Change debug category to 'id3mux'. + +2006-04-22 18:49:01 +0000 Alexander Lancaster + + ext/mad/gstid3tag.c: When acting as a muxer, set caps on outgoing buffers and set caps on source pad (fixes #323658).... + Original commit message from CVS: + Patch by: Alexander Lancaster + * ext/mad/gstid3tag.c: (gst_id3_tag_get_caps), (gst_id3_tag_init), + (gst_id3_tag_sink_event), (gst_id3_tag_src_link), + (gst_id3_tag_chain): + When acting as a muxer, set caps on outgoing buffers and set caps + on source pad (fixes #323658). Remove unused application/x-gst-tags + cruft from the 0.6 days. + +2006-04-21 20:37:43 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: .. and DEFAULT queries should work too. Use magic gst util scale functions in some places. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_convert_sink), (gst_mad_convert_src), + (gst_mad_src_query), (gst_mad_chain): + .. and DEFAULT queries should work too. Use magic gst util scale + functions in some places. + +2006-04-21 19:31:47 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Fix duration query in BYTES format (#336824). + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_src_query): + Fix duration query in BYTES format (#336824). + +2006-04-21 12:40:41 +0000 Ed Catmur + + ext/lame/gstlame.c: Don't crash if we get an EOS event before the encoder has been set up (#339287). + Original commit message from CVS: + Patch by: Ed Catmur + * ext/lame/gstlame.c: (gst_lame_sink_event): + Don't crash if we get an EOS event before the encoder + has been set up (#339287). + +2006-04-21 11:17:08 +0000 Wim Taymans + + ext/dvdread/dvdreadsrc.c: Move errors out of the normal code flow. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_start), + (gst_dvd_read_src_goto_title), (gst_dvd_read_src_read), + (gst_dvd_read_src_create), (gst_dvd_read_src_goto_sector): + Move errors out of the normal code flow. + Don't send eos, basesrc will do that for us when needed. + +2006-04-21 10:50:17 +0000 Wim Taymans + + gst/mpegstream/: Do state changes correctly + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_change_state): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_change_state): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_change_state): + Do state changes correctly + +2006-04-13 19:08:20 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Can't use gst_pad_alloc_buffer*() when we are going to crop the image before sending it o... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_sized_buf), + (gst_mpeg2dec_alloc_buffer): + Can't use gst_pad_alloc_buffer*() when we are going to crop + the image before sending it out. Downstream basetransform-based + elements will complain about the wrong unit size otherwise + (when not operating in passthrough-mode at least). + Const-ify some static variables and do some minor clean-ups. + Use I420 macros for size/offsets (not really necessary in this + particular context, but this kind of code gets copy'n'pasted). + +2006-04-13 18:21:08 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegpacketize.*: g_malloc() can't fail, we don't need to handle this. Same for gst_buffer_new_and_a... + Original commit message from CVS: + * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_put), + (read_cache): + * gst/mpegstream/gstmpegpacketize.h: + g_malloc() can't fail, we don't need to handle this. Same for + gst_buffer_new_and_alloc(). + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain): + klass->send_buffer() should have the same semantics as + gst_pad_push(), ie. ownership of the buffer is transfered, + so we never have to unref the buffer no matter what the flow + return value was. + +2006-04-12 16:21:17 +0000 Thomas Vander Stichele + + * tests/check/gst-plugins-ugly.supp: + one more suppression for FC4 + Original commit message from CVS: + one more suppression for FC4 + +2006-04-10 16:58:24 +0000 Michael Smith + + * tests/check/gst-plugins-ugly.supp: + The AMR encoder sucks giant sucky things through a sucky object with a giant sucking machine. More suppressions. + Original commit message from CVS: + The AMR encoder sucks giant sucky things through a sucky object with a giant + sucking machine. More suppressions. + +2006-04-10 14:47:11 +0000 Thomas Vander Stichele + + add test for amrnbenc, enable test infrastructure, and fix a leak + Original commit message from CVS: + add test for amrnbenc, enable test infrastructure, and fix a leak + * common/check.mak: + allow for specifying more than one suppressions file in SUPPRESSIONS + * Makefile.am: + * tests/Makefile.am: + * tests/check/.cvsignore: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * configure.ac: + add tests/check + * tests/check/gst-plugins-ugly.supp: + add suppressions for libs used by -ugly + * tests/check/elements/amrnbenc.c: (buffer_new), (buffer_unref), + (setup_amrnbenc), (cleanup_amrnbenc), (push_data), + (GST_START_TEST), (amrnbenc_suite), (main): + add a simple test for encoding amr + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_init): + fix pad template leaks + +2006-04-10 11:48:29 +0000 Michael Smith + + ext/amrnb/amrnbenc.c: Plug big leak in AMR encoder. + Original commit message from CVS: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_chain): + Plug big leak in AMR encoder. + +2006-04-09 18:09:40 +0000 Sébastien Moutte + + ext/mad/gstmad.c: move GstIndexEntry *entry variable declaration before the first instruction + Original commit message from CVS: + * ext/mad/gstmad.c: (index_seek): + move GstIndexEntry *entry variable declaration before + the first instruction + * ext/mad/gstmad.c: + remove debug macros with variable number of parameter by using + GST_DEBUG for WIN32 + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_parse_subpic): + use gst_guint64_to_gdouble for conversions + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_sync_stream_to_time): + replace __FUNCTION__ which is not supported by MSVC by the current function name + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset): + remove LL suffix by using G_GINT64_CONSTANT + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead),(gst_mpeg_parse_get_rate): + use gst_guint64_to_gdouble for conversions + * gst/mpegstream/gstmpegparse.h: + remove LL suffix by using G_GINT64_CONSTANT + * win32/vs6: + add project files for tagac3parse, asfdemux, dvdlpcmdec, dvdsub, iec958, lame, + mad, mpegaudioparse, mpegstream, realmedia, synaesthesia + +2006-04-08 21:42:19 +0000 Stefan Kost + + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_class_init): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_class_init): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_class_init): + * ext/mad/gstmad.c: (gst_mad_class_init): + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_class_init): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_class_init): + * gst/asfdemux/gstasfmux.c: (gst_asfmux_class_init): + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_class_init): + * gst/iec958/ac3iec.c: (ac3iec_class_init): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init): + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init): + * gst/mpegstream/gstmpegclock.c: (gst_mpeg_clock_class_init): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_class_init): + * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init): + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init): + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + +2006-04-07 09:14:26 +0000 Fabrizio Gennari + + gst/asfdemux/gstasfdemux.c: Send newsegment event only once per pad, fixes #336550. + Original commit message from CVS: + Patch by: Fabrizio Gennari + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_sink_event), + (gst_asf_demux_push_buffer): + Send newsegment event only once per pad, fixes #336550. + +2006-04-06 11:35:26 +0000 j^ + + Unify the long descriptions in the plugin details (#337263). + Original commit message from CVS: + Patch by: j^ + * ext/amrwb/gstamrwbdec.c: + * ext/amrwb/gstamrwbenc.c: + * ext/amrwb/gstamrwbparse.c: + * ext/arts/gst_arts.c: + * ext/artsd/gstartsdsink.c: + * ext/audiofile/gstafparse.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/cdaudio/gstcdaudio.c: + * ext/directfb/dfbvideosink.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): + * ext/faac/gstfaac.c: (gst_faac_base_init): + * ext/faad/gstfaad.c: + * ext/gsm/gstgsmdec.c: + * ext/gsm/gstgsmenc.c: + * ext/hermes/gsthermescolorspace.c: + * ext/ivorbis/vorbisfile.c: + * ext/lcs/gstcolorspace.c: + * ext/libfame/gstlibfame.c: + * ext/libmms/gstmms.c: (gst_mms_base_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/nas/nassink.c: (gst_nassink_base_init): + * ext/neon/gstneonhttpsrc.c: + * ext/polyp/polypsink.c: (gst_polypsink_base_init): + * ext/sdl/sdlaudiosink.c: + * ext/sdl/sdlvideosink.c: + * ext/shout/gstshout.c: + * ext/snapshot/gstsnapshot.c: + * ext/sndfile/gstsf.c: + * ext/tarkin/gsttarkindec.c: + * ext/tarkin/gsttarkinenc.c: + * ext/theora/theoradec.c: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): + * gst/chart/gstchart.c: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): + * gst/festival/gstfestival.c: + * gst/filter/gstiir.c: + * gst/filter/gstlpwsinc.c: + * gst/freeze/gstfreeze.c: + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + * gst/mixmatrix/mixmatrix.c: + * gst/mpeg1sys/gstmpeg1systemencode.c: + * gst/mpeg1videoparse/gstmp1videoparse.c: + * gst/mpeg2sub/gstmpeg2subt.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/multifilesink/gstmultifilesink.c: + * gst/overlay/gstoverlay.c: + * gst/passthrough/gstpassthrough.c: + * gst/playondemand/gstplayondemand.c: + * gst/qtdemux/qtdemux.c: + * gst/rtjpeg/gstrtjpegdec.c: + * gst/rtjpeg/gstrtjpegenc.c: + * gst/smooth/gstsmooth.c: + * gst/tta/gstttadec.c: (gst_tta_dec_base_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): + * gst/videocrop/gstvideocrop.c: + * gst/videodrop/gstvideodrop.c: + * gst/virtualdub/gstxsharpen.c: + * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): + * gst/y4m/gsty4mencode.c: + Unify the long descriptions in the plugin details (#337263). + +2006-04-05 10:02:34 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + fix version numbering + Original commit message from CVS: + fix version numbering + +2006-04-05 09:18:35 +0000 Christian Schaller + + * common: + * gst-plugins-ugly.spec.in: + add dvdsub plugin to spec + Original commit message from CVS: + add dvdsub plugin to spec + +2006-04-01 15:43:46 +0000 Thomas Vander Stichele + + docs/plugins/: add siddec + Original commit message from CVS: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/inspect/plugin-siddec.xml: + add siddec + * ext/dvdnav/dvdnavsrc.c: + doc fixes + +2006-04-01 15:30:56 +0000 Thomas Vander Stichele + + * common: + * configure.ac: + * ext/sidplay/Makefile.am: + disable use of AS_LIBTOOL_TAGS, it doesn't work correctly + Original commit message from CVS: + disable use of AS_LIBTOOL_TAGS, it doesn't work correctly + +2006-04-01 14:08:36 +0000 Thomas Vander Stichele + + * docs/plugins/.gitignore: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + ignore more + Original commit message from CVS: + ignore more + +2006-04-01 14:08:11 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-asf.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-dvdread.xml: + * docs/plugins/inspect/plugin-dvdsub.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-mpegstream.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + update plugin inspect files + Original commit message from CVS: + update plugin inspect files + +2006-04-01 10:09:10 +0000 Thomas Vander Stichele + + * gst/mpegaudioparse/gstxingmux.c: + rework build; add translations for v4l2 + Original commit message from CVS: + rework build; add translations for v4l2 + +2006-04-01 09:54:39 +0000 Thomas Vander Stichele + + configure.ac: rework similarly to other modules + Original commit message from CVS: + * configure.ac: + rework similarly to other modules + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnb.c: + * ext/dvdnav/dvdnavsrc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.c: + * ext/mad/gstid3tag.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * gst/asfdemux/gstasf.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdsub/gstdvdsubdec.c: + * gst/iec958/ac3iec.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstmpegstream.c: + * gst/realmedia/rmdemux.c: (plugin_init): + use the correct defines + +2006-04-01 09:53:17 +0000 Thomas Vander Stichele + + * common: + * docs/.gitignore: + * docs/plugins/.gitignore: + ignore more + Original commit message from CVS: + ignore more + +2006-03-31 11:13:50 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.10.3 === + +2006-03-31 11:10:46 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + releasing 0.10.3 + Original commit message from CVS: + releasing 0.10.3 + +2006-03-30 15:37:00 +0000 Wim Taymans + + better/unified long descriptions + Original commit message from CVS: + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdec.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init): + * gst/avi/gstavimux.c: (gst_avimux_base_init): + * gst/cutter/gstcutter.c: + * gst/debug/breakmydata.c: + * gst/debug/efence.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/testplugin.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/law/alaw-decode.c: (gst_alawdec_base_init): + * gst/law/alaw-encode.c: (gst_alawenc_base_init): + * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): + * gst/level/gstlevel.c: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gststatistics.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/smpte/gstsmpte.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: (gst_gamma_base_init): + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + (gst_videotemplate_base_init): + * gst/videomixer/videomixer.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init): + better/unified long descriptions + Fixed #336602 + Some cleanups to auparse, don't send multiple newsegments. + +2006-03-29 11:31:55 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegparse.c: Don't unref event unconditionally after giving away ownership (gst_pad_push_event(), g... + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_event): + Don't unref event unconditionally after giving away ownership + (gst_pad_push_event(), gst_pad_send_event() and + gst_pad_event_default() take ownership of the event + passed to them). Fixes warnings/crashes caused by + navigation events. + +2006-03-28 20:19:31 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegdemux.c: Don't ref NULL caps (private streams have NULL caps) (#336387); also, no need to set c... + Original commit message from CVS: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + Don't ref NULL caps (private streams have NULL caps) (#336387); + also, no need to set caps on the same buffer twice. + +2006-03-28 19:44:51 +0000 Tim-Philipp Müller + + gst/mpegstream/: Don't leak element and pad names in error messages, use + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event), + (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream): + * gst/mpegstream/gstmpegdemux.c: + (gst_mpeg_demux_sync_stream_to_time): + Don't leak element and pad names in error messages, use + GST_DEBUG_PAD_NAME instead. Add some more debug code. + +2006-03-28 19:29:39 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Name the structure in the custom event with the language codes for the audio and subtitle s... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_init), + (gst_dvd_read_src_goto_title), (gst_dvd_read_src_read): + Name the structure in the custom event with the + language codes for the audio and subtitle streams + actually like dvddemux expects it to be named. + Set caps on source pad and outgoing buffers. + +2006-03-28 16:06:05 +0000 Tim-Philipp Müller + + ext/lame/gstlame.*: Make xingheader property non-functional, it's broken anyway after all (use xingmux instead). + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_set_property), + (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + Make xingheader property non-functional, it's broken anyway + after all (use xingmux instead). + +2006-03-28 15:10:18 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: On EOS, flush encoder and send remaining data. Fix return value handling in sink event function. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_event): + On EOS, flush encoder and send remaining data. Fix + return value handling in sink event function. + +2006-03-27 14:04:08 +0000 Jürg Billeter + + ext/dvdread/dvdreadsrc.c: Fix wrong check for started flag when setting the 'device' property. + Original commit message from CVS: + Patch by: Jürg Billeter + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_set_property): + Fix wrong check for started flag when setting the 'device' property. + We want to allow it when the source is NOT started yet and ignore it + when the source is running. + +2006-03-27 10:39:03 +0000 Fabrizio Gennari + + gst/asfdemux/gstasfdemux.*: Subtract first timestamp from timestamps, so that stream starts from 0; makes live stream... + Original commit message from CVS: + Patch by: Fabrizio Gennari + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_setup_pad), + (gst_asf_demux_process_chunk): + * gst/asfdemux/gstasfdemux.h: + Subtract first timestamp from timestamps, so that + stream starts from 0; makes live streams that don't + start at 0 work again (fixes #317310, #336097). + +2006-03-27 10:09:43 +0000 Christian Kirbach + + configure.ac: Remove CXX tag from AS_LIBTOOL_TAGS, just like we did for + Original commit message from CVS: + Patch by: Christian Kirbach + * configure.ac: + Remove CXX tag from AS_LIBTOOL_TAGS, just like we did for + -good. Fixes build on some systems (#331838). + +2006-03-24 19:47:37 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Extract more tags and also post codec name tag on the bus so this shows up in totem and naut... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_parse_cont): + Extract more tags and also post codec name tag on the + bus so this shows up in totem and nautilus. + +2006-03-24 19:06:41 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: Extra data usually goes into the caps as 'codec_data', not as first buffer into the stream. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_fill_audio_packet), (gst_rmdemux_parse_packet): + Extra data usually goes into the caps as 'codec_data', not + as first buffer into the stream. + Need to byte swap AC3 content in realmedia files for some + reason (fixes #331588). + +2006-03-24 12:08:39 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: When operating in pull mode, post an error message on the bus when all source pads are unlin... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_init), + (gst_rmdemux_validate_offset), (gst_rmdemux_loop), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_parse_packet): + When operating in pull mode, post an error message on the + bus when all source pads are unlinked or some other fatal + error occured (#323023). Regrade some recurring debug messages + to LOG level. Convert c++-style comments into C-style ones. + +2006-03-24 11:42:31 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.*: Handle unlinked source pads properly and stop if all source pads are unlinked (#323023). + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_perform_seek), + (gst_rmdemux_loop), (gst_rmdemux_chain), (gst_rmdemux_send_event), + (gst_rmdemux_all_source_pads_unlinked), + (gst_rmdemux_at_least_one_stream_flowok), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_packet): + * gst/realmedia/rmdemux.h: + Handle unlinked source pads properly and stop if all source pads + are unlinked (#323023). + +2006-03-23 18:17:34 +0000 Michal Benes + + gst/mpegstream/: Timestamps in mpeg stream are 32-bit numbers. Therefore, with a clock_freq of 90kHz this timestamp o... + Original commit message from CVS: + Patch by: Michal Benes + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes), + (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_reset): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Timestamps in mpeg stream are 32-bit numbers. Therefore, with a + clock_freq of 90kHz this timestamp overflows every ~13 hours. This + situation really happens when grabbing DVB streams. Current + mpegdemuxer can not handle this situation correctly and it + restarts counting gstreamer timestamps from zero. + Fixes #326598. + +2006-03-15 22:01:40 +0000 Michael Smith + + ext/a52dec/gsta52dec.*: Fix #334550: failure to play raw AC3 files due to segment problems. + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_sink_event), + (gst_a52dec_chain_raw), (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Fix #334550: failure to play raw AC3 files due to segment problems. + +2006-03-15 13:43:42 +0000 Christophe Fergeau + + ext/lame/gstlame.c: use GST_DEBUG_FUNCPTR more often. + Original commit message from CVS: + Patch by: Christophe Fergeau + * ext/lame/gstlame.c: (gst_lame_release_memory), + (gst_lame_finalize), (gst_lame_class_init), + (gst_lame_sink_setcaps), (gst_lame_init), (gst_lame_sink_event), + (gst_lame_change_state): + Fix some memory leaks (#333345), use GST_DEBUG_FUNCPTR more often. + +2006-03-14 19:41:17 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Include AUDIO_CODEC tag with tags posted if input is not framed (#334258). Use _scale() util functi... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_convert_sink), (gst_mad_update_info), + (gst_mad_sink_event), (gst_mad_change_state): + Include AUDIO_CODEC tag with tags posted if input is not + framed (#334258). Use _scale() util functions in more places. + +2006-03-12 11:00:33 +0000 Christophe Fergeau + + ext/lame/gstlame.c: mark the xing-header property as BROKEN (see http://bugzilla.gnome.org/show_bug.cgi?id=330317#c19... + Original commit message from CVS: + 2006-03-12 Christophe Fergeau + Reviewed by: Tim-Philipp Müller + * ext/lame/gstlame.c: (gst_lame_class_init): mark the xing-header + property as BROKEN (see + http://bugzilla.gnome.org/show_bug.cgi?id=330317#c19 for an + explanation why it's broken). + +2006-03-11 11:12:30 +0000 Christophe Fergeau + + added new element to add Xing headers to MP3 files (this allows decoder to figure out the length of VBR files) + Original commit message from CVS: + 2006-03-11 Christophe Fergeau + Reviewed by: Tim-Philipp Müller + * configure.ac: + * gst/xingheader/Makefile.am: + * gst/xingheader/gstxingmux.c: + * gst/xingheader/gstxingmux.h: added new element to add Xing headers + to MP3 files (this allows decoder to figure out the length of VBR + files) + +2006-03-07 11:19:55 +0000 Alex Lancaster + + ext/mad/gstid3tag.c: Add support for writing the GST_TAG_ALBUM_VOLUME_NUMBER + Original commit message from CVS: + * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach): + Add support for writing the GST_TAG_ALBUM_VOLUME_NUMBER + tag (#333683, patch by: Alex Lancaster). + +2006-03-02 20:03:00 +0000 Wim Taymans + + ext/amrnb/: Further fancyfication. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), + (gst_amrnbdec_setcaps), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_init), + (gst_amrnbenc_setcaps), (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbenc.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_query): + Further fancyfication. + Use _take to get writable data from the adapter. + Precalc packet duration. + Handle disconts. + Forward _push to upstream. + Post error messages when something goes wrong. + Remove old code in amrnbparse. + Don't ignore query results from upstream. + +2006-03-02 18:45:40 +0000 Michael Smith + + ext/amrnb/amrnbenc.c: The AMR encoder writes into the audio buffers it processes, so use gst_buffer_make_writable() o... + Original commit message from CVS: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_chain): + The AMR encoder writes into the audio buffers it processes, so + use gst_buffer_make_writable() on buffers we might (they go through + an adapter, so there can be copying going on later anyway) be + encoding. + +2006-03-01 12:35:09 +0000 Jens Granseuer + + gst/mpegstream/gstmpegparse.c: Declare variables at the beginning of a block and make + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_pad_added), + (gst_mpeg_parse_handle_src_query): + Declare variables at the beginning of a block and make + gcc-2.9x happy (fixes #328957; patch by: Jens Granseuer). + +2006-03-01 09:55:49 +0000 Fabrizio + + gst/asfdemux/gstasfdemux.c: Read packet size, sequence and padsize in right order again + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_data): + Read packet size, sequence and padsize in right order again + (fixes #332796; patch by: Fabrizio Gennari). + +2006-02-28 13:50:02 +0000 Edward Hervey + + gst/iec958/ac3iec.c: Set a proper klass (Codec/Muxer/Audio) for the ElementDetails. + Original commit message from CVS: + * gst/iec958/ac3iec.c: + Set a proper klass (Codec/Muxer/Audio) for the ElementDetails. + +2006-02-27 18:37:47 +0000 Jan Schmidt + + configure.ac: Make the id3tag and mad checks check for both a header and the appropriate library if the pkg-config is... + Original commit message from CVS: + * configure.ac: + Make the id3tag and mad checks check for both a header and the + appropriate library if the pkg-config is missing. (Closes #331842) + Split the id3tag and mad checks into 2 pieces. Sometime soon I might + do the same for the plugins themselves. + +2006-02-27 14:49:05 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.*: Don't treat STATE_INVALID as fatal error; throw an error only after five consecutive deco... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_reset), (gst_mpeg2dec_chain): + * ext/mpeg2dec/gstmpeg2dec.h: + Don't treat STATE_INVALID as fatal error; throw an error + only after five consecutive decoding errors. Makes decoding + mpeg streams more robust and fixes playback of joined clips + (#300682). + +2006-02-26 22:33:33 +0000 Tim-Philipp Müller + + ext/dvdnav/dvdnavsrc.h: Oops. forgot to add this one. + Original commit message from CVS: + * ext/dvdnav/dvdnavsrc.h: + Oops. forgot to add this one. + +2006-02-26 21:25:01 +0000 Julien Moutte + + ext/Makefile.am: Fix dist-check. + Original commit message from CVS: + 2006-02-26 Julien MOUTTE + * ext/Makefile.am: Fix dist-check. + +2006-02-26 18:01:15 +0000 Tim-Philipp Müller + + configure.ac: Disable dvdnavsrc for now. + Original commit message from CVS: + * configure.ac: + Disable dvdnavsrc for now. + +2006-02-26 17:55:05 +0000 Tim-Philipp Müller + + dvdnavsrc ported to 0.10, for the most part at least. Not quite ready for prime time yet though. + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/dvdnav/Makefile.am: + * ext/dvdnav/dvdnavsrc.c: (gst_dvd_nav_src_base_init), + (gst_dvd_nav_src_class_init), (gst_dvd_nav_src_check_get_range), + (gst_dvd_nav_src_init), (gst_dvd_nav_src_finalize), + (gst_dvd_nav_src_is_open), (gst_dvd_nav_src_set_property), + (gst_dvd_nav_src_get_property), (gst_dvd_nav_src_set_clock), + (gst_dvd_nav_src_tca_seek), (gst_dvd_nav_src_update_streaminfo), + (gst_dvd_nav_src_set_domain), (gst_dvd_nav_src_update_highlight), + (gst_dvd_nav_src_user_op), (dvdnav_get_event_name), + (dvdnav_get_read_domain_name), (gst_dvd_nav_src_print_event), + (gst_dvd_nav_src_make_dvd_event), + (gst_dvd_nav_src_structure_set_uint64), + (gst_dvd_nav_src_push_dvd_nav_packet_event), + (gst_dvd_nav_src_push_clut_change_event), (read_vts_info), + (gst_dvd_nav_src_push_titlelang_event), + (gst_dvd_nav_src_process_next_block), (gst_dvd_nav_src_create), + (gst_dvd_nav_src_start), (gst_dvd_nav_src_stop), + (gst_dvd_nav_src_handle_navigation_event), + (gst_dvd_nav_src_handle_seek_event), (gst_dvd_nav_src_src_event), + (gst_dvd_nav_src_query_position), (gst_dvd_nav_src_query_duration), + (gst_dvd_nav_src_query), (gst_dvd_nav_src_uri_get_type), + (gst_dvd_nav_src_uri_get_protocols), (gst_dvd_nav_src_uri_get_uri), + (gst_dvd_nav_src_uri_set_uri), (gst_dvd_nav_src_uri_handler_init), + (gst_dvd_nav_src_do_init), (plugin_init): + dvdnavsrc ported to 0.10, for the most part at least. Not quite + ready for prime time yet though. + +2006-02-23 20:08:58 +0000 Tim-Philipp Müller + + ext/cdio/Makefile.am: Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be required for Cygwin, see #317048) + Original commit message from CVS: + * ext/cdio/Makefile.am: + Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be + required for Cygwin, see #317048) + * gst/rtp/gstasteriskh263.c: + Cygwin has includes for both the unix network socket API + and the windows API, but only one can be included, so fix + includes to only use one or the other, prefering the unxi + one (#317048). + +2006-02-22 14:54:54 +0000 Tim-Philipp Müller + + Port dvdsubdec to 0.10 + Original commit message from CVS: + * configure.ac: + * gst/dvdsub/Makefile.am: + * gst/dvdsub/gstdvdsubdec.c: (gst_dvd_sub_dec_base_init), + (gst_dvd_sub_dec_class_init), (gst_dvd_sub_dec_init), + (gst_dvd_sub_dec_finalize), (gst_dvd_sub_dec_src_event), + (gst_dvd_sub_dec_get_event_delay), (gst_dvd_sub_dec_parse_subpic), + (gst_get_nibble), (gst_setup_palette), (gst_get_rle_code), + (gst_draw_rle_line), (gst_dvd_sub_dec_merge_title), + (gst_send_empty_fill), (gst_send_subtitle_frame), + (gst_dvd_sub_dec_advance_time), (gst_dvd_sub_dec_chain), + (gst_dvd_sub_dec_sink_event), (gst_dvd_sub_dec_handle_dvd_event), + (plugin_init): + * gst/dvdsub/gstdvdsubdec.h: + Port dvdsubdec to 0.10 + +2006-02-21 16:24:10 +0000 Jan Schmidt + + gst/mpegstream/gstdvddemux.c: Push the rank up to SECONDARY+1 so that dvddemux is preferred over mpegdemux for MPEG-2... + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_plugin_init): + Push the rank up to SECONDARY+1 so that dvddemux is preferred over + mpegdemux for MPEG-2 video streams. + +2006-02-20 19:16:10 +0000 Jan Schmidt + + configure.ac: Bump nano back to CVS + Original commit message from CVS: + * configure.ac: + Bump nano back to CVS + +=== release 0.10.2 === + +2006-02-20 19:13:54 +0000 Jan Schmidt + + configure.ac: releasing 0.10.2, "Season to Taste" + Original commit message from CVS: + * configure.ac: + releasing 0.10.2, "Season to Taste" + +2006-02-19 23:45:34 +0000 Jan Schmidt + + configure.ac: releasing 0.10.1.3 prelease for 0.10.2 + Original commit message from CVS: + * configure.ac: + releasing 0.10.1.3 prelease for 0.10.2 + +2006-02-17 17:58:44 +0000 Tim-Philipp Müller + + gst/asfdemux/gstasfdemux.c: In sink event handler, release object lock again _before_ sending EOS event downstream (#... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_sink_event): + In sink event handler, release object lock again + _before_ sending EOS event downstream (#313838). + +2006-02-17 17:54:37 +0000 Christian Schaller + + * ChangeLog: + * gst/asfdemux/gstasf.c: + fix rank of asfdemux + Original commit message from CVS: + fix rank of asfdemux + +2006-02-17 15:08:28 +0000 Jan Schmidt + + configure.ac: releasing 0.10.1.2 prelease for 0.10.2 + Original commit message from CVS: + * configure.ac: + releasing 0.10.1.2 prelease for 0.10.2 + +2006-02-17 15:02:30 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + latest updates + Original commit message from CVS: + latest updates + +2006-02-17 11:51:12 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: When we need to crop the output buffer, make sure we create a buffer of the right size an... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (crop_copy_i420_buffer), + (crop_copy_i422_buffer), (crop_buffer): + When we need to crop the output buffer, make sure we + create a buffer of the right size and respect the implicit + striding used for I420 elsewhere in GStreamer (#331301). + +2006-02-17 11:19:34 +0000 Tim-Philipp Müller + + ext/cdio/gstcdio.c: Init debug category (#331253). + Original commit message from CVS: + * ext/cdio/gstcdio.c: (plugin_init): + Init debug category (#331253). + +2006-02-17 10:24:56 +0000 Edward Hervey + + gst/asfdemux/gstasfdemux.c: Do not error out on non-recognized streams. Ignore them and allow playback of the other s... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_stream): + Do not error out on non-recognized streams. Ignore them and allow + playback of the other streams. + +2006-02-17 10:10:40 +0000 Jan Schmidt + + gst/dvdlpcmdec/gstdvdlpcmdec.c: Add a small sanity check for LPCM reading. + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain_dvd): + Add a small sanity check for LPCM reading. + +2006-02-17 09:54:43 +0000 Edward Hervey + + gst/asfdemux/gstasfdemux.c: Take into account the file properties preroll value for timestamping/newsegment. It's wei... + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_file): + Take into account the file properties preroll value for + timestamping/newsegment. It's weird this value was commented out. + +2006-02-16 17:57:59 +0000 Wim Taymans + + gst/asfdemux/Makefile.am: More asf makefile fixing. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + More asf makefile fixing. + +2006-02-16 17:16:06 +0000 Wim Taymans + + ext/lame/gstlame.c: Fix up lame a bit. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain), + (gst_lame_change_state): + Fix up lame a bit. + Apply patch #319782 by Gautier Portet. + +2006-02-16 11:14:11 +0000 Edward Hervey + + gst/asfdemux/Makefile.am: But we do need to link against the riff libraryr. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + But we do need to link against the riff libraryr. + +2006-02-16 11:08:51 +0000 Edward Hervey + + gst/asfdemux/Makefile.am: We don't want asfmux.c yet. + Original commit message from CVS: + * gst/asfdemux/Makefile.am: + We don't want asfmux.c yet. + +2006-02-16 09:50:43 +0000 Jon Trowbridge + + ext/mad/gstmad.c: Port fixes for bugs 314771, 308772, 140237, and 302625 + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_init), (scale), (gst_mad_update_info), + (gst_mad_sink_event), (gst_mad_check_caps_reset), (gst_mad_chain), + (gst_mad_change_state): + Port fixes for bugs 314771, 308772, 140237, and 302625 + from 0.8 (Patch by Jonathan Matthew, Fixes #329575) + Use GST_EVENT_FLUSH_STOP to clear data from the current input + buffer, to avoid using it for any future decoding. + +2006-02-15 15:48:07 +0000 Tim-Philipp Müller + + asfdemux ported to 0.10. Does still need a bit of work (seems like there's something funky going on when timestamping... + Original commit message from CVS: + * configure.ac: + * gst/asfdemux/asfheaders.c: (gst_asf_identify_guid), + (gst_asf_get_guid_nick): + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_class_init), (gst_asf_demux_init), + (gst_asf_demux_sink_event), (gst_asf_demux_handle_seek_event), + (gst_asf_demux_handle_src_event), + (gst_asf_demux_get_current_offset), (gst_asf_demux_chain), + (gst_asf_demux_skip_bytes), (gst_asf_demux_identify_guid), + (gst_asf_demux_get_uint8), (gst_asf_demux_get_uint16), + (gst_asf_demux_get_uint32), (gst_asf_demux_get_uint64), + (gst_asf_demux_get_var_length), (gst_asf_demux_get_buffer), + (gst_asf_demux_get_bytes), (gst_asf_demux_get_string), + (gst_asf_demux_get_guid), (gst_asf_demux_get_obj_file), + (gst_asf_demux_get_bitrate_record), + (gst_asf_demux_get_obj_comment), (gst_asf_demux_get_obj_header), + (gst_asf_demux_get_obj_header_ext), (gst_asf_demux_get_obj_stream), + (gst_asf_demux_get_replicated_data), (gst_asf_demux_get_obj_data), + (gst_asf_demux_get_obj_data_correction), + (gst_asf_demux_get_stream_audio), + (gst_asf_demux_get_stream_correction), + (gst_asf_demux_get_stream_video), + (gst_asf_demux_get_stream_video_format), + (gst_asf_demux_get_stream), (gst_asf_demux_setup_pad), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream), + (gst_asf_demux_process_stream), + (gst_asf_demux_get_gst_tag_from_tag_name), + (gst_asf_demux_commit_taglist), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_get_object_header), (gst_asf_demux_process_data), + (gst_asf_demux_process_header), (gst_asf_demux_process_file), + (gst_asf_demux_process_comment), + (gst_asf_demux_process_bitrate_props_object), + (gst_asf_demux_process_header_ext), (gst_asf_demux_process_object), + (gst_asf_demux_descramble_segment), + (gst_asf_demux_element_send_event), + (gst_asf_demux_send_event_unlocked), (gst_asf_demux_push_buffer), + (gst_asf_demux_process_chunk), (gst_asf_demux_process_segment), + (gst_asf_demux_handle_data), (gst_asf_demux_parse_data), + (gst_asf_demux_get_src_query_types), + (gst_asf_demux_handle_src_query), (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + asfdemux ported to 0.10. Does still need a bit of work (seems like + there's something funky going on when timestamping video frames). + The seeking code is likely to make Wim cry, but hey, at least it + compiles. + +2006-02-15 10:18:39 +0000 Wim Taymans + + ext/amrnb/amrnbdec.c: Some more comments. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_setcaps), + (gst_amrnbdec_chain), (gst_amrnbdec_state_change): + Some more comments. + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), (handle_slice): + Applied patch from Fabrizio Gennari, fixes #330844. + +2006-02-14 14:57:18 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.*: Let's try to play the title the user set via the URI handler or via properties instead of a... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_init), + (gst_dvd_read_src_class_init), (gst_dvd_read_src_start), + (gst_dvd_read_src_stop), (gst_dvd_read_src_goto_title), + (gst_dvd_read_src_set_property), (gst_dvd_read_src_get_property), + (gst_dvd_read_src_uri_get_uri), (gst_dvd_read_src_uri_set_uri): + * ext/dvdread/dvdreadsrc.h: + Let's try to play the title the user set via the URI handler or + via properties instead of always playing the first title. Also, + Also, count title/chapter/angle number in URI and properties + from 1 rather than 0. + +2006-02-13 14:09:26 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Don't implement GstBaseSrc::get_size or GstBaseSrc::is_seekable, otherwise GstBaseSrc will ... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_class_init), + (gst_dvd_read_src_get_size), (gst_dvd_read_src_do_seek), + (gst_dvd_read_src_do_duration_query): + Don't implement GstBaseSrc::get_size or GstBaseSrc::is_seekable, + otherwise GstBaseSrc will think we can operate pull_range based, + which we don't really, and typefinding will fail miserably. + Also, make seeking work somewhat (only works with flumpegdemux + at the moment, mpegstream needs fixing for that first). + +2006-02-13 14:00:35 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Only allocate buffer once we know exactly how much we need, rather than gratuitously alloca... + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_read), + (gst_dvd_read_src_create), (gst_dvd_read_src_src_event): + Only allocate buffer once we know exactly how much we need, + rather than gratuitously allocating 2MB-buffers all the time + even if we usually need much less than that. Also, demote + a debug message from DEBUG to LOG level. + +2006-02-10 12:40:54 +0000 Tim-Philipp Müller + + ext/dvdread/dvdreadsrc.c: Add some more debugging and fix duration query in BYTES. + Original commit message from CVS: + * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_class_init), + (gst_dvd_read_src_seekable), (gst_dvd_read_src_get_size), + (gst_dvd_read_src_do_seek), (gst_dvd_read_src_do_duration_query), + (gst_dvd_read_src_do_position_query): + Add some more debugging and fix duration query in BYTES. + +2006-02-09 17:27:57 +0000 Tim-Philipp Müller + + Half-baked port to 0.10. Needs some love in the seeking department, but at least it does something. + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/dvdread/Makefile.am: + * ext/dvdread/dvdreadsrc.c: + * ext/dvdread/dvdreadsrc.h: + Half-baked port to 0.10. Needs some love + in the seeking department, but at least + it does something. + * ext/dvdread/stream_labels.c: + * ext/dvdread/stream_labels.h: + Remove these (we use ISO-639 language codes internally; applications + that want to translate those into language names for display to the + user should rely on the iso-codes package for that). + +2006-02-06 15:55:28 +0000 Wim Taymans + + ext/amrnb/amrnbdec.*: Fix amrnbdec, handle events, take copy from adapter since the decoder apparently writes in the ... + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), + (gst_amrnbdec_setcaps), (gst_amrnbdec_event), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + Fix amrnbdec, handle events, take copy from adapter since the decoder + apparently writes in the source data. + Use some _scale_int, and precalc duration. + Fix some leaks, post ERROR messages. + +2006-02-06 11:34:23 +0000 Tim-Philipp Müller + + docs/plugins/: Add cdio plugin to docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-cdio.xml: + Add cdio plugin to docs. + * ext/cdio/gstcdiocddasrc.c: + Add gtk-doc blurb. + * ext/cdio/gstcdio.c: + The plugin is called 'cdio' not 'cddio'. + +2006-02-04 15:22:02 +0000 Tim-Philipp Müller + + gst/realmedia/rmdemux.c: One source pad not being linked is not an error condition when we're still parsing the heade... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + One source pad not being linked is not an error condition when we're + still parsing the header. In this case (e.g. where we don't have a + suitable decoder installed) just pretend everything is fine, so that + the demuxer will actually go on to signal no-more-pads when done + parsing the header, otherwise decodebin/playbin will never post the + appropriate error message if decoders are not available. + +2006-02-03 18:24:54 +0000 Edgard Lima + + * ChangeLog: + * common: + * ext/mad/gstid3tag.c: + * gst/realmedia/rmdemux.c: + Just make it compile with --disable-gst-debug. + Original commit message from CVS: + Just make it compile with --disable-gst-debug. + +2006-01-31 22:03:30 +0000 Radoslaw Szkodzinski + + ext/mad/gstmad.c: Merge patch from Radoslaw Szkodzinski (bug 326734) + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_convert_src), (scale), + (gst_mad_check_caps_reset), (gst_mad_chain): + Merge patch from Radoslaw Szkodzinski (bug 326734) + +2006-01-30 22:00:18 +0000 Stefan Kost + + ext/mad/gstid3tag.c: fixing Gdate handling enabling mux/demux mode switching adding better debug output + Original commit message from CVS: + * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach), + (gst_id3_tag_get_tag_to_render), (gst_id3_tag_sink_event), + (gst_id3_tag_src_link), (gst_id3_tag_send_tag_event), + (gst_id3_tag_chain): + fixing Gdate handling + enabling mux/demux mode switching + adding better debug output + +2006-01-30 18:57:45 +0000 Tim-Philipp Müller + + gst/mpegstream/gstmpegparse.c: If we haven't set caps on a source pad yet, the caps on the pad are NULL, not un-fixed... + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_buffer): + If we haven't set caps on a source pad yet, the caps on the + pad are NULL, not un-fixed. Set caps on outgoing buffers. + +2006-01-23 18:37:16 +0000 Tim-Philipp Müller + + ext/lame/gstlame.*: Contrary to what the const char in the lame API might suggest, lame expects us to keep the string... + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_finalize), (gst_lame_class_init), + (gst_lame_init), (add_one_tag), (gst_lame_set_metadata): + * ext/lame/gstlame.h: + Contrary to what the const char in the lame API might suggest, + lame expects us to keep the strings we pass to id3tag_set_foo() + around; it doesn't free them either though, so we have to store + them somewhere and free them later when we can be sure lame + doesn't need them any longer. + +2006-01-23 15:02:04 +0000 Tim-Philipp Müller + + ext/lame/gstlame.c: don't pass an uninitialised string pointer to lame if we don't know how to handle the tag type, a... + Original commit message from CVS: + * ext/lame/gstlame.c: (add_one_tag): + Fix handling of GST_TAG_DATE (#311679), don't pass an + uninitialised string pointer to lame if we don't know + how to handle the tag type, and fix minor memory leak. + +2006-01-23 10:15:27 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Fix debug message. + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_chain): + Fix debug message. + +2006-01-22 12:00:46 +0000 Martin Soto + + gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_process_event): Erase spurious call to gst_segment_set_newsegment. + Original commit message from CVS: + 2006-01-22 Martin Soto + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_process_event): + Erase spurious call to gst_segment_set_newsegment. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_process_event): Call + the superclass method when handling NEWSEGMENT events. + (gst_dvd_demux_handle_dvd_event): Get rid of dvd-audio-shutdown + and dvd-audio-restart event handling. There are currently less + hackish ways of handling the sparse audio stream problem. + +2006-01-20 14:18:20 +0000 Thomas Vander Stichele + + fix up error domains, error strings, and use of translation + Original commit message from CVS: + 2006-01-20 Thomas Vander Stichele + * ext/dvdnav/dvdnavsrc.c: (if): + * ext/dvdread/stream_labels.c: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment): + * gst/realmedia/rmdemux.c: (gst_rmdemux_loop): + fix up error domains, error strings, and use of translation + * po/POTFILES.in: + fix up this file, even though none of them are actually marked + for build yet. + +2006-01-19 21:32:05 +0000 Martin Soto + + gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_reset) (gst_mpeg_... + Original commit message from CVS: + 2006-01-19 Martin Soto + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_reset) + (gst_mpeg_parse_process_event, gst_mpeg_parse_parse_packhead) + (gst_mpeg_parse_change_state): + Make timestamp adjustment somewhat milder. Actual timestamps are + now sent unmodified unless an actual gap is found in the + stream. This should fix time display when playing most MPEG + files. + +2006-01-19 00:10:51 +0000 Tim-Philipp Müller + + ext/cdio/: Fix build for libcdio versions >= 76; give slightly lower rank than cdparanoia. + Original commit message from CVS: + * ext/cdio/gstcdio.c: (gst_cdio_add_cdtext_field), (plugin_init): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_get_cdtext): + Fix build for libcdio versions >= 76; give slightly lower rank + than cdparanoia. + +2006-01-18 19:30:36 +0000 Tim-Philipp Müller + + Port libcdio cdda source, formerly known as cddasrc, now known as cdiocddasrc (fixes #323327). Should also read CD-TE... + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/cdio/Makefile.am: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + Port libcdio cdda source, formerly known as cddasrc, now known as + cdiocddasrc (fixes #323327). Should also read CD-TEXT if available, + but that's not tested (fixes #317658). + +2006-01-18 09:30:00 +0000 Edward Hervey + + gst/mpegstream/gstmpegdemux.c: tss tss... always set caps on outgoing buffer. + Original commit message from CVS: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + tss tss... always set caps on outgoing buffer. + +2006-01-17 14:16:52 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + update spec file + Original commit message from CVS: + update spec file + +2006-01-13 19:30:31 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.10.1 === + +2006-01-13 19:25:42 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + releasing 0.10.1 + Original commit message from CVS: + releasing 0.10.1 + +2006-01-11 11:44:02 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + prerelease + Original commit message from CVS: + prerelease + +2006-01-10 11:43:37 +0000 Tim-Philipp Müller + + Pass unhandled queries upstream (useful e.g. for SEEKING query) + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_query): + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): + * ext/mad/gstmad.c: (gst_mad_src_query): + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_src_query): + * ext/sidplay/gstsiddec.cc: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_query): + * gst/realmedia/rmdemux.c: (gst_rmdemux_src_query): + Pass unhandled queries upstream (useful e.g. for SEEKING query) + (fixes #325652; based on patch by: Philippe); make rmdemux return + FALSE for position queries, instead of setting -1 as value and + returning TRUE. + +2006-01-05 21:36:49 +0000 Martin Soto + + gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_adjust_ts) + Original commit message from CVS: + 2006-01-05 Martin Soto + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_adjust_ts) + (gst_mpeg_parse_process_event, gst_mpeg_parse_pad_added): Don't + rewrite timestamps in the case segments are being set from + upstream, but use timestamps unmodified. Also send proper position + values. This allows for correct time display and makes queries + work in sink elements. + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_init) + (gst_dvd_demux_handle_dvd_event, gst_dvd_demux_send_subbuffer): + Rename flush_filter to segment_filter, which is better represents + what the arreibute does. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_process_event): + Activate segment filtering when a timestamp discontinuity is seen. + +2006-01-04 15:17:15 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Don't forget that we need to send out a newsegment event after a restart even if we don't have enou... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_chain): + Don't forget that we need to send out a newsegment event after a + restart even if we don't have enough data to decode a frame right + now. + +2005-12-30 23:51:46 +0000 Martin Soto + + gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event): Use the new "audio-shutdown" and "audio-restart" DVD e... + Original commit message from CVS: + 2005-12-31 Martin Soto + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event): + Use the new "audio-shutdown" and "audio-restart" DVD events + instead of the "spu-still-frame" event to shutdown and restart + the audio pipeline. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_adjust_ts): + Check for cases where the segment-based adjustment calculation + would produce negative values (which result in an overflow) and + return GST_CLOCK_TIME_NONE instead. + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_init) + (gst_dvd_demux_process_event, gst_dvd_demux_send_subbuffer): + Add a mechanism to discard audio buffers with timestamps outside + the currently set segment. This was causing (sometimes serious) + synchronization problems after seeking in DVDs with LPCM audio, + since VOBUs usually contain audio material that lies outside the + timestamp range specified by the header. + +2005-12-30 16:25:05 +0000 Jan Schmidt + + ext/mad/gstid3tag.c: Remove lingering reference to GstID3Demux + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_id3_tag_get_type): + Remove lingering reference to GstID3Demux + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_pes): + Don't output debug saying padding streams are unknown type, + because they're not + +2005-12-27 19:06:08 +0000 Martin Soto + + gst/mpegstream/gstdvddemux.c (AUDIO_CAPS) + Original commit message from CVS: + 2005-12-27 Martin Soto + * gst/mpegstream/gstdvddemux.c (AUDIO_CAPS) + (gst_dvd_demux_get_audio_stream): Use audio/x-lpcm as mimetype for + LPCM. + * gstmpegdemux.h: + * gstmpegdemux.c (gst_mpeg_demux_get_video_stream) + (gst_mpeg_demux_get_audio_stream): + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_get_video_stream) + (gst_dvd_demux_get_audio_stream) + (gst_dvd_demux_get_subpicture_stream) + (gst_dvd_demux_send_subbuffer): + Send current* pad buffers with appropriate caps. + +2005-12-26 17:48:32 +0000 Martin Soto + + gst/iec958/ac3iec.*: (NORMAL_CAPS_DEF, RAW_AUDIO_CAPS_DEF, ac3iec_class_init) + Original commit message from CVS: + 2005-12-26 Martin Soto + * gst/iec958/ac3iec.h: + * gst/iec958/ac3iec.c: + (NORMAL_CAPS_DEF, RAW_AUDIO_CAPS_DEF, ac3iec_class_init) + (ac3iec_init, ac3iec_set_property, ac3iec_get_property): Add a + raw-audio property to ac3iec958 that allows setting the source pad + caps to raw audio instead of audio/x-iec958. This makes it + possible to use ac3iec958 together with the normal alsasink + element to drive an external receiver that autodetects AC3 + content. + +2005-12-23 15:48:04 +0000 Michael Smith + + gst/iec958/ac3iec.*: Accept audio/x-ac3 and audio/ac3 to ac3iec958 element. + Original commit message from CVS: + * gst/iec958/ac3iec.c: (ac3iec_init), (ac3iec_setcaps), + (ac3iec_chain_dvd): + * gst/iec958/ac3iec.h: + Accept audio/x-ac3 and audio/ac3 to ac3iec958 element. + +2005-12-21 10:25:34 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: When getting a seek event, first check if the upstream element can handle it and only do ... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_src_event): + When getting a seek event, first check if the upstream element + can handle it and only do our own seek stuff when it can't + (should fix #322856). + +2005-12-21 09:58:43 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Really convert to BYTES format when we want to convert to bytes (use right variable; fixe... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * ext/mpeg2dec/gstmpeg2dec.c: (normal_seek): + Really convert to BYTES format when we want to convert + to bytes (use right variable; fixes #322856). + +2005-12-19 17:26:47 +0000 Martin Soto + + Big mpegparse clean up, second round: + Original commit message from CVS: + 2005-12-19 Martin Soto + Big mpegparse clean up, second round: + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event): + Send and EOS event down the audio pipeline when an still frame + event arrives. This prevents the pipeline from locking when a + still menu comes directly after a flush. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_reset): + Don't send a newsegment in reset. + (gst_mpeg_parse_adjust_ts): Check for invalid timestamps. + (gst_mpeg_parse_handle_newsegment, gst_mpeg_parse_process_event): + Move the code of handle_newsegment to process_event. Send a + NEWSEGMENT after FLUSH_STOP. + (gst_mpeg_parse_change_state): Send a NEWSEGMENT right after + moving to PAUSED. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_send_event) + (gst_mpeg_demux_class_init): Don't override send_event. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_init) + (gst_mpeg_demux_send_event, gst_mpeg_demux_send_subbuffer) + (gst_mpeg_demux_reset): + * gst/mpegstream/gstmpegdemux.h: Get rid of just_flushed + attribute. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_process_event): + Reset the mpegparse element after a flush. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_handle_newsegment): + Don't forward events. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_process_event): + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): + handle_newsegment is not a virtual method anymore. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_send_newsegment) + (gst_mpeg_parse_reset, gst_mpeg_parse_class_init): + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): Get + rid of send_newsegment virtual method. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_process_event): Only + handle DVD events and call the superclass method for other event + types. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_send_event): Don't + override process_event anymore. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_event) + (gst_mpeg_parse_process_event): Move actual event processing to + process event so that subclasses can properly override or extend + it. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): + Eliminate time parameter in process event. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_init) + (gst_mpeg_demux_parse_packet, gst_mpeg_demux_parse_pes) + (gst_mpeg_demux_send_subbuffer): + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init) + (gst_mpeg_parse_parse_packhead, gst_mpeg_parse_event) + (gst_mpeg_parse_chain): Use the new adjust_ts method instead of + adding the value of the adjust attribute. + * gst/mpegstream/gstmpegdemux.h (struct _GstMPEGVideoStream): Get + rid of the adjust attribute. Now all timestamp adjustments are + performed by mpegparse using the current segment. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_adjust_ts) + (gst_mpeg_parse_class_init): Implement the adjust_ts method based + on the adjust attribute for SCR values and the current segment. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): New + adjust_ts virtual method to adjust timestamps for outgoing + buffers. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_send_newsegment) + (gst_mpeg_demux_parse_packet): Don't override send_newsegment. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_class_init) + (gst_dvd_demux_handle_newsegment): Don't override + handle_newsegment. + (gst_dvd_demux_process_event, gst_dvd_demux_handle_dvd_event): + Check for DVD events in process_event instead of + handle_dvd_event. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_handle_newsegment) + (gst_mpeg_parse_send_newsegment, gst_mpeg_parse_send_event): + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_process_event) + (gst_mpeg_demux_send_event): + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_process_event) + (gst_dvd_demux_handle_dvd_event): + Eliminate the time parameter in send_event. + +2005-12-18 15:08:15 +0000 Jan Schmidt + + ext/mad/gstid3tag.c: Fix typefinding in id3demux, and then remove it in favour of the new LGPL id3demux in gst-plugin... + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_id3_tag_do_typefind), + (gst_id3_tag_do_caps_nego), (gst_id3_tag_chain), (plugin_init): + Fix typefinding in id3demux, and then remove it in favour + of the new LGPL id3demux in gst-plugins-good + * ext/mad/gstmad.c: (gst_mad_dispose): + dispose can run more than once. + +2005-12-16 21:56:32 +0000 Stefan Kost + + gst/asfdemux/gstasfmux.c: change some char* into char[] + Original commit message from CVS: + * gst/asfdemux/gstasfmux.c: (gst_asfmux_file_start): + change some char* into char[] + +2005-12-15 17:06:10 +0000 Edward Hervey + + gst/realmedia/rmdemux.c: Remove memleak from unused GstRMDemuxStream + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + Remove memleak from unused GstRMDemuxStream + +2005-12-12 19:17:11 +0000 Michael Smith + + ext/mad/gstid3tag.c: Use the correct function to free typefind factory list. + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), + (gst_id3_tag_do_typefind): + Use the correct function to free typefind factory list. + +2005-12-09 18:38:53 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: For position and duration queries in TIME format, try the peer first (might be a demuxer). + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_src_query): + For position and duration queries in TIME format, try the peer + first (might be a demuxer). + +2005-12-08 12:45:09 +0000 Martin Soto + + gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_newsegment): Properly handle non contiguous VOBUs by adding the se... + Original commit message from CVS: + 2005-12-08 Martin Soto + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_newsegment): + Properly handle non contiguous VOBUs by adding the segment accum + field to the adjust value. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_class_init) + (gst_dvd_demux_init, gst_dvd_demux_handle_newsegment): Extend + handle_newsegment to prevent sending actual newsegment events and + use tiemstamp rewriting instead. + (gst_dvd_demux_handle_dvd_event): Don't send a newsegment after + dvd-lang-codes. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_handle_newsegment) + (gst_mpeg_parse_event): + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParseClass): + Add a new parameter to handle_newsegment to allow controlling + whether newsegment events are forwarded or not. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_init) + (gst_dvd_demux_handle_dvd_event, gst_dvd_demux_send_subbuffer) + (gst_dvd_demux_reset): + last_end_ptm and discont_time aren't necessary anymore, since + timestamp adjustment is now replaced by newsegment events. + (gst_dvd_demux_init): Prevent MPEGParse from adjusting + timestamps. + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event): + Don't handle dvd-nav-packet events anymore, since the are now + replaced by standard newsegment events. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_init) + (gst_dvd_demux_handle_dvd_event, gst_dvd_demux_send_subbuffer) + (gst_dvd_demux_change_state): + * gst/mpegstream/gstdvddemux.h: + Get rid of the ignore_next_newmedia_discont hack. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_class_init) + (gst_dvd_demux_handle_newsegment): + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_class_init) + (gst_mpeg_demux_handle_newsegment): Don't override + handle_newsegment anymore. It was only necessary to handle + NEWMEDIA events. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_process_event) + (gst_dvd_demux_handle_dvd_event, gst_dvd_demux_set_cur_audio) + (gst_dvd_demux_set_cur_subpicture): + Reactivate handling of DVD events. + * gst/mpegstream/gstmpegparse.c (normal_seek) + (gst_mpeg_parse_handle_src_event) + (gst_mpeg_parse_handle_src_query): + First attempt at reenabling seek. + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_init) + (gst_mpeg_parse_update_streaminfo) + (gst_mpeg_parse_get_rate) + (gst_mpeg_parse_convert, gst_mpeg_parse_get_src_query_types) + (gst_mpeg_parse_handle_src_query): + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_new_output_pad): + Make queries work again. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_reset) + (gst_mpeg_parse_handle_newsegment) + (gst_mpeg_parse_send_newsegment, gst_mpeg_parse_pad_added) + (gst_mpeg_parse_chain, gst_mpeg_parse_handle_src_event): + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): + Get rid of the newsegment_pending attribute, and rely instead on + proper timestamp adjustment. + * gst/mpegstream/gstmpegparse.c + (gst_mpeg_parse_get_src_event_masks): Erase. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_init): + Initialize fields before creating pads to prevent the pad creation + callback from failing. + (gst_mpeg_parse_reset): Initialize new fields, and change + initialization order to match the order in the structure. + (gst_mpeg_parse_handle_newsegment): Forward new segment events + whenever possible, and update the current segment. + (gst_mpeg_parse_send_newsegment): Update the current segment and + pending_newsegment. + (gst_mpeg_parse_pad_added): Use the current segment to send + newsegment events to new pads. + (gst_mpeg_parse_chain): Properly add adjust time to sent buffers + and events. Properly update newsegment_pending. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): + New fields do_adjust and current_segment. + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegparse.h: + Rename handle_discont virtual method to handle_newsegment. Erase + some (already commented out support) for old NEW_MEDIA events. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_init) + (gst_mpeg_parse_reset, gst_mpeg_parse_handle_discont) + (gst_mpeg_parse_pad_added, gst_mpeg_parse_parse_packhead) + (gst_mpeg_parse_event, gst_mpeg_parse_chain): + Erase the "pending_scr" field, and replace it by a slightly + different handling of the current SCR. Document code blocks in + parse_packhead and chain. + +2005-12-07 11:50:10 +0000 Edward Hervey + + ext/mad/gstid3tag.c: g_warning() are only for really fatal warnings. If we can't decode a tag, just ignore that tag a... + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + g_warning() are only for really fatal warnings. If we can't decode a + tag, just ignore that tag and do a GST_WARNING. + +2005-12-06 19:48:07 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/a52dec/gsta52dec.h: + * ext/dvdread/dvdreadsrc.h: + * ext/lame/gstlame.h: + * ext/mad/gstid3tag.c: + * ext/mad/gstmad.c: + * ext/mad/gstmad.h: + * ext/mpeg2dec/gstmpeg2dec.h: + * ext/sidplay/gstsiddec.h: + * gst/ac3parse/gstac3parse.c: + * gst/ac3parse/gstac3parse.h: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfdemux.h: + * gst/iec958/ac3iec.h: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegaudioparse/gstmpegaudioparse.h: + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegclock.h: + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstrfc2250enc.c: + * gst/mpegstream/gstrfc2250enc.h: + * gst/realmedia/rmdemux.c: + * gst/realmedia/rmdemux.h: + * gst/synaesthesia/synaescope.c: + expand tabs + Original commit message from CVS: + expand tabs + +2005-12-05 18:12:24 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.10.0 === + +2005-12-05 18:04:06 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + releasing 0.10.0 + Original commit message from CVS: + releasing 0.10.0 + +2005-12-05 13:03:40 +0000 Andy Wingo + + Update for alloc_buffer changes. + Original commit message from CVS: + 2005-12-05 Andy Wingo + * ext/a52dec/gsta52dec.c: (gst_a52dec_push): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer): + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain_raw): + * gst/iec958/ac3iec.c: (ac3iec_chain_raw): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), + (gst_rmdemux_parse_packet): Update for alloc_buffer changes. + +2005-12-05 09:33:32 +0000 Andy Wingo + + ext/mad/gstid3tag.c (plugin_init): Remove id3tag -- there's just id3demux and id3mux now. Fixes #323199. + Original commit message from CVS: + 2005-12-05 Andy Wingo + * ext/mad/gstid3tag.c (plugin_init): Remove id3tag -- there's just + id3demux and id3mux now. Fixes #323199. + +2005-12-04 22:36:51 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + update spec file for latest changes + Original commit message from CVS: + update spec file for latest changes + +2005-12-02 12:28:03 +0000 Thomas Vander Stichele + + fix silly Makefile.am bug so they link correctly again + Original commit message from CVS: + * ext/amrnb/Makefile.am: + * gst/realmedia/Makefile.am: + fix silly Makefile.am bug so they link correctly again + +2005-12-01 19:18:24 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.7 === + +2005-12-01 19:14:57 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + * docs/random/LICENSE: + * docs/random/PORTED_09: + releasing 0.9.7 + Original commit message from CVS: + releasing 0.9.7 + +2005-12-01 15:49:59 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * ext/amrnb/Makefile.am: + * gst/realmedia/Makefile.am: + Don't know how these escaped my eye before. Fix link flags. + Original commit message from CVS: + Don't know how these escaped my eye before. Fix link flags. + +2005-11-30 18:37:24 +0000 Thomas Vander Stichele + + * common: + * examples/Makefile.am: + * examples/capsfilter/Makefile.am: + * examples/capsfilter/capsfilter1.c: + * examples/gob/Makefile.am: + * examples/gob/gst-identity2.gob: + * examples/gstplay/.gitignore: + * examples/gstplay/Makefile.am: + * examples/gstplay/player.c: + * examples/indexing/.gitignore: + * examples/indexing/Makefile.am: + * examples/indexing/indexmpeg.c: + * examples/level/Makefile.am: + * examples/level/README: + * examples/level/demo.c: + * examples/level/plot.c: + * examples/stats/Makefile.am: + * examples/stats/mp2ogg.c: + * examples/switch/.gitignore: + * examples/switch/Makefile.am: + * examples/switch/switcher.c: + no examples + Original commit message from CVS: + no examples + +2005-11-29 11:26:35 +0000 Tim-Philipp Müller + + gst/mpegstream/: Ref events before sending them to multiple pads, after all gst_pad_send_event() takes ownership of e... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_event): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_newsegment), + (gst_mpeg_parse_send_event): + Ref events before sending them to multiple pads, after all + gst_pad_send_event() takes ownership of events. Don't leak + events that have not been handled (fixes #322745). + +2005-11-28 19:13:51 +0000 Martin Soto + + gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event) + Original commit message from CVS: + 2005-11-28 Martin Soto + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event) + (gst_dvd_demux_handle_dvd_event): Erase code to prevent mpegparse + from making timestamp adjustments. This will have to be re-added + in some form in the near future, but in order to do that, some nav + packet parsing will be necessary in mpegdemux. + * gst/mpegstream/gstmpegparse.h (struct _GstMPEGParse): + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_init) + (g_value_set_int, gst_mpeg_parse_set_property) + Get rid of do_adjust and use_adjust. Rename max_discont to + max_src_gap. + (gst_mpeg_parse_parse_packhead): When max_scr_gap has a value of + -1, no adjustment is made. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init): + Rename max_discont property to max_scr_gap. Erase "adjust" + property. + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_send_event): Don't + override send_event anymore, base class does the job. + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_send_event): + Base class now does most of the work. + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_send_event): + Generalize to forwarding the event to all source pads in the + element. + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init) + (gst_mpeg_parse_init, gst_mpeg_parse_set_clock) + (gst_mpeg_parse_chain, gst_mpeg_parse_get_property) + (gst_mpeg_parse_set_property): + Clock synchronization doesn't make sense anymore for a + demultiplexer. + +2005-11-28 18:54:09 +0000 Michael Smith + + gst/realmedia/rmdemux.c: Don't treat normal EOS as a fatal error. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_loop): + Don't treat normal EOS as a fatal error. + +2005-11-28 15:47:01 +0000 Edward Hervey + + ext/mad/gstmad.c: Proper warning statements, + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_chain): + Proper warning statements, + Don't error if the src pad isn't linked when pushing. + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_change_state): + Proper state_change, avoids borkage when going to READY + +2005-11-27 15:34:00 +0000 Thomas Vander Stichele + + * configure.ac: + * gst-libs/Makefile.am: + * gst-libs/README: + * gst-libs/ext/.gitignore: + * gst-libs/gst/media-info/.gitignore: + * gst-libs/gst/play/.gitignore: + * gst-libs/gst/play/play.h: + * gst-libs/gst/play/play.vcproj: + no need for an AS_LIBTOOL call + Original commit message from CVS: + no need for an AS_LIBTOOL call + +2005-11-27 14:34:34 +0000 Thomas Vander Stichele + + * Makefile.am: + * common: + * gst-plugins-ugly.spec.in: + add ACLOCAL_AMFLAGS; remove old stuff from spec changelog + Original commit message from CVS: + add ACLOCAL_AMFLAGS; remove old stuff from spec changelog + +2005-11-25 17:02:41 +0000 Jan Schmidt + + ext/mpeg2dec/gstmpeg2dec.c: Prime libmpeg2's pumps with some null custom buffers to ensure it doesn't ask us to disca... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (handle_sequence): + Prime libmpeg2's pumps with some null custom buffers + to ensure it doesn't ask us to discard garbage later yay. + +2005-11-25 17:01:46 +0000 Jan Schmidt + + ext/mpeg2dec/gstmpeg2dec.c: Prime libmpeg2's pumps with some null custom buffers to ensure it ask us to discard garba... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (handle_sequence): + Prime libmpeg2's pumps with some null custom buffers + to ensure it ask us to discard garbage later yay. + +2005-11-25 14:50:19 +0000 Michael Smith + + ext/a52dec/gsta52dec.*: Accept AC3 in audio/x-private1-ac3 format, which includes + Original commit message from CVS: + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), + (gst_a52dec_sink_setcaps), (gst_a52dec_chain), + (gst_a52dec_chain_raw): + * ext/a52dec/gsta52dec.h: + Accept AC3 in audio/x-private1-ac3 format, which includes + DVD-specific headers, as well as raw AC3, for compatibility with + some demuxers. + +2005-11-25 00:03:52 +0000 Jan Schmidt + + ext/mad/gstmad.c: When pad_alloc returns other-than-GST_FLOW_OK and mad exits early, skip frame synthesis and consume... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_chain): + When pad_alloc returns other-than-GST_FLOW_OK and mad exits early, + skip frame synthesis and consume input data as if we'd done the + decode. Makes mad not error when the src pad is not connected. + (#319784) + +2005-11-24 13:58:55 +0000 Martin Soto + + * ChangeLog: + Erase old CVS conflict line. + Original commit message from CVS: + Erase old CVS conflict line. + +2005-11-24 13:52:49 +0000 Martin Soto + + gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init) (gst_mpeg_parse_handle_discont, gst_mpeg_parse_send_newsegm... + Original commit message from CVS: + 2005-11-23 Martin Soto + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init) + (gst_mpeg_parse_handle_discont, gst_mpeg_parse_send_newsegment) + (gst_mpeg_parse_chain): + * gst/mpegstream/gstmpegdemux.c (gst_mpeg_demux_class_init) + (gst_mpeg_demux_send_newsegment): + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_send_subbuffer): + * gst/mpegstream/gstmpegparse.h: + Rename send_discont method to send_newsegment and add parameters + to handle actual segments. Adapt code all around to run with the + new name and signature. + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstdvddemux.c: + Convert to GST_BOILERPLATE. + +2005-11-24 12:23:04 +0000 Thomas Vander Stichele + + * configure.ac: + fix AS_LIBTOOL call + Original commit message from CVS: + fix AS_LIBTOOL call + +2005-11-23 21:26:35 +0000 Thomas Vander Stichele + + * Makefile.am: + add a torture target + Original commit message from CVS: + add a torture target + +2005-11-23 20:05:47 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.6 === + +2005-11-23 19:57:04 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + releasing 0.9.6 + Original commit message from CVS: + releasing 0.9.6 + +2005-11-23 00:26:42 +0000 Michael Smith + + gst/realmedia/rmdemux.c: Fractional framerates. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), + (gst_rmdemux_src_event), (gst_rmdemux_validate_offset), + (find_seek_offset_bytes), (find_seek_offset_time), + (gst_rmdemux_perform_seek), (gst_rmdemux_src_query), + (gst_rmdemux_loop), (gst_rmdemux_fourcc_isplausible), + (gst_rmdemux_chain), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_parse_packet): + Fractional framerates. + +2005-11-23 00:12:24 +0000 Jan Schmidt + + ext/mpeg2dec/gstmpeg2dec.*: Use fractional framerates + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (src_templ), + (gst_mpeg2dec_negotiate_format), (handle_sequence), + (gst_mpeg2dec_sink_event): + * ext/mpeg2dec/gstmpeg2dec.h: + Use fractional framerates + +2005-11-22 19:07:13 +0000 Wim Taymans + + gst/mpegstream/gstmpegparse.c: set_clock returns a boolean. + Original commit message from CVS: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_set_clock): + set_clock returns a boolean. + +2005-11-22 18:39:36 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Fix seeking even more by sending the newsegment event with the right parameters. Should fix queryin... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_chain): + Fix seeking even more by sending the newsegment event with the + right parameters. Should fix querying in playbin/totem after + a seek. + +2005-11-22 17:39:36 +0000 Tim-Philipp Müller + + ext/mad/gstmad.c: Fix seeking in stand-alone mode. Fix nonexistant enum value introduced in previous commit. Improve ... + Original commit message from CVS: + * ext/mad/gstmad.c: (gst_mad_mode_get_type), (gst_mad_src_query), + (normal_seek), (gst_mad_sink_event), (gst_mad_chain): + Fix seeking in stand-alone mode. Fix nonexistant enum value + introduced in previous commit. Improve debug messages here and + there. Actually return a proper return value in the sink event + handler. + +2005-11-22 17:15:25 +0000 Thomas Vander Stichele + + * ext/lame/gstlame.c: + doh + Original commit message from CVS: + doh + +2005-11-22 17:04:38 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + * ext/sidplay/gstsiddec.cc: + fix up GValueEnum + Original commit message from CVS: + fix up GValueEnum + +2005-11-22 12:39:29 +0000 Andy Wingo + + * ChangeLog: + * ext/lame/gstlame.c: + * ext/mad/gstid3tag.c: + * ext/sidplay/gstsiddec.cc: + Update for gst_tag_setter API changes. + Original commit message from CVS: + 2005-11-22 Andy Wingo + * Update for gst_tag_setter API changes. + +2005-11-22 11:55:32 +0000 Andy Wingo + + * ChangeLog: + * ext/a52dec/gsta52dec.c: + * ext/mad/gstid3tag.c: + * ext/mad/gstmad.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/realmedia/rmdemux.c: + ext/a52dec/gsta52dec.c (gst_a52dec_sink_event) ext/mad/gstid3tag.c (gst_id3_tag_sink_event) ext/mad/gstmad.c (gst_mad... + Original commit message from CVS: + 2005-11-22 Andy Wingo + * ext/a52dec/gsta52dec.c (gst_a52dec_sink_event) + * ext/mad/gstid3tag.c (gst_id3_tag_sink_event) + * ext/mad/gstmad.c (gst_mad_chain) + * gst/mpegaudioparse/gstmpegaudioparse.c + (gst_mp3parse_sink_event) + * gst/mpegstream/gstdvddemux.c (gst_dvd_demux_handle_dvd_event) + * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_handle_discont) + (gst_mpeg_parse_send_discont, gst_mpeg_parse_pad_added) + * gst/realmedia/rmdemux.c (gst_rmdemux_perform_seek) + (gst_rmdemux_chain, gst_rmdemux_add_stream): Run update-funcnames. + +2005-11-22 11:39:06 +0000 Tim-Philipp Müller + + ext/mad/Makefile.am: libgsttagedit => libgsttag + Original commit message from CVS: + * ext/mad/Makefile.am: + libgsttagedit => libgsttag + +2005-11-21 23:50:02 +0000 Edward Hervey + + ext/lame/gstlame.c: Don't take the stream lock + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_sink_event): + Don't take the stream lock + +2005-11-21 17:34:30 +0000 Andy Wingo + + ext/: Don't take the stream lock. + Original commit message from CVS: + 2005-11-21 Andy Wingo + * ext/sidplay/gstsiddec.cc (gst_siddec_sink_event): + * ext/mpeg2dec/gstmpeg2dec.c (gst_mpeg2dec_sink_event): + * ext/mad/gstmad.c (gst_mad_sink_event): + * ext/a52dec/gsta52dec.c (gst_a52dec_sink_event): Don't take the + stream lock. + * gst/realmedia/rmdemux.c (gst_rmdemux_perform_seek): Update for + stream lock changes. + +2005-11-21 16:36:44 +0000 Andy Wingo + + *.*: Ran scripts/update-macros. Oh yes. + Original commit message from CVS: + 2005-11-21 Andy Wingo + * *.h: + * *.c: Ran scripts/update-macros. Oh yes. + +2005-11-21 15:12:43 +0000 Tim-Philipp Müller + + gst/mpegstream/: Filler events have beem removed for now. + Original commit message from CVS: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_process_event): + Filler events have beem removed for now. + +2005-11-21 14:08:45 +0000 Tim-Philipp Müller + + gst/: Update for GST_FOURCC_FORMAT API change. + Original commit message from CVS: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_video_stream): + * gst/realmedia/rmdemux.c: (gst_rmdemux_chain), + (gst_rmdemux_add_stream), (gst_rmdemux_parse_mdpr): + Update for GST_FOURCC_FORMAT API change. + +2005-11-21 10:32:55 +0000 Edward Hervey + + gst/: Modifications for disapearance of GST_PAD_IS_USABLE() + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain_raw): + * gst/realmedia/rmdemux.c: (gst_rmdemux_chain), + (gst_rmdemux_add_stream), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_parse_packet): + Modifications for disapearance of GST_PAD_IS_USABLE() + +2005-11-18 16:14:00 +0000 Michael Smith + + gst/iec958/ac3iec.c: Remove some setcaps brokenness. + Original commit message from CVS: + * gst/iec958/ac3iec.c: (ac3iec_init), (ac3iec_chain_dvd): + Remove some setcaps brokenness. + Don't crash on bad input. + +2005-11-15 22:46:23 +0000 Johan Dahlin + + ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): unset GValues after calling transform. + Original commit message from CVS: + * ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): unset GValues after + calling transform. + (gst_id3_tag_do_typefind): Unref caps + * ext/mad/gstmad.c (gst_mad_check_caps_reset): Ditto + +2005-11-15 21:00:44 +0000 Johan Dahlin + + * ext/mad/gstmad.c: + remove accidentally commited hack + Original commit message from CVS: + remove accidentally commited hack + +2005-11-15 20:30:53 +0000 Johan Dahlin + + * ext/mad/gstmad.c: + free pad templates + Original commit message from CVS: + free pad templates + +2005-11-15 14:19:38 +0000 Tim-Philipp Müller + + ext/mpeg2dec/gstmpeg2dec.c: Set DELTA_UNIT flag on outgoing buffers if this is NOT a keyframe; nice-ify debug message... + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (handle_slice), + (gst_mpeg2dec_sink_event): + Set DELTA_UNIT flag on outgoing buffers if this is NOT a keyframe; + nice-ify debug message in event handler; add CHECKME. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event), + (gst_dvd_demux_send_event), (gst_dvd_demux_process_private), + (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset), + (gst_dvd_demux_sync_stream_to_time): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_process_event), (gst_mpeg_demux_send_event), + (gst_mpeg_demux_handle_discont), (gst_mpeg_demux_new_output_pad), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes), + (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_process_private), + (gst_mpeg_demux_sync_stream_to_time), + (gst_mpeg_demux_handle_src_event), (gst_mpeg_demux_reset): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), + (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_send_buffer), + (gst_mpeg_parse_process_event), (gst_mpeg_parse_send_discont), + (gst_mpeg_parse_send_event), (gst_mpeg_parse_event), + (gst_mpeg_parse_chain): + * gst/mpegstream/gstmpegparse.h: + Get rid of GST_PAD_IS_USABLE and fix GstFlowReturn vs. gboolean + return value confusion (gst_pad_push vs. gst_pad_send_event and + gst_pad_push_event); pass flow return values to caller; + miscellaneous fixes and clean-ups. + +2005-11-15 08:37:00 +0000 Christian Schaller + + * gst/mpegstream/gstdvddemux.c: + set rank to secondary until it works 100% + Original commit message from CVS: + set rank to secondary until it works 100% + +2005-11-15 07:59:58 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + add mpegstream plugin to spec file + Original commit message from CVS: + add mpegstream plugin to spec file + +2005-11-14 22:18:21 +0000 Martin Soto + + gst/mpegstream/Makefile.am (noinst_HEADERS): Add gstrfc2250enc.h. + Original commit message from CVS: + 2005-11-14 Martin Soto + * gst/mpegstream/Makefile.am (noinst_HEADERS): Add + gstrfc2250enc.h. + +2005-11-14 21:20:21 +0000 Josef Zlomek + + partially port the mpegstream plugin to GStreamer 0.9. + Original commit message from CVS: + 2005-11-14 Martin Soto + * configure.ac: + * gst/mpegstream/Makefile.am: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegpacketize.c: + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstmpegstream.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/mpegstream/gstrfc2250enc.h: + Applied patch from Josef Zlomek to + partially port the mpegstream plugin to GStreamer 0.9. + +2005-11-14 17:13:20 +0000 Andy Wingo + + configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better debugging, allows dll builds on windows. Fixes #316076. + Original commit message from CVS: + 2005-11-14 Andy Wingo + * configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better + debugging, allows dll builds on windows. Fixes #316076. + +2005-11-11 19:37:33 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to head + Original commit message from CVS: + back to head + +=== release 0.9.5 === + +2005-11-11 19:35:55 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * common: + * configure.ac: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + releasing 0.9.5 + Original commit message from CVS: + releasing 0.9.5 + +2005-10-27 21:50:11 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.c: Forward GstFlowReturn about everywhere. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_reset), + (gst_mpeg2dec_alloc_buffer), (gst_mpeg2dec_negotiate_format), + (handle_sequence), (handle_picture), (handle_slice), + (gst_mpeg2dec_chain), (gst_mpeg2dec_src_query), (normal_seek), + (gst_mpeg2dec_src_event), (gst_mpeg2dec_change_state): + Forward GstFlowReturn about everywhere. + Handle seeking correctly. + +2005-10-27 17:26:13 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.c: Small cleanups in refcounting. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format), + (handle_sequence), (handle_slice), (gst_mpeg2dec_chain), + (gst_mpeg2dec_src_query), (gst_mpeg2dec_change_state): + Small cleanups in refcounting. + +2005-10-26 16:45:04 +0000 Wim Taymans + + ext/mpeg2dec/gstmpeg2dec.*: Removed lots of dubious code. + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_dispose), (gst_mpeg2dec_reset), + (gst_mpeg2dec_alloc_buffer), (gst_mpeg2dec_negotiate_format), + (handle_sequence), (handle_picture): + * ext/mpeg2dec/gstmpeg2dec.h: + Removed lots of dubious code. + Handle flushing and seeking correctly. Still leaks though... + +2005-10-24 13:37:47 +0000 Christian Schaller + + * ChangeLog: + * configure.ac: + port plugins listing changes + Original commit message from CVS: + port plugins listing changes + +2005-10-23 23:06:09 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.4 === + +2005-10-23 22:44:44 +0000 Thomas Vander Stichele + + * ChangeLog: + * Makefile.am: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.signals: + * docs/plugins/inspect/plugin-a52dec.xml: + * docs/plugins/inspect/plugin-amrnb.xml: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpeg2dec.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + * gst/realmedia/rmdemux.c: + * po/POTFILES.in: + releasing 0.9.4 + Original commit message from CVS: + releasing 0.9.4 + +2005-10-23 14:32:49 +0000 Julien Moutte + + gst/realmedia/rmdemux.c: STOPPED->FAILED + Original commit message from CVS: + 2005-10-23 Julien MOUTTE + * gst/realmedia/rmdemux.c: (gst_rmdemux_loop): STOPPED->FAILED + +2005-10-21 16:22:00 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + add packaging of a52dec + Original commit message from CVS: + add packaging of a52dec + +2005-10-21 11:58:38 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: Set correct stream time in newsegment event. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_validate_offset), + (gst_rmdemux_perform_seek), (gst_rmdemux_src_query): + Set correct stream time in newsegment event. + +2005-10-20 22:43:04 +0000 Thomas Vander Stichele + + * ext/Makefile.am: + fix distcheck + Original commit message from CVS: + fix distcheck + +2005-10-20 22:40:07 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/Makefile.am: + fix distcheck + Original commit message from CVS: + fix distcheck + +2005-10-20 09:51:58 +0000 Tim-Philipp Müller + + ext/a52dec/: Re-enable CPU flags, use liboil to get them. + Original commit message from CVS: + * ext/a52dec/Makefile.am: + * ext/a52dec/gsta52dec.c: (gst_a52dec_base_init), + (gst_a52dec_class_init), (gst_a52dec_sink_event), + (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Re-enable CPU flags, use liboil to get them. + +2005-10-20 09:00:30 +0000 Tim-Philipp Müller + + Port AC3 decoder to 0.9 (#318849). + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * configure.ac: + * ext/a52dec/Makefile.am: + * ext/a52dec/gsta52dec.c: + * ext/a52dec/gsta52dec.h: + Port AC3 decoder to 0.9 (#318849). + +2005-10-20 08:30:33 +0000 Wim Taymans + + ext/sidplay/gstsiddec.cc: Small fixes and more error messages. + Original commit message from CVS: + * ext/sidplay/gstsiddec.cc: + Small fixes and more error messages. + +2005-10-19 16:01:35 +0000 Wim Taymans + + API change fixen. + Original commit message from CVS: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_query), + (gst_amrnbparse_state_change): + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): + * ext/mad/gstmad.c: (gst_mad_get_query_types), (gst_mad_src_query): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/sidplay/gstsiddec.cc: + * gst/realmedia/rmdemux.c: (gst_rmdemux_validate_offset), + (gst_rmdemux_src_query), (gst_rmdemux_src_query_types): + API change fixen. + +2005-10-19 12:43:28 +0000 Tim-Philipp Müller + + configure.ac: GST_DOC has been renamed to GST_DOCBOOK_CHECK + Original commit message from CVS: + * configure.ac: + GST_DOC has been renamed to GST_DOCBOOK_CHECK + +2005-10-19 09:47:31 +0000 Thomas Vander Stichele + + configure.ac: some docs I had + Original commit message from CVS: + * configure.ac: + some docs I had + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_chain): + trivial fixes + +2005-10-18 13:23:22 +0000 Wim Taymans + + gst/realmedia/rmdemux.c: segment-start/done API change. + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_validate_offset), + (gst_rmdemux_perform_seek): + segment-start/done API change. + +2005-10-17 17:50:45 +0000 Michael Smith + + * ChangeLog: + * common: + * gst/iec958/ac3iec.c: + Set buffer durations on IEC958 buffers. + Original commit message from CVS: + Set buffer durations on IEC958 buffers. + +2005-10-16 17:06:42 +0000 Tim-Philipp Müller + + configure.ac: Fix glib check + Original commit message from CVS: + * configure.ac: + Fix glib check + +2005-10-13 19:14:25 +0000 Tim-Philipp Müller + + ext/mad/gstid3tag.c: Fix handling of GST_TAG_DATE, which is now of type GST_TYPE_DATE. + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + Fix handling of GST_TAG_DATE, which is now of type GST_TYPE_DATE. + +2005-10-13 15:29:56 +0000 Stefan Kost + + examples/stats/mp2ogg.c: yes, typo fixes + Original commit message from CVS: + * examples/stats/mp2ogg.c: + yes, typo fixes + +2005-10-12 14:30:36 +0000 Stefan Kost + + renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition + Original commit message from CVS: + * examples/indexing/indexmpeg.c: (main): + * ext/a52dec/gsta52dec.c: (gst_a52dec_init): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_is_open), + (dvdnavsrc_set_property), (dvdnavsrc_open), (dvdnavsrc_close), + (dvdnavsrc_event), (dvdnavsrc_convert), (dvdnavsrc_query): + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_set_property), + (dvdreadsrc_srcpad_query), (dvdreadsrc_get), + (dvdreadsrc_open_file), (dvdreadsrc_close_file): + * ext/dvdread/dvdreadsrc.h: + * ext/lame/gstlame.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init): + * gst/asfdemux/gstasfmux.c: (gst_asfmux_init): + * gst/iec958/ac3iec.h: + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_init): + * gst/synaesthesia/gstsynaesthesia.c: (gst_synaesthesia_init): + renamed GST_FLAGS macros to GST_OBJECT_FLAGS + moved bitshift from macro to enum definition + +2005-10-11 16:37:16 +0000 Wim Taymans + + newsegment API update. + Original commit message from CVS: + * ext/mad/gstid3tag.c: (gst_id3_tag_sink_event): + * ext/mad/gstmad.c: (gst_mad_chain): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (gst_mp3parse_chain): + * gst/realmedia/rmdemux.c: (gst_rmdemux_perform_seek), + (gst_rmdemux_chain), (gst_rmdemux_add_stream): + newsegment API update. + +2005-10-06 13:14:38 +0000 Wim Taymans + + ext/amrnb/amrnbdec.c: Mark invalid frame sizes + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: + Mark invalid frame sizes + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): + UNUSABLE is not to be used here, just push out stuff so + probes can continue linking or making the pad usable. + +2005-10-05 11:25:51 +0000 Michael Smith + + * ChangeLog: + * gst/realmedia/rmdemux.c: + Improve seek error-resilience. + Original commit message from CVS: + Improve seek error-resilience. + Better error handling generally. + +2005-10-03 17:59:55 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to head + Original commit message from CVS: + back to head + +=== release 0.9.3 === + +2005-10-03 17:49:44 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * README: + * configure.ac: + * ext/sidplay/Makefile.am: + release time + Original commit message from CVS: + release time + +2005-09-30 16:43:12 +0000 Michael Smith + + * gst/realmedia/rmdemux.h: + Forgot to commit this file. I hate Nano. + Original commit message from CVS: + Forgot to commit this file. I hate Nano. + +2005-09-30 16:39:47 +0000 Michael Smith + + * ChangeLog: + * common: + * gst/realmedia/rmdemux.c: + Sanity checks and memory leak fixes for real demuxer + Original commit message from CVS: + Sanity checks and memory leak fixes for real demuxer + +2005-09-29 13:44:15 +0000 Michael Smith + + gst/realmedia/rmdemux.c: Real demuxer fixes. Make it more bulletproof against bad data, identify a few more stream ty... + Original commit message from CVS: + * gst/realmedia/rmdemux.c: (gst_rmdemux_src_event), + (gst_rmdemux_perform_seek), (gst_rmdemux_loop), + (gst_rmdemux_send_event), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_parse_packet): + Real demuxer fixes. Make it more bulletproof against bad data, + identify a few more stream types. + Fix seeking so that it works (at least with the seek example + program; it still fails with totem). + +2005-09-26 14:41:23 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.c: Set correct caps on buffers too. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_sink_event), (gst_mp3parse_chain): + Set correct caps on buffers too. + +2005-09-26 14:31:53 +0000 Wim Taymans + + gst/mpegaudioparse/gstmpegaudioparse.*: Put timestamps on buffers. + Original commit message from CVS: + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init), + (gst_mp3parse_sink_event), (gst_mp3parse_chain): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Put timestamps on buffers. + +2005-09-21 22:21:22 +0000 Flavio Oliveira + + * ChangeLog: + * ext/amrnb/amrnbenc.c: + Changed amrnbenc description, it is an encoder, not decoder. + Original commit message from CVS: + Changed amrnbenc description, it is an encoder, not decoder. + +2005-09-21 16:21:45 +0000 Michael Smith + + * ChangeLog: + * gst/iec958/ac3_padder.c: + * gst/iec958/ac3_padder.h: + * gst/iec958/ac3iec.c: + Various changes to AC3->IEC958 framer. Mostly to make our IEC958 headers and dump the frame (as a probable sync failu... + Original commit message from CVS: + Various changes to AC3->IEC958 framer. Mostly to make our IEC958 headers + more accurate, and to check AC3 checksums (both of them in each frame), + and dump the frame (as a probable sync failure) if they don't match. + General code cleanup, improved comments. Changed to not construct the + header backwards, and not byteswap everything else. If we end up needing + to do little-endian output, we should swap in the element doing the + output (AC3 is big-endian). + +2005-09-20 17:37:54 +0000 Christian Schaller + + * gst-plugins-ugly.spec.in: + fix spec file for ugly + Original commit message from CVS: + fix spec file for ugly + +2005-09-19 23:25:07 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-lame.xml: + revert empty commit + Original commit message from CVS: + revert empty commit + +2005-09-19 23:24:12 +0000 Thomas Vander Stichele + + * docs/plugins/scan.stamp: + whoops, wrong files + Original commit message from CVS: + whoops, wrong files + +2005-09-19 23:21:31 +0000 Thomas Vander Stichele + + docs/plugins/gst-plugins-ugly-plugins.*: commit missing files + Original commit message from CVS: + * docs/plugins/gst-plugins-ugly-plugins.args: + * docs/plugins/gst-plugins-ugly-plugins.hierarchy: + * docs/plugins/gst-plugins-ugly-plugins.interfaces: + * docs/plugins/gst-plugins-ugly-plugins.prerequisites: + commit missing files + * docs/plugins/inspect/plugin-lame.xml: + update + +2005-09-19 16:44:13 +0000 Thomas Vander Stichele + + * Makefile.am: + * common: + * gst-plugins-ugly.spec.in: + add check-valgrind target + Original commit message from CVS: + add check-valgrind target + +2005-09-19 13:46:35 +0000 Thomas Vander Stichele + + * docs/plugins/scanobj-build.stamp: + add stamp + Original commit message from CVS: + add stamp + +2005-09-19 11:07:40 +0000 Wim Taymans + + ext/lame/gstlame.c: Set caps on outgoing buffers. + Original commit message from CVS: + * ext/lame/gstlame.c: (gst_lame_chain): + Set caps on outgoing buffers. + +2005-09-16 16:04:28 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/lame/gstlame.c: + * ext/lame/gstlame.h: + clean up further so we don't try to set up five times for a simple pipeline + Original commit message from CVS: + clean up further so we don't try to set up five times for + a simple pipeline + +2005-09-16 15:43:08 +0000 Michael Smith + + * ChangeLog: + * common: + * gst/iec958/ac3iec.c: + Set setcaps function on sink pad, not source pad. Produce correct caps on output buffers. + Original commit message from CVS: + Set setcaps function on sink pad, not source pad. Produce correct caps + on output buffers. + +2005-09-11 17:53:12 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + update inspect with source + Original commit message from CVS: + update inspect with source + +2005-09-07 13:42:44 +0000 Stefan Kost + + ext/mad/gstid3tag.c: gsttaginterface.h -> gsttagsetter.h + Original commit message from CVS: + * ext/mad/gstid3tag.c: + gsttaginterface.h -> gsttagsetter.h + +2005-09-06 14:06:51 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.1 === + +2005-09-06 14:05:40 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * README: + * RELEASE: + * autogen.sh: + * configure.ac: + releasing 0.9.2 + Original commit message from CVS: + releasing 0.9.2 + +2005-09-06 12:00:33 +0000 Wim Taymans + + ext/amrnb/: State change function updates. + Original commit message from CVS: + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_state_change): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_state_change): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_state_change): + State change function updates. + +2005-09-05 17:24:20 +0000 Jan Schmidt + + ext/mpeg2dec/gstmpeg2dec.c: GST_CAT_SEEK disappeared from the public API at some point + Original commit message from CVS: + * ext/mpeg2dec/gstmpeg2dec.c: + GST_CAT_SEEK disappeared from the public API at some point + +2005-09-05 11:42:10 +0000 Thomas Vander Stichele + + * gst/iec958/ac3_padder.c: + * gst/iec958/ac3_padder.h: + doc fixes + Original commit message from CVS: + doc fixes + +2005-09-04 19:28:29 +0000 Thomas Vander Stichele + + * Makefile.am: + * autogen.sh: + * common: + * configure.ac: + * docs/plugins/gst-plugins-ugly-plugins-docs.sgml: + * docs/plugins/inspect-build.stamp: + * docs/plugins/inspect.stamp: + * docs/plugins/inspect/plugin-dvdlpcmdec.xml: + * docs/plugins/inspect/plugin-iec958.xml: + * docs/plugins/inspect/plugin-lame.xml: + * docs/plugins/inspect/plugin-mad.xml: + * docs/plugins/inspect/plugin-mpegaudioparse.xml: + * docs/plugins/inspect/plugin-rmdemux.xml: + docs for ugly plugins + Original commit message from CVS: + docs for ugly plugins + +2005-09-02 18:01:33 +0000 Thomas Vander Stichele + + * gst-plugins-ugly.spec.in: + * gst/iec958/Makefile.am: + build fixes + Original commit message from CVS: + build fixes + +2005-09-02 17:04:39 +0000 Michael Smith + + * ChangeLog: + * gst/iec958/ac3iec.c: + Accept audio/x-private1-a3c on sink pad + Original commit message from CVS: + Accept audio/x-private1-a3c on sink pad + +2005-09-02 17:01:14 +0000 Thomas Vander Stichele + + * gst-plugins-ugly.spec.in: + spec updates + Original commit message from CVS: + spec updates + +2005-09-02 15:43:54 +0000 Andy Wingo + + * examples/gstplay/player.c: + * examples/stats/mp2ogg.c: + * ext/a52dec/gsta52dec.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbparse.c: + * ext/dvdnav/dvdnavsrc.c: + * ext/dvdread/dvdreadsrc.c: + * ext/lame/gstlame.c: + * ext/mad/gstid3tag.c: + * ext/mad/gstmad.c: + * ext/mpeg2dec/gstmpeg2dec.c: + * gst/ac3parse/gstac3parse.c: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfmux.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/iec958/ac3iec.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegparse.c: + * gst/mpegstream/gstrfc2250enc.c: + * gst/realmedia/rmdemux.c: + * gst/synaesthesia/gstsynaesthesia.c: + All plugins updated for element state changes. + Original commit message from CVS: + 2005-09-02 Andy Wingo + * All plugins updated for element state changes. + +2005-09-02 14:19:17 +0000 Michael Smith + + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/iec958/ac3iec.c: + Fix return types in setcaps functions + Original commit message from CVS: + Fix return types in setcaps functions + +2005-09-02 13:37:13 +0000 Michael Smith + + * ChangeLog: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/iec958/ac3iec.c: + Changes to correctly use first_access parameter in ac3 and lpcm plugins. + Original commit message from CVS: + Changes to correctly use first_access parameter in ac3 and lpcm plugins. + Some general cleanups in iec958 framer. + +2005-09-01 21:07:34 +0000 Thomas Vander Stichele + + * common: + * m4/Makefile.am: + * m4/as-arts.m4: + * m4/esd.m4: + * m4/gst-alsa.m4: + * m4/gst-artsc.m4: + * m4/gst-matroska.m4: + * m4/ogg.m4: + * m4/vorbis.m4: + fix distcheck; remove some old m4s + Original commit message from CVS: + fix distcheck; remove some old m4s + +2005-09-01 17:31:21 +0000 Michael Smith + + * ChangeLog: + * configure.ac: + * gst/iec958/Makefile.am: + * gst/iec958/ac3_padder.c: + * gst/iec958/ac3_padder.h: + * gst/iec958/ac3iec.c: + * gst/iec958/ac3iec.h: + AC3 -> IEC958 (S/PDIF) framer, based on Martin Soto's 0.8 plugin + Original commit message from CVS: + AC3 -> IEC958 (S/PDIF) framer, based on Martin Soto's 0.8 plugin + +2005-09-01 11:52:34 +0000 Wim Taymans + + gst/dvdlpcmdec/gstdvdlpcmdec.c: Cleanups, fixed header parsing and stripping. + Original commit message from CVS: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_setcaps), + (gst_dvdlpcmdec_chain_dvd), (gst_dvdlpcmdec_chain_raw), + (gst_dvdlpcmdec_change_state): + Cleanups, fixed header parsing and stripping. + +2005-09-01 11:34:39 +0000 Michael Smith + + * ChangeLog: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + Use the right bytes when parsing the LPCM dvd header + Original commit message from CVS: + Use the right bytes when parsing the LPCM dvd header + +2005-09-01 11:16:15 +0000 Michael Smith + + * ChangeLog: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + Return the correct values from chain function + Original commit message from CVS: + Return the correct values from chain function + +2005-09-01 10:04:53 +0000 Thomas Vander Stichele + + * common: + * docs/Makefile.am: + * docs/plugins/.gitignore: + * docs/random/ChangeLog-0.8: + * docs/version.entities.in: + adding doc stuff + Original commit message from CVS: + adding doc stuff + +2005-08-31 19:37:08 +0000 Michael Smith + + * ChangeLog: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + Restructure LPCM decoder to not expect the demuxer to parse the LPCM header; instead do this internally. Also support... + Original commit message from CVS: + Restructure LPCM decoder to not expect the demuxer to parse the LPCM + header; instead do this internally. Also support the old way, using + a different mime-type. CVS: + +2001-12-17 18:37:01 +0000 Thomas Vander Stichele + + building up speed + Original commit message from CVS: + building up speed + diff --git a/MAINTAINERS b/MAINTAINERS new file mode 100644 index 0000000000..72aac8e79c --- /dev/null +++ b/MAINTAINERS @@ -0,0 +1,12 @@ +GStreamer is currently maintained by the consensus of a number +of people, including, but not limited to: + + Jan Schmidt + Wim Taymans + David Schleef + Tim-Philipp Müller + Sebastian Dröge + +Maintainer-related issues should be addressed to: + + gstreamer-devel@lists.freedesktop.org diff --git a/NEWS b/NEWS new file mode 100644 index 0000000000..0e581c39b8 --- /dev/null +++ b/NEWS @@ -0,0 +1,299 @@ +GStreamer 1.20 Release Notes + +GStreamer 1.20 has not been released yet. It is scheduled for release +around October/November 2021. + +1.19.x is the unstable development version that is being developed in +the git main branch and which will eventually result in 1.20, and 1.19.2 +is the current development release in that series + +It is expected that feature freeze will be in early October 2021, +followed by one or two 1.19.9x pre-releases and the new 1.20 stable +release around October/November 2021. + +1.20 will be backwards-compatible to the stable 1.18, 1.16, 1.14, 1.12, +1.10, 1.8, 1.6,, 1.4, 1.2 and 1.0 release series. + +See https://gstreamer.freedesktop.org/releases/1.20/ for the latest +version of this document. + +Last updated: Wednesday 22 September 2021, 18:00 UTC (log) + +Introduction + +The GStreamer team is proud to announce a new major feature release in +the stable 1.x API series of your favourite cross-platform multimedia +framework! + +As always, this release is again packed with many new features, bug +fixes and other improvements. + +Highlights + +- this section will be completed in due course + +Major new features and changes + +Noteworthy new features and API + +- this section will be filled in in due course + +New elements + +- this section will be filled in in due course + +New element features and additions + +- this section will be filled in in due course + +Plugin and library moves + +- this section will be filled in in due course + +- There were no plugin moves or library moves in this cycle. + +Plugin removals + +The following elements or plugins have been removed: + +- this section will be filled in in due course + +Miscellaneous API additions + +- this section will be filled in in due course + +Miscellaneous performance, latency and memory optimisations + +- this section will be filled in in due course + +Miscellaneous other changes and enhancements + +- this section will be filled in in due course + +Tracing framework and debugging improvements + +- this section will be filled in in due course + +Tools + +- this section will be filled in in due course + +GStreamer RTSP server + +- this section will be filled in in due course + +GStreamer VAAPI + +- this section will be filled in in due course + +GStreamer OMX + +- this section will be filled in in due course + +GStreamer Editing Services and NLE + +- this section will be filled in in due course + +GStreamer validate + +- this section will be filled in in due course + +GStreamer Python Bindings + +- this section will be filled in in due course + +GStreamer C# Bindings + +- this section will be filled in in due course + +GStreamer Rust Bindings and Rust Plugins + +The GStreamer Rust bindings are released separately with a different +release cadence that’s tied to gtk-rs, but the latest release has +already been updated for the upcoming new GStreamer 1.20 API. + +gst-plugins-rs, the module containing GStreamer plugins written in Rust, +has also seen lots of activity with many new elements and plugins. + +What follows is a list of elements and plugins available in +gst-plugins-rs, so people don’t miss out on all those potentially useful +elements that have no C equivalent. + +- FIXME: add new elements + +Rust audio plugins + +- audiornnoise: New element for audio denoising which implements the + noise removal algorithm of the Xiph RNNoise library, in Rust +- rsaudioecho: Port of the audioecho element from gst-plugins-good + rsaudioloudnorm: Live audio loudness normalization element based on + the FFmpeg af_loudnorm filter +- claxondec: FLAC lossless audio codec decoder element based on the + pure-Rust claxon implementation +- csoundfilter: Audio filter that can use any filter defined via the + Csound audio programming language +- lewtondec: Vorbis audio decoder element based on the pure-Rust + lewton implementation + +Rust video plugins + +- cdgdec/cdgparse: Decoder and parser for the CD+G video codec based + on a pure-Rust CD+G implementation, used for example by karaoke CDs +- cea608overlay: CEA-608 Closed Captions overlay element +- cea608tott: CEA-608 Closed Captions to timed-text (e.g. VTT or SRT + subtitles) converter +- tttocea608: CEA-608 Closed Captions from timed-text converter +- mccenc/mccparse: MacCaption Closed Caption format encoder and parser +- sccenc/sccparse: Scenarist Closed Caption format encoder and parser +- dav1dec: AV1 video decoder based on the dav1d decoder implementation + by the VLC project +- rav1enc: AV1 video encoder based on the fast and pure-Rust rav1e + encoder implementation +- rsflvdemux: Alternative to the flvdemux FLV demuxer element from + gst-plugins-good, not feature-equivalent yet +- rsgifenc/rspngenc: GIF/PNG encoder elements based on the pure-Rust + implementations by the image-rs project + +Rust text plugins + +- textwrap: Element for line-wrapping timed text (e.g. subtitles) for + better screen-fitting, including hyphenation support for some + languages + +Rust network plugins + +- reqwesthttpsrc: HTTP(S) source element based on the Rust + reqwest/hyper HTTP implementations and almost feature-equivalent + with the main GStreamer HTTP source souphttpsrc +- s3src/s3sink: Source/sink element for the Amazon S3 cloud storage +- awstranscriber: Live audio to timed text transcription element using + the Amazon AWS Transcribe API + +Generic Rust plugins + +- sodiumencrypter/sodiumdecrypter: Encryption/decryption element based + on libsodium/NaCl +- togglerecord: Recording element that allows to pause/resume + recordings easily and considers keyframe boundaries +- fallbackswitch/fallbacksrc: Elements for handling potentially + failing (network) sources, restarting them on errors/timeout and + showing a fallback stream instead +- threadshare: Set of elements that provide alternatives for various + existing GStreamer elements but allow to share the streaming threads + between each other to reduce the number of threads +- rsfilesrc/rsfilesink: File source/sink elements as replacements for + the existing filesrc/filesink elements + +Build and Dependencies + +- this section will be filled in in due course + +gst-build + +- this section will be filled in in due course + +Cerbero + +Cerbero is a meta build system used to build GStreamer plus dependencies +on platforms where dependencies are not readily available, such as +Windows, Android, iOS and macOS. + +General improvements + +- this section will be filled in in due course + +macOS / iOS + +- this section will be filled in in due course + +Windows + +- this section will be filled in in due course + +Windows MSI installer + +- this section will be filled in in due course + +Linux + +- this section will be filled in in due course + +Android + +- this section will be filled in in due course + +Platform-specific changes and improvements + +Android + +- this section will be filled in in due course + +macOS and iOS + +- this section will be filled in in due course + +Windows + +- this section will be filled in in due course + +Linux + +- this section will be filled in in due course + +Documentation improvements + +- this section will be filled in in due course + +Possibly Breaking Changes + +- this section will be filled in in due course +- MPEG-TS SCTE-35 API changes (FIXME: flesh out) +- gst_parse_launch() and friends now error out on non-existing + properties on top-level bins where they would silently fail and + ignore those before. + +Known Issues + +- this section will be filled in in due course + +- There are a couple of known WebRTC-related regressions/blockers: + + - webrtc: DTLS setup with Chrome is broken + - webrtcbin: First keyframe is usually lost + +Contributors + +- this section will be filled in in due course + +… and many others who have contributed bug reports, translations, sent +suggestions or helped testing. + +Stable 1.20 branch + +After the 1.20.0 release there will be several 1.20.x bug-fix releases +which will contain bug fixes which have been deemed suitable for a +stable branch, but no new features or intrusive changes will be added to +a bug-fix release usually. The 1.20.x bug-fix releases will be made from +the git 1.20 branch, which will be a stable branch. + +1.20.0 + +1.20.0 is scheduled to be released around October/November 2021. + +Schedule for 1.22 + +Our next major feature release will be 1.22, and 1.21 will be the +unstable development version leading up to the stable 1.22 release. The +development of 1.21/1.22 will happen in the git main branch. + +The plan for the 1.22 development cycle is yet to be confirmed. + +1.22 will be backwards-compatible to the stable 1.20, 1.18, 1.16, 1.14, +1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. + +------------------------------------------------------------------------ + +These release notes have been prepared by Tim-Philipp Müller with +contributions from … + +License: CC BY-SA 4.0 diff --git a/README b/README new file mode 100644 index 0000000000..c95e53e28d --- /dev/null +++ b/README @@ -0,0 +1,252 @@ +GStreamer 1.19.x development series + +WHAT IT IS +---------- + +This is GStreamer, a framework for streaming media. + +WHERE TO START +-------------- + +We have a website at + + https://gstreamer.freedesktop.org + +Our documentation, including tutorials, API reference and FAQ can be found at + + https://gstreamer.freedesktop.org/documentation/ + +You can subscribe to our mailing lists: + + https://lists.freedesktop.org/mailman/listinfo/gstreamer-announce + + https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel + +We track bugs, feature requests and merge requests (patches) in GitLab at + + https://gitlab.freedesktop.org/gstreamer/ + +You can join us on IRC - #gstreamer on irc.freenode.org + +GStreamer 1.0 series +-------------------- + +Starring + + GSTREAMER + +The core around which all other modules revolve. Base functionality and +libraries, some essential elements, documentation, and testing. + + BASE + +A well-groomed and well-maintained collection of GStreamer plug-ins and +elements, spanning the range of possible types of elements one would want +to write for GStreamer. + +And introducing, for the first time ever, on the development screen ... + + THE GOOD + + --- "Such ingratitude. After all the times I've saved your life." + +A collection of plug-ins you'd want to have right next to you on the +battlefield. Shooting sharp and making no mistakes, these plug-ins have it +all: good looks, good code, and good licensing. Documented and dressed up +in tests. If you're looking for a role model to base your own plug-in on, +here it is. + +If you find a plot hole or a badly lip-synced line of code in them, +let us know - it is a matter of honour for us to ensure Blondie doesn't look +like he's been walking 100 miles through the desert without water. + + THE UGLY + + --- "When you have to shoot, shoot. Don't talk." + +There are times when the world needs a color between black and white. +Quality code to match the good's, but two-timing, backstabbing and ready to +sell your freedom down the river. These plug-ins might have a patent noose +around their neck, or a lock-up license, or any other problem that makes you +think twice about shipping them. + +We don't call them ugly because we like them less. Does a mother love her +son less because he's not as pretty as the other ones ? No - she commends +him on his great personality. These plug-ins are the life of the party. +And we'll still step in and set them straight if you report any unacceptable +behaviour - because there are two kinds of people in the world, my friend: +those with a rope around their neck and the people who do the cutting. + + THE BAD + + --- "That an accusation?" + +No perfectly groomed moustache or any amount of fine clothing is going to +cover up the truth - these plug-ins are Bad with a capital B. +They look fine on the outside, and might even appear to get the job done, but +at the end of the day they're a black sheep. Without a golden-haired angel +to watch over them, they'll probably land in an unmarked grave at the final +showdown. + +Don't bug us about their quality - exercise your Free Software rights, +patch up the offender and send us the patch on the fastest steed you can +steal from the Confederates. Because you see, in this world, there's two +kinds of people, my friend: those with loaded guns and those who dig. +You dig. + +The Lowdown +----------- + + --- "I've never seen so many plug-ins wasted so badly." + +GStreamer Plug-ins has grown so big that it's hard to separate the wheat from +the chaff. Also, distributors have brought up issues about the legal status +of some of the plug-ins we ship. To remedy this, we've divided the previous +set of available plug-ins into four modules: + +- gst-plugins-base: a small and fixed set of plug-ins, covering a wide range + of possible types of elements; these are continuously kept up-to-date + with any core changes during the development series. + + - We believe distributors can safely ship these plug-ins. + - People writing elements should base their code on these elements. + - These elements come with examples, documentation, and regression tests. + +- gst-plugins-good: a set of plug-ins that we consider to have good quality + code, correct functionality, our preferred license (LGPL for the plug-in + code, LGPL or LGPL-compatible for the supporting library). + + - We believe distributors can safely ship these plug-ins. + - People writing elements should base their code on these elements. + +- gst-plugins-ugly: a set of plug-ins that have good quality and correct + functionality, but distributing them might pose problems. The license + on either the plug-ins or the supporting libraries might not be how we'd + like. The code might be widely known to present patent problems. + + - Distributors should check if they want/can ship these plug-ins. + - People writing elements should base their code on these elements. + +- gst-plugins-bad: a set of plug-ins that aren't up to par compared to the + rest. They might be close to being good quality, but they're missing + something - be it a good code review, some documentation, a set of tests, + a real live maintainer, or some actual wide use. + If the blanks are filled in they might be upgraded to become part of + either gst-plugins-good or gst-plugins-ugly, depending on the other factors. + + - If the plug-ins break, you can't complain - instead, you can fix the + problem and send us a patch, or bribe someone into fixing them for you. + - New contributors can start here for things to work on. + +PLATFORMS +--------- + +- Linux is of course fully supported +- FreeBSD is reported to work; other BSDs should work too; same for Solaris +- MacOS works, binary 1.x packages can be built using the cerbero build tool +- Windows works; binary 1.x packages can be built using the cerbero build tool + - MSys/MinGW builds + - Microsoft Visual Studio builds are also available and supported +- Android works, binary 1.x packages can be built using the cerbero build tool +- iOS works + +INSTALLING FROM PACKAGES +------------------------ + +You should always prefer installing from packages first. GStreamer is +well-maintained for a number of distributions, including Fedora, Debian, +Ubuntu, Mandrake, Arch Linux, Gentoo, ... + +Only in cases where you: + + - want to hack on GStreamer + - want to verify that a bug has been fixed + - do not have a sane distribution + +should you choose to build from source tarballs or git. + +Find more information about the various packages at + + https://gstreamer.freedesktop.org/download/ + +COMPILING FROM SOURCE TARBALLS +------------------------------ + +- again, make sure that you really need to install from source! + If GStreamer is one of your first projects ever that you build from source, + consider taking on an easier project. + +- you need a recent version of Meson installed, see + + http://mesonbuild.com/Getting-meson.html + + and + + https://gitlab.freedesktop.org/gstreamer/gst-build/blob/master/README.md + +- run + + meson build + ninja -C build + + to build GStreamer. + +- if you want to install it (not required, but what you usually want to do), run + + ninja -C build install + +- try out a simple test: + gst-launch-1.0 -v fakesrc num_buffers=5 ! fakesink + (If you didn't install GStreamer, run `./build/tools/gst-launch-1.0`) + + If it outputs a bunch of messages from fakesrc and fakesink, everything is + ok. + + If it did not work, keep in mind that you might need to adjust the + PATH and/or LD_LIBRARY_PATH environment variables to make the system + find GStreamer in the prefix where you installed (by default that is /usr/local). + +- After this, you're ready to install gst-plugins, which will provide the + functionality you're probably looking for by now, so go on and read + that README. + +COMPILING FROM GIT +------------------ + +You can build an uninstalled GStreamer from git for development or testing +purposes without affecting your system installation. + +Get started with: + + git clone https://gitlab.freedesktop.org/gstreamer/gst-build + meson build + ninja -C build + ninja -C build uninstalled + +For more information, see the `gst-build` module and its documentation: + + https://gitlab.freedesktop.org/gstreamer/gst-build/blob/master/README.md + + +PLUG-IN DEPENDENCIES AND LICENSES +--------------------------------- + +GStreamer is developed under the terms of the LGPL (see COPYING file for +details). Some of our plug-ins however rely on libraries which are available +under other licenses. This means that if you are distributing an application +which has a non-GPL compatible license (for instance a closed-source +application) with GStreamer, you have to make sure not to distribute GPL-linked +plug-ins. + +When using GPL-linked plug-ins, GStreamer is for all practical reasons +under the GPL itself. + +HISTORY +------- + +The fundamental design comes from the video pipeline at Oregon Graduate +Institute, as well as some ideas from DirectMedia. It's based on plug-ins that +will provide the various codec and other functionality. The interface +hopefully is generic enough for various companies (ahem, Apple) to release +binary codecs for Linux, until such time as they get a clue and release the +source. diff --git a/README.static-linking b/README.static-linking new file mode 100644 index 0000000000..6d8299be5e --- /dev/null +++ b/README.static-linking @@ -0,0 +1,174 @@ +================================= + GStreamer Static Linking README +================================= + +DRAFT, April 2013 + + + I. INTRODUCTION + +It is possible to link GStreamer libraries, plugins and applications +statically, both in case of free/libre/open-source software applications +and proprietary applications. On some platforms static linking may even +be required. + +However, distributing statically linked binaries using GStreamer usually +requires additional effort to stay compliant with the GNU LGPL v2.1 license. + +The purpose of this document is to draw attention to this fact, and to +summarise in layman's terms what we believe is required from anyone +distributing statically linked GStreamer binaries. Most of this also +applies to dynamically linked GStreamer binaries. + + + II. DISCLAIMER + +This document is not legal advice, nor is it comprehensive. It may use +words in ways that do not match the definition or use in the license +text. It may even be outright wrong. Read the license text for all the +details, it is the only legally binding document in this respect. + +This document is primarily concerned with the implications for the +distribution of binaries based on LGPL-licensed software as imposed by +the LGPL license, but there may be other restrictions to the distribution +of such binaries, such as terms and conditions of distribution channels +(e.g. "app stores"). + + + III. THE SPIRIT OF THE LGPL LICENSE + +The GNU LGPL v2.1 license allows use of such-licensed software by +proprietary applications, but still aims to ensure that at least the +LGPL-licensed software parts remain free under all circumstances. This +means any changes to LGPL-licensed source code must be documented and +be made available on request to those who received binaries of the +software. It also means that it must be possible to make changes to the +LGPL-licensed software parts and make the application use those, as far +as that is possible. And that recipients of an application using +LGPL-licensed software are made aware of their rights according to the +LGPL license. + +In an environment where GStreamer libraries and plugins are used as +dynamically-loaded shared objects (DLL/.so/.dyn files), this is usually +not a big problem, because it is fairly easy to compile a modified version +of the GStreamer libraries or LGPL plugins, and the application will/should +just pick up and use the modified version automatically. All that is needed +is for the original, LGPL-licensed source code and source code modifications +to be made available, and for a way to build the libraries or plugins for +the platform required (usually that will be using the build system scripts +that come with GStreamer, and using the typical build environment on the +system in question, but where that is not the case the needed build scripts +and/or tools would need to be provided as well). + + + IV. THINGS YOU NEED TO DO + + * You must tell users of your application that you are using LGPL-licensed + software, which LGPL-licensed software exactly, and you must provide them + with a copy of the license so they know their rights under the LGPL. + + * You must provide (on request) all the source code and all the changes + or additions you have made to the LGPL-licensed software you are using. + + For GStreamer code we would recommend that the changes be provided either + in form of a branch in a git repository, or as a set of "git format-patch"- + style patches against a GStreamer release or a snapshot of a GStreamer git + repository. The patches should ideally say what was changed and why it + was changed, and there should ideally be separate patches for independent + changes. + + * You must provide a way for users of your application to make changes to + the LGPL-licensed parts of the code, and re-create a full application + binary with the changes (using the standard toolchain and tools of the + target platform; if you are using a custom toolchain or custom tools + you must provide these and document how to use them to create a new + application binary). + + Note that this of course does not mean that the user is allowed to + re-distribute the changed application. Nor does it mean that you have + to provide your proprietary source code - it is sufficient to provide a + ready-made compiled object file that can be relinked into an application + binary with the re-compiled LGPL components. + + + V. THINGS TO LOOK OUT FOR + +While most GStreamer plugins and the libraries they depend on are licensed +under the LGPL or even more permissive licenses, that is not the case for +all plugins and libraries used, esp. those in the gst-plugins-ugly or +some of those in the gst-plugins-bad set of plugins. + +When statically linking proprietary code, care must be taken not to +statically link plugins or libraries that are licensed under less permissive +terms than the LGPL, such as e.g. GPL-licensed libraries. + + + VI. SPECIAL CONSIDERATIONS FOR SPECIFIC USE-CASES + + + 1. Proprietary GStreamer/GLib-based Application On iOS + +Let's assume an individual or a company wants to distribute a proprietary +iOS application that is built on top of GStreamer and GLib through +Apple's App Store. At the time of writing the Apple iPhone developer +agreement didn’t allow the bundling of shared libraries, so distributing +a proprietary iOS application with shared libraries is only possible using +distribution mechanisms outside of the App Store and/or only to jailbroken +devices, a prospect that may not appeal to our individual or company. So the +only alternative then is to link everything statically, which means the +obligations mentioned above come into play. + + + 2. Example: Jabber on iOS + +Tandberg (now Cisco) created a Jabber application for iOS, based on GStreamer. +On request they provided an LGPL compliance bundle in form of a zip file, with +roughly the following contents: + +buildapp.sh +readme.txt +Jabber/Jabber-Info.plist +Jabber/libip.a [236MB binary with proprietary code] +Jabber/main.mm +Jabber/xcconfig/Application.xcconfig +Jabber/xcconfig/Debug.xcconfig +Jabber/xcconfig/Release.xcconfig +Jabber/xcconfig/Shared.xcconfig +Jabber/Resources/*.lproj/Localizable.strings +Jabber/Resources/{Images,Audio,Sounds,IB,Message Styles,Emoticons,Fonts}/* +Jabber/Resources/* +Jabber.xcodeproj/project.pbxproj +Jabber.xcodeproj/project.xcworkspace/contents.xcworkspacedata +opensource/build/config.site +opensource/build/m4/movi.m4 +opensource/build/scripts/clean-deps.sh +opensource/build/scripts/fixup-makefile.sh +opensource/build/scripts/MoviMaker.py +opensource/build.sh +opensource/env.sh +opensource/Makefile +opensource/external/glib/* +opensource/external/gstreamer/{gstreamer,gst-plugins-*}/* +opensource/external/openssl/* +opensource/external/proxy-libintl/* +opensource/toolchain/darwin-x86/bin/{misc autotoools,m4,glib-mkenums,glib-genmarshal,libtool,pkg-config,etc.} +opensource/toolchain/darwin-x86/share/{aclocal,aclocal-1.11,autoconf,automake-1.11,libtool}/* +opensource/toolchain/darwin-x86/share/Config.pm +opensource/toolchain/darwin-x86/share/Config.pm.movi.in +patches/glib/glib.patch +patches/gst-plugins-bad/gst-plugins-bad.patch +patches/gst-plugins-base/gst-plugins-base.patch +patches/gst-plugins-good/gst-plugins-good.patch +patches/gstreamer/gstreamer.patch +patches/openssl/openssl.patch + +readme.txt starts with "This Readme file describes how to build the Cisco +Jabber for iPad application. You need to install Xcode, but the final package +is built by running buildapp.sh." and describes how to build project, +prerequisites, the procedure in detail, and a "How to Include Provisioning +Profile Manually / Alternate Code Signing Instructions" section. + + + 3. Random Links Which May Be Of Interest + +[0] http://multinc.com/2009/08/24/compatibility-between-the-iphone-app-store-and-the-lgpl/ diff --git a/RELEASE b/RELEASE new file mode 100644 index 0000000000..cef054a611 --- /dev/null +++ b/RELEASE @@ -0,0 +1,96 @@ +This is GStreamer gst-plugins-ugly 1.19.2. + +GStreamer 1.19 is the development branch leading up to the next major +stable version which will be 1.20. + +The 1.19 development series adds new features on top of the 1.18 series and is +part of the API and ABI-stable 1.x release series of the GStreamer multimedia +framework. + +Full release notes will one day be found at: + + https://gstreamer.freedesktop.org/releases/1.20/ + +Binaries for Android, iOS, Mac OS X and Windows will usually be provided +shortly after the release. + +This module will not be very useful by itself and should be used in conjunction +with other GStreamer modules for a complete multimedia experience. + + - gstreamer: provides the core GStreamer libraries and some generic plugins + + - gst-plugins-base: a basic set of well-supported plugins and additional + media-specific GStreamer helper libraries for audio, + video, rtsp, rtp, tags, OpenGL, etc. + + - gst-plugins-good: a set of well-supported plugins under our preferred + license + + - gst-plugins-ugly: a set of well-supported plugins which might pose + problems for distributors + + - gst-plugins-bad: a set of plugins of varying quality that have not made + their way into one of core/base/good/ugly yet, for one + reason or another. Many of these are are production quality + elements, but may still be missing documentation or unit + tests; others haven't passed the rigorous quality testing + we expect yet. + + - gst-libav: a set of codecs plugins based on the ffmpeg library. This is + where you can find audio and video decoders and encoders + for a wide variety of formats including H.264, AAC, etc. + + - gstreamer-vaapi: hardware-accelerated video decoding and encoding using + VA-API on Linux. Primarily for Intel graphics hardware. + + - gst-omx: hardware-accelerated video decoding and encoding, primarily for + embedded Linux systems that provide an OpenMax + implementation layer such as the Raspberry Pi. + + - gst-rtsp-server: library to serve files or streaming pipelines via RTSP + + - gst-editing-services: library an plugins for non-linear editing + +==== Download ==== + +You can find source releases of gstreamer in the download +directory: https://gstreamer.freedesktop.org/src/gstreamer/ + +The git repository and details how to clone it can be found at +https://gitlab.freedesktop.org/gstreamer/ + +==== Homepage ==== + +The project's website is https://gstreamer.freedesktop.org/ + +==== Support and Bugs ==== + +We have recently moved from GNOME Bugzilla to GitLab on freedesktop.org +for bug reports and feature requests: + + https://gitlab.freedesktop.org/gstreamer + +Please submit patches via GitLab as well, in form of Merge Requests. See + + https://gstreamer.freedesktop.org/documentation/contribute/ + +for more details. + +For help and support, please subscribe to and send questions to the +gstreamer-devel mailing list (see below for details). + +There is also a #gstreamer IRC channel on the Freenode IRC network. + +==== Developers ==== + +GStreamer source code repositories can be found on GitLab on freedesktop.org: + + https://gitlab.freedesktop.org/gstreamer + +and can also be cloned from there and this is also where you can submit +Merge Requests or file issues for bugs or feature requests. + +Interested developers of the core library, plugins, and applications should +subscribe to the gstreamer-devel list: + + https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel diff --git a/REQUIREMENTS b/REQUIREMENTS new file mode 100644 index 0000000000..cb0cfbd174 --- /dev/null +++ b/REQUIREMENTS @@ -0,0 +1,48 @@ +GStreamer uses a *large* array of tools and libraries, most of which are +optional. We have attempted to make sure that any code that depends on +optional libraries doesn't get built unless you have those libraries. If +you find this not to be the case, please, let us know by filing a bug +report at http://bugzilla.gnome.org/. + + +Required tools: +=============== + +An extra set of tools is required if you wish to build GStreamer out of +git (using autogen.sh): + +autoconf 2.52 or better +automake 1.5 +gettext 0.11.5 +libtool v1.4 or better +pkgconfig 0.9.0 or better (http://www.freedesktop.org/software/pkgconfig/) + +Required libraries: +=================== + +The core GStreamer libraries. See the gstreamer/ module in GStreamer cvs, or +the version that corresponds to this plugin release. + +Optional libraries: +=================== + +This file lists supporting libraries for which gst-plugins contains plugins, +as well as their minimum version. You can find the corresponding plugins in +ext/(library) + +a52dec (for the a52dec AC-3 decoder) + http://liba52.sourceforge.net/ +opencore-amr (for the AMR-NB decoder and encoder and the AMR-WB decoder) + http://sourceforge.net/projects/opencore-amr/ +libdvdread (for the dvdreadsrc) + http://www.dtek.chalmers.se/groups/dvd/ + (optional: libcss for encrypted DVDs) +mpeg2dec (for mpeg2 related plugins and dvd playback) + http://libmpeg2.sourceforge.net/ +liborc (for the liborc optimization library) + http://code.entropywave.com/download/orc/ +cdio (for the cdio CDDA CD audio source) + http://savannah.gnu.org/projects/libcdio/ +x264 (for the x264enc H.264 encoder) + http://www.videolan.org/developers/x264.html +sidplay FIXME diff --git a/docs/all_index.md b/docs/all_index.md new file mode 100644 index 0000000000..4577a79760 --- /dev/null +++ b/docs/all_index.md @@ -0,0 +1,6 @@ +--- +short-description: Plugins from gst-plugins-ugly +... + +# Plugins + diff --git a/docs/gst_api_version.in b/docs/gst_api_version.in new file mode 100644 index 0000000000..efa22cd39b --- /dev/null +++ b/docs/gst_api_version.in @@ -0,0 +1 @@ +@GST_API_VERSION@ diff --git a/docs/gst_plugins_cache.json b/docs/gst_plugins_cache.json new file mode 100644 index 0000000000..e3290a1a92 --- /dev/null +++ b/docs/gst_plugins_cache.json @@ -0,0 +1,2015 @@ +{ + "a52dec": { + "description": "Decodes ATSC A/52 encoded audio streams", + "elements": { + "a52dec": { + "author": "David I. Lehn ", + "description": "Decodes ATSC A/52 encoded audio streams", + "hierarchy": [ + "GstA52Dec", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Audio/Converter", + "long-name": "ATSC A/52 audio decoder", + "pad-templates": { + "sink": { + "caps": "audio/x-ac3:\naudio/ac3:\naudio/x-private1-ac3:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: F32LE\n layout: interleaved\n rate: [ 4000, 96000 ]\n channels: [ 1, 6 ]\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "drc": { + "blurb": "Use Dynamic Range Compression", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "lfe": { + "blurb": "LFE", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "mode": { + "blurb": "Decoding Mode (default 3f2r)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": " (0)", + "mutable": "null", + "readable": true, + "type": "GstA52DecMode", + "writable": true + } + }, + "rank": "secondary" + } + }, + "filename": "gsta52dec", + "license": "GPL", + "other-types": { + "GstA52DecMode": { + "kind": "enum", + "values": [ + { + "desc": "Mono", + "name": "mono", + "value": "1" + }, + { + "desc": "Stereo", + "name": "stereo", + "value": "2" + }, + { + "desc": "3 Front", + "name": "3f", + "value": "3" + }, + { + "desc": "2 Front, 1 Rear", + "name": "2f1r", + "value": "4" + }, + { + "desc": "3 Front, 1 Rear", + "name": "3f1r", + "value": "5" + }, + { + "desc": "2 Front, 2 Rear", + "name": "2f2r", + "value": "6" + }, + { + "desc": "3 Front, 2 Rear", + "name": "3f2r", + "value": "7" + }, + { + "desc": "Dolby", + "name": "dolby", + "value": "10" + } + ] + } + }, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "amrnb": { + "description": "Adaptive Multi-Rate Narrow-Band", + "elements": { + "amrnbdec": { + "author": "GStreamer maintainers ", + "description": "Adaptive Multi-Rate Narrow-Band audio decoder", + "hierarchy": [ + "GstAmrnbDec", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Audio", + "long-name": "AMR-NB audio decoder", + "pad-templates": { + "sink": { + "caps": "audio/AMR:\n rate: 8000\n channels: 1\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 8000\n channels: 1\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "variant": { + "blurb": "The decoder variant", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "IF1 (0)", + "mutable": "null", + "readable": true, + "type": "GstAmrnbVariant", + "writable": true + } + }, + "rank": "primary" + }, + "amrnbenc": { + "author": "Wim Taymans ", + "description": "Adaptive Multi-Rate Narrow-Band audio encoder", + "hierarchy": [ + "GstAmrnbEnc", + "GstAudioEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstPreset" + ], + "klass": "Codec/Encoder/Audio", + "long-name": "AMR-NB audio encoder", + "pad-templates": { + "sink": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 8000\n channels: 1\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/AMR:\n rate: 8000\n channels: 1\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "band-mode": { + "blurb": "Encoding Band Mode (Kbps)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "MR122 (7)", + "mutable": "null", + "readable": true, + "type": "GstAmrnbEncBandMode", + "writable": true + } + }, + "rank": "secondary" + } + }, + "filename": "gstamrnb", + "license": "unknown", + "other-types": { + "GstAmrnbEncBandMode": { + "kind": "enum", + "values": [ + { + "desc": "MR475", + "name": "MR475", + "value": "0" + }, + { + "desc": "MR515", + "name": "MR515", + "value": "1" + }, + { + "desc": "MR59", + "name": "MR59", + "value": "2" + }, + { + "desc": "MR67", + "name": "MR67", + "value": "3" + }, + { + "desc": "MR74", + "name": "MR74", + "value": "4" + }, + { + "desc": "MR795", + "name": "MR795", + "value": "5" + }, + { + "desc": "MR102", + "name": "MR102", + "value": "6" + }, + { + "desc": "MR122", + "name": "MR122", + "value": "7" + }, + { + "desc": "MRDTX", + "name": "MRDTX", + "value": "8" + } + ] + }, + "GstAmrnbVariant": { + "kind": "enum", + "values": [ + { + "desc": "IF1", + "name": "IF1", + "value": "0" + }, + { + "desc": "IF2", + "name": "IF2", + "value": "1" + } + ] + } + }, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "amrwbdec": { + "description": "Adaptive Multi-Rate Wide-Band Decoder", + "elements": { + "amrwbdec": { + "author": "Renato Araujo ", + "description": "Adaptive Multi-Rate Wideband audio decoder", + "hierarchy": [ + "GstAmrwbDec", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Audio", + "long-name": "AMR-WB audio decoder", + "pad-templates": { + "sink": { + "caps": "audio/AMR-WB:\n rate: 16000\n channels: 1\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 16000\n channels: 1\n", + "direction": "src", + "presence": "always" + } + }, + "properties": {}, + "rank": "primary" + } + }, + "filename": "gstamrwbdec", + "license": "unknown", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "asf": { + "description": "Demuxes and muxes audio and video in Microsofts ASF format", + "elements": { + "asfdemux": { + "author": "Owen Fraser-Green ", + "description": "Demultiplexes ASF Streams", + "hierarchy": [ + "GstASFDemux", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Demuxer", + "long-name": "ASF Demuxer", + "pad-templates": { + "audio_%%u": { + "caps": "ANY", + "direction": "src", + "presence": "sometimes" + }, + "sink": { + "caps": "video/x-ms-asf:\n", + "direction": "sink", + "presence": "always" + }, + "video_%%u": { + "caps": "ANY", + "direction": "src", + "presence": "sometimes" + } + }, + "rank": "secondary", + "signals": {} + }, + "rtpasfdepay": { + "author": "Tim-Philipp Müller , Wim Taymans ", + "description": "Extracts ASF streams from RTP", + "hierarchy": [ + "GstRtpAsfDepay", + "GstRTPBaseDepayload", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Depayloader/Network", + "long-name": "RTP ASF packet depayloader", + "pad-templates": { + "sink": { + "caps": "application/x-rtp:\n media: { (string)application, (string)video, (string)audio }\n payload: [ 96, 127 ]\n clock-rate: [ 1, 2147483647 ]\n encoding-name: X-ASF-PF\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-ms-asf:\n", + "direction": "src", + "presence": "always" + } + }, + "properties": {}, + "rank": "marginal" + }, + "rtspwms": { + "author": "Wim Taymans ", + "description": "Extends RTSP so that it can handle WMS setup", + "hierarchy": [ + "GstRTSPWMS", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstRTSPExtension" + ], + "klass": "Network/Extension/Protocol", + "long-name": "WMS RTSP Extension", + "rank": "secondary" + } + }, + "filename": "gstasf", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "cdio": { + "description": "Read audio from audio CDs", + "elements": { + "cdiocddasrc": { + "author": "Tim-Philipp Müller ", + "description": "Read audio from CD using libcdio", + "hierarchy": [ + "GstCdioCddaSrc", + "GstAudioCdSrc", + "GstPushSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstURIHandler" + ], + "klass": "Source/File", + "long-name": "CD audio source (CDDA)", + "pad-templates": { + "src": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 44100\n channels: 2\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "read-speed": { + "blurb": "Read from device at the specified speed (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "100", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + } + }, + "rank": "secondary - 1" + } + }, + "filename": "gstcdio", + "license": "GPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "dvdlpcmdec": { + "description": "Decode DVD LPCM frames into standard PCM", + "elements": { + "dvdlpcmdec": { + "author": "Jan Schmidt , Michael Smith ", + "description": "Decode DVD LPCM frames into standard PCM audio", + "hierarchy": [ + "GstDvdLpcmDec", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Audio", + "long-name": "DVD LPCM Audio decoder", + "pad-templates": { + "sink": { + "caps": "audio/x-private1-lpcm:\naudio/x-private2-lpcm:\naudio/x-private-ts-lpcm:\naudio/x-lpcm:\n width: { (int)16, (int)20, (int)24 }\n rate: { (int)32000, (int)44100, (int)48000, (int)96000 }\n channels: [ 1, 8 ]\n dynamic_range: [ 0, 255 ]\n emphasis: { (boolean)true, (boolean)false }\n mute: { (boolean)true, (boolean)false }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { S16BE, S24BE }\n layout: interleaved\n rate: { (int)32000, (int)44100, (int)48000, (int)96000 }\n channels: [ 1, 8 ]\n", + "direction": "src", + "presence": "always" + } + }, + "properties": {}, + "rank": "primary" + } + }, + "filename": "gstdvdlpcmdec", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "dvdread": { + "description": "Access a DVD with dvdread", + "elements": { + "dvdreadsrc": { + "author": "Erik Walthinsen ", + "description": "Access a DVD title/chapter/angle using libdvdread", + "hierarchy": [ + "GstDvdReadSrc", + "GstPushSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstURIHandler" + ], + "klass": "Source/File/DVD", + "long-name": "DVD Source", + "pad-templates": { + "src": { + "caps": "video/mpeg:\n mpegversion: 2\n systemstream: true\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "angle": { + "blurb": "angle", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "999", + "min": "1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "chapter": { + "blurb": "chapter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "999", + "min": "1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "device": { + "blurb": "DVD device location", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "/dev/dvd", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "title": { + "blurb": "title", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "999", + "min": "1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + } + }, + "rank": "none" + } + }, + "filename": "gstdvdread", + "license": "GPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "dvdsub": { + "description": "DVD subtitle parser and decoder", + "elements": { + "dvdsubdec": { + "author": "Wim Taymans , Jan Schmidt ", + "description": "Decodes DVD subtitles into AYUV video frames", + "hierarchy": [ + "GstDvdSubDec", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Video", + "long-name": "DVD subtitle decoder", + "pad-templates": { + "sink": { + "caps": "subpicture/x-dvd:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: { AYUV, ARGB }\n width: 720\n height: 576\n framerate: 0/1\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + }, + "dvdsubparse": { + "author": "Mark Nauwelaerts ", + "description": "Parses and packetizes DVD subtitle streams", + "hierarchy": [ + "GstDvdSubParse", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Parser/Subtitle", + "long-name": "DVD subtitle parser", + "pad-templates": { + "sink": { + "caps": "subpicture/x-dvd:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "subpicture/x-dvd:\n parsed: true\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + } + }, + "filename": "gstdvdsub", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "mpeg2dec": { + "description": "LibMpeg2 decoder", + "elements": { + "mpeg2dec": { + "author": "Wim Taymans ", + "description": "Uses libmpeg2 to decode MPEG video streams", + "hierarchy": [ + "GstMpeg2dec", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Video", + "long-name": "mpeg1 and mpeg2 video decoder", + "pad-templates": { + "sink": { + "caps": "video/mpeg:\n mpegversion: [ 1, 2 ]\n systemstream: false\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: { YV12, I420, Y42B, Y444 }\n width: [ 16, 4096 ]\n height: [ 16, 4096 ]\n framerate: [ 0/1, 2147483647/1 ]\n", + "direction": "src", + "presence": "always" + } + }, + "properties": {}, + "rank": "secondary" + } + }, + "filename": "gstmpeg2dec", + "license": "GPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "realmedia": { + "description": "RealMedia support plugins", + "elements": { + "pnmsrc": { + "author": "Wim Taymans ", + "description": "Receive data over the network via PNM", + "hierarchy": [ + "GstPNMSrc", + "GstPushSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstURIHandler" + ], + "klass": "Source/Network", + "long-name": "PNM packet receiver", + "pad-templates": { + "src": { + "caps": "application/vnd.rn-realmedia:\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "location": { + "blurb": "Location of the PNM url to read", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "marginal" + }, + "rademux": { + "author": "Tim-Philipp Müller ", + "description": "Demultiplex a RealAudio file", + "hierarchy": [ + "GstRealAudioDemux", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Demuxer", + "long-name": "RealAudio Demuxer", + "pad-templates": { + "sink": { + "caps": "application/x-pn-realaudio:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "ANY", + "direction": "src", + "presence": "sometimes" + } + }, + "rank": "secondary", + "signals": {} + }, + "rdtdepay": { + "author": "Lutz Mueller , Wim Taymans ", + "description": "Extracts RealMedia from RDT packets", + "hierarchy": [ + "GstRDTDepay", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Depayloader/Network", + "long-name": "RDT packet parser", + "pad-templates": { + "sink": { + "caps": "application/x-rdt:\n media: application\n clock-rate: [ 1, 2147483647 ]\n encoding-name: X-REAL-RDT\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "application/vnd.rn-realmedia:\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "rdtmanager": { + "author": "Wim Taymans ", + "description": "Accepts raw RTP and RTCP packets and sends them forward", + "hierarchy": [ + "GstRDTManager", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Parser/Network", + "long-name": "RTP Decoder", + "pad-templates": { + "recv_rtcp_sink_%%u": { + "caps": "application/x-rtcp:\n", + "direction": "sink", + "presence": "request" + }, + "recv_rtp_sink_%%u": { + "caps": "application/x-rdt:\n", + "direction": "sink", + "presence": "request" + }, + "recv_rtp_src_%%u_%%u_%%u": { + "caps": "application/x-rdt:\n", + "direction": "src", + "presence": "sometimes" + }, + "rtcp_src_%%u": { + "caps": "application/x-rtcp:\n", + "direction": "src", + "presence": "request" + } + }, + "properties": { + "latency": { + "blurb": "Amount of ms to buffer", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "200", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "none", + "signals": { + "clear-pt-map": { + "args": [], + "return-type": "void", + "when": "last" + }, + "on-bye-ssrc": { + "args": [ + { + "name": "arg0", + "type": "guint" + }, + { + "name": "arg1", + "type": "guint" + } + ], + "return-type": "void", + "when": "last" + }, + "on-bye-timeout": { + "args": [ + { + "name": "arg0", + "type": "guint" + }, + { + "name": "arg1", + "type": "guint" + } + ], + "return-type": "void", + "when": "last" + }, + "on-npt-stop": { + "args": [ + { + "name": "arg0", + "type": "guint" + }, + { + "name": "arg1", + "type": "guint" + } + ], + "return-type": "void", + "when": "last" + }, + "on-timeout": { + "args": [ + { + "name": "arg0", + "type": "guint" + }, + { + "name": "arg1", + "type": "guint" + } + ], + "return-type": "void", + "when": "last" + }, + "request-pt-map": { + "args": [ + { + "name": "arg0", + "type": "guint" + }, + { + "name": "arg1", + "type": "guint" + } + ], + "return-type": "GstCaps", + "when": "last" + } + } + }, + "rmdemux": { + "author": "David Schleef ", + "description": "Demultiplex a RealMedia file into audio and video streams", + "hierarchy": [ + "GstRMDemux", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Demuxer", + "long-name": "RealMedia Demuxer", + "pad-templates": { + "audio_%%u": { + "caps": "ANY", + "direction": "src", + "presence": "sometimes" + }, + "sink": { + "caps": "application/vnd.rn-realmedia:\n", + "direction": "sink", + "presence": "always" + }, + "video_%%u": { + "caps": "ANY", + "direction": "src", + "presence": "sometimes" + } + }, + "rank": "primary", + "signals": {} + }, + "rtspreal": { + "author": "Wim Taymans ", + "description": "Extends RTSP so that it can handle RealMedia setup", + "hierarchy": [ + "GstRTSPReal", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstRTSPExtension" + ], + "klass": "Network/Extension/Protocol", + "long-name": "RealMedia RTSP Extension", + "rank": "marginal" + } + }, + "filename": "gstrealmedia", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "sid": { + "description": "Uses libsidplay to decode .sid files", + "elements": { + "siddec": { + "author": "Wim Taymans ", + "description": "Use libsidplay to decode SID audio tunes", + "hierarchy": [ + "GstSidDec", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Codec/Decoder/Audio", + "long-name": "Sid decoder", + "pad-templates": { + "sink": { + "caps": "audio/x-sid:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { S16LE, U16LE, S8, U8 }\n layout: interleaved\n rate: [ 8000, 48000 ]\n channels: [ 1, 2 ]\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "blocksize": { + "blurb": "Size in bytes to output per buffer", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "4096", + "max": "-1", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "clock": { + "blurb": "clock", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "pal (1)", + "mutable": "null", + "readable": true, + "type": "GstSidClock", + "writable": true + }, + "filter": { + "blurb": "filter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "force-speed": { + "blurb": "force_speed", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "measured-volume": { + "blurb": "measured_volume", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "memory": { + "blurb": "memory", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "bank-switching (32)", + "mutable": "null", + "readable": true, + "type": "GstSidMemory", + "writable": true + }, + "metadata": { + "blurb": "Metadata", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "mutable": "null", + "readable": true, + "type": "GstCaps", + "writable": false + }, + "mos8580": { + "blurb": "mos8580", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "tune": { + "blurb": "tune", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "100", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + } + }, + "rank": "primary" + } + }, + "filename": "gstsid", + "license": "GPL", + "other-types": { + "GstSidClock": { + "kind": "enum", + "values": [ + { + "desc": "PAL", + "name": "pal", + "value": "1" + }, + { + "desc": "NTSC", + "name": "ntsc", + "value": "2" + } + ] + }, + "GstSidMemory": { + "kind": "enum", + "values": [ + { + "desc": "Bank Switching", + "name": "bank-switching", + "value": "32" + }, + { + "desc": "Transparent ROM", + "name": "transparent-rom", + "value": "33" + }, + { + "desc": "Playsid Environment", + "name": "playsid-environment", + "value": "34" + } + ] + } + }, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "x264": { + "description": "libx264-based H264 plugins", + "elements": { + "x264enc": { + "author": "Josef Zlomek , Mark Nauwelaerts ", + "description": "H264 Encoder", + "hierarchy": [ + "GstX264Enc", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "interfaces": [ + "GstPreset" + ], + "klass": "Codec/Encoder/Video", + "long-name": "x264enc", + "pad-templates": { + "sink": { + "caps": "video/x-raw:\n framerate: [ 0/1, 2147483647/1 ]\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n format: { Y444, Y42B, I420, YV12, NV12, Y444_10LE, I422_10LE, I420_10LE }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n framerate: [ 0/1, 2147483647/1 ]\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n profile: { (string)high-4:4:4, (string)high-4:2:2, (string)high-10, (string)high, (string)main, (string)baseline, (string)constrained-baseline, (string)high-4:4:4-intra, (string)high-4:2:2-intra, (string)high-10-intra }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "analyse": { + "blurb": "Partitions to consider", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "(none)", + "mutable": "null", + "readable": true, + "type": "GstX264EncAnalyse", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Automatically decide how many B-frames to use", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-pyramid": { + "blurb": "Keep some B-frames as references", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "bframes": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "16", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2048", + "max": "2048000", + "min": "1", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "byte-stream": { + "blurb": "Generate byte stream format of NALU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "dct8x8": { + "blurb": "Adaptive spatial transform size", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "frame-packing": { + "blurb": "Set frame packing mode for Stereoscopic content", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "auto (-1)", + "mutable": "null", + "readable": true, + "type": "GstX264EncFramePacking", + "writable": true + }, + "insert-vui": { + "blurb": "Insert VUI NAL in stream", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "interlaced": { + "blurb": "Interlaced material", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "intra-refresh": { + "blurb": "Use Periodic Intra Refresh instead of IDR frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "ip-factor": { + "blurb": "Quantizer factor between I- and P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1.4", + "max": "2", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gfloat", + "writable": true + }, + "key-int-max": { + "blurb": "Maximal distance between two key-frames (0 for automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "mb-tree": { + "blurb": "Macroblock-Tree ratecontrol", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "me": { + "blurb": "Integer pixel motion estimation method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "hex (1)", + "mutable": "null", + "readable": true, + "type": "GstX264EncMe", + "writable": true + }, + "multipass-cache-file": { + "blurb": "Filename for multipass cache file", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "x264.log", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "noise-reduction": { + "blurb": "Noise reduction strength", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "100000", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "option-string": { + "blurb": "String of x264 options (overridden by element properties) in the format \"key1=value1:key2=value2\".", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "pass": { + "blurb": "Encoding pass/type", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "cbr (0)", + "mutable": "null", + "readable": true, + "type": "GstX264EncPass", + "writable": true + }, + "pb-factor": { + "blurb": "Quantizer factor between P- and B-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1.3", + "max": "2", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gfloat", + "writable": true + }, + "psy-tune": { + "blurb": "Preset name for psychovisual tuning options", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "null", + "readable": true, + "type": "GstX264EncPsyTune", + "writable": true + }, + "qp-max": { + "blurb": "Maximum quantizer", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "51", + "max": "63", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-min": { + "blurb": "Minimum quantizer", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "10", + "max": "63", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-step": { + "blurb": "Maximum quantizer difference between frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "4", + "max": "63", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "quantizer": { + "blurb": "Constant quantizer or quality to apply", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "21", + "max": "50", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frametype lookahead", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "40", + "max": "250", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "ref": { + "blurb": "Number of reference frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "3", + "max": "16", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "sliced-threads": { + "blurb": "Low latency but lower efficiency threading", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "speed-preset": { + "blurb": "Preset name for speed/quality tradeoff options (can affect decode compatibility - impose restrictions separately for your target decoder)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "medium (6)", + "mutable": "null", + "readable": true, + "type": "GstX264EncPreset", + "writable": true + }, + "sps-id": { + "blurb": "SPS and PPS ID number", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "31", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "subme": { + "blurb": "Subpixel motion estimation and partition decision quality: 1=fast, 10=best", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "10", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "sync-lookahead": { + "blurb": "Number of buffer frames for threaded lookahead (-1 for automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "250", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "threads": { + "blurb": "Number of threads used by the codec (0 for automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "trellis": { + "blurb": "Enable trellis searched quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "tune": { + "blurb": "Preset name for non-psychovisual tuning options", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "(none)", + "mutable": "null", + "readable": true, + "type": "GstX264EncTune", + "writable": true + }, + "vbv-buf-capacity": { + "blurb": "Size of the VBV buffer in milliseconds", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "600", + "max": "10000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weightb": { + "blurb": "Weighted prediction for B-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "primary" + } + }, + "filename": "gstx264", + "license": "GPL", + "other-types": { + "GstX264EncAnalyse": { + "kind": "flags", + "values": [ + { + "desc": "i4x4", + "name": "i4x4", + "value": "0x00000001" + }, + { + "desc": "i8x8", + "name": "i8x8", + "value": "0x00000002" + }, + { + "desc": "p8x8", + "name": "p8x8", + "value": "0x00000010" + }, + { + "desc": "p4x4", + "name": "p4x4", + "value": "0x00000020" + }, + { + "desc": "b8x8", + "name": "b8x8", + "value": "0x00000100" + } + ] + }, + "GstX264EncFramePacking": { + "kind": "enum", + "values": [ + { + "desc": "Automatic (use incoming video information)", + "name": "auto", + "value": "-1" + }, + { + "desc": "checkerboard - Left and Right pixels alternate in a checkerboard pattern", + "name": "checkerboard", + "value": "0" + }, + { + "desc": "column interleaved - Alternating pixel columns represent Left and Right views", + "name": "column-interleaved", + "value": "1" + }, + { + "desc": "row interleaved - Alternating pixel rows represent Left and Right views", + "name": "row-interleaved", + "value": "2" + }, + { + "desc": "side by side - The left half of the frame contains the Left eye view, the right half the Right eye view", + "name": "side-by-side", + "value": "3" + }, + { + "desc": "top bottom - L is on top, R on bottom", + "name": "top-bottom", + "value": "4" + }, + { + "desc": "frame interleaved - Each frame contains either Left or Right view alternately", + "name": "frame-interleaved", + "value": "5" + } + ] + }, + "GstX264EncMe": { + "kind": "enum", + "values": [ + { + "desc": "dia", + "name": "dia", + "value": "0" + }, + { + "desc": "hex", + "name": "hex", + "value": "1" + }, + { + "desc": "umh", + "name": "umh", + "value": "2" + }, + { + "desc": "esa", + "name": "esa", + "value": "3" + }, + { + "desc": "tesa", + "name": "tesa", + "value": "4" + } + ] + }, + "GstX264EncPass": { + "kind": "enum", + "values": [ + { + "desc": "Constant Bitrate Encoding", + "name": "cbr", + "value": "0" + }, + { + "desc": "Constant Quantizer", + "name": "quant", + "value": "4" + }, + { + "desc": "Constant Quality", + "name": "qual", + "value": "5" + }, + { + "desc": "VBR Encoding - Pass 1", + "name": "pass1", + "value": "17" + }, + { + "desc": "VBR Encoding - Pass 2", + "name": "pass2", + "value": "18" + }, + { + "desc": "VBR Encoding - Pass 3", + "name": "pass3", + "value": "19" + } + ] + }, + "GstX264EncPreset": { + "kind": "enum", + "values": [ + { + "desc": "No preset", + "name": "None", + "value": "0" + }, + { + "desc": "ultrafast", + "name": "ultrafast", + "value": "1" + }, + { + "desc": "superfast", + "name": "superfast", + "value": "2" + }, + { + "desc": "veryfast", + "name": "veryfast", + "value": "3" + }, + { + "desc": "faster", + "name": "faster", + "value": "4" + }, + { + "desc": "fast", + "name": "fast", + "value": "5" + }, + { + "desc": "medium", + "name": "medium", + "value": "6" + }, + { + "desc": "slow", + "name": "slow", + "value": "7" + }, + { + "desc": "slower", + "name": "slower", + "value": "8" + }, + { + "desc": "veryslow", + "name": "veryslow", + "value": "9" + }, + { + "desc": "placebo", + "name": "placebo", + "value": "10" + } + ] + }, + "GstX264EncPsyTune": { + "kind": "enum", + "values": [ + { + "desc": "No tuning", + "name": "none", + "value": "0" + }, + { + "desc": "Film", + "name": "film", + "value": "1" + }, + { + "desc": "Animation", + "name": "animation", + "value": "2" + }, + { + "desc": "Grain", + "name": "grain", + "value": "3" + }, + { + "desc": "PSNR", + "name": "psnr", + "value": "4" + }, + { + "desc": "SSIM", + "name": "ssim", + "value": "5" + } + ] + }, + "GstX264EncTune": { + "kind": "flags", + "values": [ + { + "desc": "Still image", + "name": "stillimage", + "value": "0x00000001" + }, + { + "desc": "Fast decode", + "name": "fastdecode", + "value": "0x00000002" + }, + { + "desc": "Zero latency", + "name": "zerolatency", + "value": "0x00000004" + } + ] + } + }, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + }, + "xingmux": { + "description": "Add XING tags to mpeg audio files", + "elements": { + "xingmux": { + "author": "Christophe Fergeau ", + "description": "Adds a Xing header to the beginning of a VBR MP3 file", + "hierarchy": [ + "GstXingMux", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + ], + "klass": "Formatter/Muxer/Metadata", + "long-name": "MP3 Xing muxer", + "pad-templates": { + "sink": { + "caps": "audio/mpeg:\n mpegversion: 1\n layer: [ 1, 3 ]\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/mpeg:\n mpegversion: 1\n layer: [ 1, 3 ]\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + } + }, + "filename": "gstxingmux", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Ugly Plug-ins", + "source": "gst-plugins-ugly", + "tracers": {}, + "url": "Unknown package origin" + } +} \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/meson.build b/docs/meson.build new file mode 100644 index 0000000000..5b377e3992 --- /dev/null +++ b/docs/meson.build @@ -0,0 +1,102 @@ +build_hotdoc = false + +required_hotdoc_extensions = ['gst-extension'] +plugins_cache = join_paths(meson.current_source_dir(), 'gst_plugins_cache.json') +if gst_dep.type_name() == 'internal' + gst_proj = subproject('gstreamer') + plugins_cache_generator = gst_proj.get_variable('plugins_cache_generator') +else + plugins_cache_generator = find_program(join_paths(gst_dep.get_pkgconfig_variable('libexecdir'), 'gstreamer-' + api_version, 'gst-plugins-doc-cache-generator'), + required: false) +endif + +if plugins.length() == 0 + message('All ugly plugins have been disabled') +elif plugins_cache_generator.found() + plugins_doc_dep = custom_target('ugly-plugins-doc-cache', + command: [plugins_cache_generator, plugins_cache, '@OUTPUT@', '@INPUT@'], + input: plugins, + output: 'gst_plugins_cache.json', + build_always_stale: true, + ) +else + warning('GStreamer plugin inspector for documentation not found, can\'t update the cache') +endif + +hotdoc_p = find_program('hotdoc', required: get_option('doc')) +if not hotdoc_p.found() + message('Hotdoc not found, not building the documentation') + subdir_done() +endif + +hotdoc_req = '>= 0.11.0' +hotdoc_version = run_command(hotdoc_p, '--version').stdout() +if not hotdoc_version.version_compare(hotdoc_req) + if get_option('doc').enabled() + error('Hotdoc version @0@ not found, got @1@'.format(hotdoc_req, hotdoc_version)) + else + message('Hotdoc version @0@ not found, got @1@'.format(hotdoc_req, hotdoc_version)) + subdir_done() + endif +endif + +hotdoc = import('hotdoc') +foreach extension: required_hotdoc_extensions + if not hotdoc.has_extensions(extension) + if get_option('doc').enabled() + error('Documentation enabled but @0@ missing'.format(extension)) + endif + + message('@0@ extension not found, not building documentation'.format(extension)) + subdir_done() + endif +endforeach + +build_hotdoc = true +docconf = configuration_data() +docconf.set('GST_API_VERSION', api_version) + +configure_file(input : 'gst_api_version.in', + output : 'gst_api_version.md', + configuration : docconf) + +root_rel = '..' +excludes = [] +foreach f: [] + excludes += [join_paths(meson.current_source_dir(), root_rel, '..', f)] +endforeach + +libs_doc = [] +plugins_doc = [] +list_plugin_res = run_command(python3, '-c', +''' +import sys +import json + +with open("@0@") as f: + print(':'.join(json.load(f).keys()), end='') +'''.format(plugins_cache)) + +assert(list_plugin_res.returncode() == 0, + 'Could not list plugins from @0@'.format(plugins_cache)) + +foreach plugin_name: list_plugin_res.stdout().split(':') + plugins_doc += [hotdoc.generate_doc(plugin_name, + project_version: api_version, + sitemap: 'sitemap.txt', + index: 'index.md', + gst_index: 'index.md', + gst_smart_index: true, + gst_c_sources: [ + join_paths(root_rel, 'sys/*/*.[ch]'), + join_paths(root_rel, 'ext/*/*.[ch]'), + join_paths(root_rel, 'gst/*/*.[ch]'), + ], + gst_c_source_filters: excludes, + dependencies: [gst_dep, plugins], + gst_order_generated_subpages: true, + disable_incremental_build: true, + gst_cache_file: plugins_cache, + gst_plugin_name: plugin_name, + )] +endforeach diff --git a/docs/random/ChangeLog-0.8 b/docs/random/ChangeLog-0.8 new file mode 100644 index 0000000000..0c62918c7e --- /dev/null +++ b/docs/random/ChangeLog-0.8 @@ -0,0 +1,17692 @@ +2005-08-31 Michael Smith + + * configure.ac: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcm_reset), + (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), (update_timestamps), + (gst_dvdlpcmdec_chain): + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + Port LPCM decoder to 0.9 + +2005-08-30 Jan Schmidt + + * configure.ac: + Remove plugins that should have disappeared. + +2005-08-30 Jan Schmidt + + * autogen.sh: + * configure.ac: + Make autogen work again. + +2005-08-30 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + * ext/aalib/Makefile.am: + * ext/aalib/gstaasink.c: + * ext/aalib/gstaasink.h: + * ext/cairo/Makefile.am: + * ext/cairo/gstcairo.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttextoverlay.h: + * ext/cairo/gsttimeoverlay.c: + * ext/cairo/gsttimeoverlay.h: + * ext/dv/Makefile.am: + * ext/dv/NOTES: + * ext/dv/demo-play.c: + * ext/dv/gstdv.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdemux.c: + * ext/dv/gstdvdemux.h: + * ext/esd/Makefile.am: + * ext/esd/README: + * ext/esd/esdmon.c: + * ext/esd/esdmon.h: + * ext/esd/esdsink.c: + * ext/esd/esdsink.h: + * ext/esd/gstesd.c: + * ext/flac/Makefile.am: + * ext/flac/flac_compat.h: + * ext/flac/gstflac.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + * ext/flac/gstflactag.c: + * ext/flac/gstflactag.h: + * ext/gconf/Makefile.am: + * ext/gconf/gconf.c: + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfelements.c: + * ext/gconf/gstgconfelements.h: + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosink.h: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gst_loader.c: + * ext/gdk_pixbuf/gstgdkanimation.c: + * ext/gdk_pixbuf/gstgdkanimation.h: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/gdk_pixbuf/pixbufscale.h: + * ext/jpeg/Makefile.am: + * ext/jpeg/README: + * ext/jpeg/gstjpeg.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstjpegenc.h: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.c: + * ext/jpeg/smokecodec.h: + * ext/jpeg/smokeformat.h: + * ext/ladspa/Makefile.am: + * ext/ladspa/gstladspa.c: + * ext/ladspa/gstladspa.h: + * ext/ladspa/gstsignalprocessor.c: + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/load.c: + * ext/ladspa/search.c: + * ext/ladspa/utils.h: + * ext/libcaca/Makefile.am: + * ext/libcaca/gstcacasink.c: + * ext/libcaca/gstcacasink.h: + * ext/libmng/Makefile.am: + * ext/libmng/gstmng.c: + * ext/libmng/gstmng.h: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.c: + * ext/libmng/gstmngenc.h: + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: + * ext/libpng/gstpng.h: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngdec.h: + * ext/libpng/gstpngenc.c: + * ext/libpng/gstpngenc.h: + * ext/mikmod/Makefile.am: + * ext/mikmod/README: + * ext/mikmod/drv_gst.c: + * ext/mikmod/gstmikmod.c: + * ext/mikmod/gstmikmod.h: + * ext/mikmod/mikmod_reader.c: + * ext/mikmod/mikmod_types.c: + * ext/mikmod/mikmod_types.h: + * ext/pango/Makefile.am: + * ext/pango/gsttextoverlay.c: + * ext/pango/gsttextoverlay.h: + * ext/pango/gsttimeoverlay.c: + * ext/pango/gsttimeoverlay.h: + * ext/raw1394/Makefile.am: + * ext/raw1394/gst1394.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gstdv1394src.h: + * ext/shout2/Makefile.am: + * ext/shout2/gstshout2.c: + * ext/shout2/gstshout2.h: + * ext/speex/Makefile.am: + * ext/speex/gstspeex.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.c: + * ext/speex/gstspeexenc.h: + * gst/avi/.cvsignore: + * gst/avi/Makefile.am: + * gst/avi/README: + * gst/avi/avi-ids.h: + * gst/avi/avi.vcproj: + * gst/avi/gstavi.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + * gst/level/gstlevel.c: (gst_level_transform): + * sys/Makefile.am: + * sys/oss/.cvsignore: + * sys/oss/Makefile.am: + * sys/oss/gst-i18n-plugin.h: + * sys/oss/gstossaudio.c: + * sys/oss/gstossdmabuffer.c: + * sys/oss/gstossdmabuffer.h: + * sys/oss/gstosshelper.c: + * sys/oss/gstosshelper.h: + * sys/oss/gstossmixer.c: + * sys/oss/gstossmixer.h: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstossmixerelement.h: + * sys/oss/gstossmixertrack.c: + * sys/oss/gstossmixertrack.h: + * sys/oss/gstosssink.c: + * sys/oss/gstosssink.h: + * sys/oss/gstosssrc.c: + * sys/oss/gstosssrc.h: + * sys/oss/oss_probe.c: + * sys/osxaudio/Makefile.am: + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxaudiosrc.h: + * sys/osxvideo/Makefile.am: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + all these plugins are moved to gst-plugins-good + +2005-08-28 Flavio Oliveira + + * gst/wavenc/gstwavenc.c: Ported to GStreamer 0.9. + Need to fix performance issues. + +2005-08-28 Andy Wingo + + * Updates for two-arg init from GST_BOILERPLATE. + + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): Use + the second arg for the class, because G_OBJECT_GET_CLASS (self) + returns the wrong thing. + (gst_signal_processor_add_pad_from_template): Make pads of the + right type. + + * ext/ladspa/gstladspa.c (gst_ladspa_class_get_param_spec): Make + writable param specs G_PARAM_CONSTRUCT so default values work. + (gst_ladspa_init): Use the second arg for the class. + +2005-08-26 Andy Wingo + + * ext/ladspa/gstladspa.c: + * ext/ladspa/gstladspa.h: Finish porting, still doesn't work but + it does compile and register. I have more features than you. + + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/gstsignalprocessor.c: Updates, bug fixen. + +2005-08-26 Thomas Vander Stichele + + * gst/effectv/gstquark.c: (gst_quarktv_init), + (gst_quarktv_change_state): + do proper cleanup/creation, fixes state changes + +2005-08-25 Jan Schmidt + + * gst/level/gstlevel.c: (gst_level_message_new): + Revert unpopular change for GST_MESSAGE_SRC to GObject. + +2005-08-25 Andy Wingo + + * ext/ladspa/gstladspa.h: + * ext/ladspa/gstladspa.c: Halfway-ported. Doesn't compile yet. + + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/gstsignalprocessor.c: New files, the start of a base + class for DSP elements. + + * configure.ac: Sort the external libs checks, add a ladspa check, + output the ladspa makefile. + +2005-08-25 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_loop, gst_rmdemux_chain): + Fixed EOS. + (gst_rmdemux_parse_indx_data, gst_rmdemux_parse_indx): Handle + malformed index headers where the packet size is incorrect. + +2005-08-24 Andy Wingo + + * ext/dv/gstdvdemux.c (gst_dvdemux_demux_frame): Send out valid + segment end timestamps. + +2005-08-24 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + lame and mpegaudioparse seem to work + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size): + update for basetransform changes + +2005-08-24 Jan Schmidt + * gst/level/gstlevel.c: (gst_level_message_new): + GST_MESSAGE_SRC became a GObject + +2005-08-23 Stefan Kost + + * ext/speex/gstspeexenc.h: + Fixed include path of adapter + +2005-08-23 Wim Taymans + + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + Fix property warning. + +2005-08-23 Wim Taymans + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain): + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain): + Small updates, RFC reference to payload encoders. + +2005-08-23 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/speex/Makefile.am: + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (speex_get_query_types), + (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), + (speex_dec_event), (speex_dec_chain): + Port speexdec. Leads to some unfamiliar warnings on console, + but works otherwise. + +2005-08-23 Andy Wingo + + * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name + property after opening the mixer. + + * sys/oss/gstosssrc.c: + * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... + + * sys/oss/gstossmixerelement.h: + * sys/oss/gstossmixerelement.c: Added mixer element like + alsamixer. + + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Register the ossmixer element. + + * sys/oss/gstossmixer.h: + * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. + + * sys/oss/gstossmixertrack.h: + * sys/oss/gstossmixertrack.c: Split out from gstossmixer.[ch], + like gstalsamixer. + + * sys/oss/gstosssrc.c: + * sys/oss/gstosssink.c: Where before we used a gstosselement + object as a helper library, now just call functions from + gstosshelper. + + * sys/oss/gstosshelper.h: + * sys/oss/gstosshelper.c: Made a real library. Removed + propertyprobe for now, should add it back later. + + * sys/oss/gstosselement.h: + * sys/oss/gstosselement.c: Removed, we don't have a shared base + class. + + * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search + higher-to-lower, makes 16 bit appear earlier in the caps, which + makes it preferred. + + * sys/oss/gstosssrc.h: + * sys/oss/gstosssrc.c: Totally ported, dude. + + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Add osssrc. + + * sys/oss/gstosssink.c: We do native byte order. + +2005-08-23 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug + causing events to be passed wrong way. + (gst_rmdemux_parse_packet): Avoid accidentally skipping audio. + +2005-08-22 Jan Schmidt + + * ext/mad/gstid3tag.c: (gst_id3_tag_init), + (gst_id3_tag_sink_event), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): + Works a bit better now, but still needs a rewrite to use + get_range instead of this seeking nastiness. + +2005-08-22 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/flac/Makefile.am: + * ext/flac/gstflac.c: (plugin_init): + * ext/flac/gstflacdec.c: (flacdec_get_type), (gst_flacdec_init), + (gst_flacdec_update_metadata), (gst_flacdec_seek), + (gst_flacdec_tell), (gst_flacdec_length), (gst_flacdec_read), + (gst_flacdec_write), (gst_flacdec_loop), + (gst_flacdec_get_src_query_types), (gst_flacdec_src_query), + (gst_flacdec_src_event), (gst_flacdec_sink_activate), + (gst_flacdec_sink_activate_pull), (gst_flacdec_change_state): + * ext/flac/gstflacdec.h: + Port flacdec (seeking is still slow'ish). + +2005-08-22 Owen Fraser-Green + + * gst/realmedia/rmdemux.c: + (gst_rmdemux_perform_seek, gst_rmdemux_parse_packet): + Seeking improvements. + +2005-08-19 Wim Taymans + + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): + Remove get_time code that is both wrong and unneeded. + +2005-08-19 Wim Taymans + + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain), + (gst_rtph263penc_set_property), (gst_rtph263penc_get_property): + * gst/rtp/gstrtph263penc.h: + Added configurable pt and ssrc, to be merged in the caps or + a base class... + +2005-08-19 Wim Taymans + + * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_init), + (gst_rtph263pdec_chain): + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain): + Some cleanups in the h263p (de)payloaders. + +2005-08-19 Wim Taymans + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_setcaps): + * ext/amrnb/amrnbparse.c: + Update caps with audio/AMR. + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain), + (gst_rtpamrdec_change_state): + * gst/rtp/gstrtpamrdec.h: + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain): + Dont set FT headers twice, it was already in the encoded + bitstream. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + * gst/rtsp/rtspconnection.c: (parse_line): + Cleanups + + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property): + * gst/udp/gstudpsrc.h: + Added caps property, we need this soon to type the buffers. + +2005-08-18 Wim Taymans + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_chain): + Fix up amr depayloader a bit. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + Look for options result in Public and Allow header fields.. + spec says Allow but some servers return Public... + +2005-08-18 Wim Taymans + + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain), + (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property): + * gst/rtp/gstrtpamrenc.h: + Added payload_type and ssrc properties to the payloader. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + Options need to be stripped and are in the Public header field. + + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Fix url / parsing... + + +2005-08-18 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_get_type), + (gst_rtpamrdec_base_init), (gst_rtpamrdec_class_init), + (gst_rtpamrdec_init), (gst_rtpamrdec_chain), + (gst_rtpamrdec_set_property), (gst_rtpamrdec_get_property), + (gst_rtpamrdec_change_state), (gst_rtpamrdec_plugin_init): + * gst/rtp/gstrtpamrdec.h: + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_get_type), + (gst_rtpamrenc_base_init), (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain), + (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property), + (gst_rtpamrenc_change_state), (gst_rtpamrenc_plugin_init): + * gst/rtp/gstrtpamrenc.h: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_class_init), + (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain): + Added very simplistic amr payloader. depayloader does not + work yet. + +2005-08-18 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspdefs.c: (rtsp_method_as_text), (rtsp_find_method): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): + Handle RTSP defaults better. + Issue OPTIONS request to figure out what we are allowed to do. + Make the methods a bitfield so we can easily collect supported + options. + Fix rtsp_find_method. + Do proper RTSP connection shutdown. + +2005-08-18 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp-common.h: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpL16enc.h: + * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), + (gst_rtpdec_class_init), (gst_rtpdec_chain_rtp), + (gst_rtpdec_chain_rtcp), (gst_rtpdec_change_state), + (gst_rtpdec_plugin_init): + * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_get_type), + (gst_rtph263pdec_base_init), (gst_rtph263pdec_class_init), + (gst_rtph263pdec_init), (gst_rtph263pdec_chain), + (gst_rtph263pdec_set_property), (gst_rtph263pdec_get_property), + (gst_rtph263pdec_change_state), (gst_rtph263pdec_plugin_init): + * gst/rtp/gstrtph263pdec.h: + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_get_type), + (gst_rtph263penc_base_init), (gst_rtph263penc_class_init), + (gst_rtph263penc_init), (gst_rtph263penc_flush), + (gst_rtph263penc_chain), (gst_rtph263penc_set_property), + (gst_rtph263penc_get_property), (gst_rtph263penc_change_state), + (gst_rtph263penc_plugin_init): + * gst/rtp/gstrtph263penc.h: + * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_get_type), + (gst_rtpmpadec_base_init), (gst_rtpmpadec_class_init), + (gst_rtpmpadec_init), (gst_rtpmpadec_chain), + (gst_rtpmpadec_set_property), (gst_rtpmpadec_get_property), + (gst_rtpmpadec_change_state), (gst_rtpmpadec_plugin_init): + * gst/rtp/gstrtpmpadec.h: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_get_type), + (gst_rtpmpaenc_base_init), (gst_rtpmpaenc_class_init), + (gst_rtpmpaenc_init), (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain), + (gst_rtpmpaenc_set_property), (gst_rtpmpaenc_get_property), + (gst_rtpmpaenc_change_state), (gst_rtpmpaenc_plugin_init): + * gst/rtp/gstrtpmpaenc.h: + * gst/rtp/rtp-packet.c: + * gst/rtp/rtp-packet.h: + Remove old code that is now in gst-libs/gst/rtp/. + Added some payload/depayloaders. + + * gst/udp/gstudpsink.c: (gst_udpsink_class_init): + Fix port number range. + +2005-08-17 Wim Taymans + + * configure.ac: + Added mpegaudioparse + + * ext/lame/gstlame.c: (gst_lame_src_getcaps), + (gst_lame_src_setcaps), (gst_lame_sink_setcaps), + (gst_lame_sink_event), (gst_lame_chain): + Some cleanups. + Fix memleak. + + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init), (gst_mp3parse_init), + (gst_mp3parse_chain), (gst_mp3parse_change_state): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Ported mpegaudioparse + +2005-08-17 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open), (gst_rtspsrc_play): + Support absolute control urls too. + +2005-08-16 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_header): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_add_stream), (qtdemux_parse_tree): + Uncomment metadata and codec-name handling. + +2005-08-16 Wim Taymans + + * configure.ac: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_read_header): + Fix compile warning. + + * ext/lame/gstlame.c: (gst_lame_class_init), + (gst_lame_src_getcaps), (gst_lame_src_setcaps), + (gst_lame_sink_setcaps), (gst_lame_init), (gst_lame_sink_event), + (gst_lame_chain), (gst_lame_change_state): + * ext/lame/gstlame.h: + Port lame plugin + +2005-08-16 Andy Wingo + + * ext/dv/gstdvdemux.c (gst_dvdemux_flush): Use gst_adapter_take so + we have our own copy of the data. + (gst_dvdemux_demux_video): Set the take() data as malloc_data so + it will get freed later. + + * ext/raw1394/gstdv1394src.c (gst_dv1394src_iso_receive): Note + license info in the source code -- was only in the commit log + before. + + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdec.c: Only decodes systemstream=FALSE dv video -- + old pipelines using dvdec should probably have a dvdemux first. + + * ext/dv/gstdvdemux.h: + * ext/dv/gstdvdemux.c: Split out from dvdec, chunks the incoming + systemstream=TRUE data into frames, sets caps data, and spits out + PCM audio in addition to systemstream=FALSE video frames. Operates + in chain mode only for now; should make a getrange version as + well. + + * ext/dv/gstdv.c: New file, registers the libgstdv plugin. + + * ext/dv/Makefile.am: Library name changed to libgstdv. Split + dvdec into dvdemux and dvdec. + +2005-08-16 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event), (gst_faad_chain): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Handle _push() return values. + +2005-08-15 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Fix debug. + +2005-08-15 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_video_caps): + Forwardport from 0.8 to implement RLE. + +2005-08-15 Wim Taymans + + * gst/rtsp/README: + Added rtsp server implementation docs. + +2005-08-14 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: + aalib is LGPL, so this plugin can be LGPL + * ext/arts/gst_arts.c: (plugin_init): + rename, we don't like underscores + * ext/audiofile/gstaf.c: + * ext/sndfile/gstsf.c: + rename, we like a descriptive plugin name + * ext/gconf/gstgconfelements.c: + change description a little + * ext/musicbrainz/gsttrm.c: + musicbrainz is LGPL, so plugin can be LGPL + * ext/raw1394/gst1394.c: + rename, we like all-digit names + * gst/equalizer/gstiirequalizer.c: + * gst/fdsrc/gstfdsrc.c: + * gst/multifilesink/gstmultifilesink.c: + rename + * gst/virtualdub/gstvirtualdub.c: + use GST_PLUGIN_DEFINE + * sys/dxr3/dxr3init.c: + only uses system headers, and code is LGPL, so plugin is LGPL + +2005-08-13 Tim-Philipp Müller + + * ext/mad/Makefile.am: + * gst/avi/Makefile.am: + * gst/effectv/Makefile.am: + * gst/udp/Makefile.am: + * gst/wavparse/Makefile.am: + Use -lgstfoo-@GST_MAJORMINOR@ instead of -lgstfoo-0.9 + +2005-08-12 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_indirect), + (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain): + Fix decoding of pictures with certain uneven or unaligned + widths where jpeglib needs more horizontal padding than our + I420 buffers provide, resulting in blocky artifacts at the + left side of the picture (#164176). + Also make use of our shiny new GST_ROUND_N() macros. + +2005-08-11 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Fix crashes/invalid memory access for pictures that have a height + that is not a multiple of 16 (or rather: v_samp_factor * DCTSIZE). + + Also fix the state change function for downwards state changes + (need to chain up to parent before destroying our resources, to + make sure pads get deactivated and our chain function isn't + running and using those very same resources in another thread). + + The jpeg line buffer only needs to be v_samp_factor*DCTSIZE lines + per plane, not picture_height lines; allocate that on the stack. + +2005-08-10 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + Add some fixes from 0.8 branch: allow 24/32bps songs and + blockalign samples to the header-specified size, if any + (#311070); error out on channels==0 or bitrate==0 + (#309043, #304588). + +2005-08-10 Thomas Vander Stichele + + * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), + (gst_level_transform): + * gst/level/gstlevel.h: + remove unused MS struct member + don't reset the CS values for channels on every _chain, so that + level actually correctly calculates the RMS value. sigh. + calculate RMS values correctly for peak and decay peak sums; + before we were signalling them as if they already were amplitude + and not power values. sigh. + Remind me to not try and pretend I'm writing DSP code. + +2005-08-10 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_class_init), (gst_faad_setcaps): + Add debug category, remove Close() call that made it crash + whenever reusing, renegotiating or anything; Close() actually + free()s the handle and should only be called on READY->NULL. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Actually set caps on buffer (in addition to pad), also. + +2005-08-10 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_sink_activate) + (gst_rmdemux_sink_activate_push, gst_rmdemux_sink_activate_pull) + (gst_rmdemux_loop, gst_rmdemux_src_event) + (gst_rmdemux_perform_seek, gst_rmdemux_src_query): Implemented + push-pull and seeking. + +2005-08-09 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event): + Sign/unsign mismatch. + * configure.ac: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), + (gst_qtdemux_init), (gst_qtdemux_get_src_query_types), + (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), + (plugin_init), (gst_qtdemux_handle_sink_event), + (gst_qtdemux_change_state), (gst_qtdemux_loop_header), + (qtdemux_sink_activate), (qtdemux_sink_activate_pull), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), + (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): + * gst/qtdemux/qtdemux.h: + Half-assed port (hey, it works). + +2005-08-09 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): + Fix AVI header parsing: add missing break statement after + GST_RIFF_INFO_LIST parsing code; gst_riff_read_chunk() has + already advanced the avi->offset, no need to do it twice + (fixes MovieOfMovies.avi). + +2005-08-09 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Make mjpeg actually work and skip jpeg data parsing if we + know that the input is packetized (ie. each input buffer + is exactly one jpeg frame). + +2005-08-09 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): + It'd be nice if I could listen to my mp3 files, so send out an + initial discont, as the sink apparently wants. + +2005-08-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), + (gst_avi_demux_handle_seek): + Fix seeking (or, well, fix threading issue where a variable was + set before a lock was taken and was already unset before that + same lock was taken and was thus no longer in existance when it + actually had to be used). + +2005-08-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Mixing binary and logical operators is not going to work; fix + position-querying in Totem. + +2005-08-08 Tim-Philipp Müller + + * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_class_init), + (gst_faad_init), (gst_faad_setcaps), (gst_faad_srcgetcaps), + (gst_faad_event), (gst_faad_update_caps), (gst_faad_chain), + (gst_faad_change_state): + * ext/faad/gstfaad.h: + Fix negotiation (#310932) and miscellaneous other stuff. Probably + still needs some more work. + +2005-08-08 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain): + Add setcaps() function (for mjpeg). + +2005-08-08 Andy Wingo + + * ext/esd/esdsink.c (gst_esdsink_getcaps): Seems that wierd + va_list caps setting function was borked. Fixed esdsink. + + * sys/oss/gstosssink.c (gst_oss_sink_open, gst_oss_sink_close) + (gst_oss_sink_prepare, gst_oss_sink_unprepare): Update for newer + audiosink api. + + * ext/raw1394/gstdv1394src.c (gst_dv1394src_get_property) + (gst_dv1394src_set_property): Style. All about the style. + + * ext/esd/esdsink.c (gst_esdsink_getcaps): Return specific caps + only if in READY or higher (i.e., if _open() has been called.) + (gst_esdsink_open, gst_esdsink_close, gst_esdsink_prepare) + (gst_esdsink_unprepare): Update for audiosink changes. + (gst_esdsink_change_state): Die! + +2005-08-08 Ronald S. Bultje + + * ext/jpeg/Makefile.am: + Fix compile. + +2005-08-08 Tim-Philipp Müller + + * configure.ac: + * ext/Makefile.am: + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpeg.c: (plugin_init): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_get_type), + (gst_jpeg_dec_finalize), (gst_jpeg_dec_base_init), + (gst_jpeg_dec_class_init), (gst_jpeg_dec_fill_input_buffer), + (gst_jpeg_dec_init_source), (gst_jpeg_dec_skip_input_data), + (gst_jpeg_dec_resync_to_restart), (gst_jpeg_dec_term_source), + (gst_jpeg_dec_my_output_message), (gst_jpeg_dec_my_emit_message), + (gst_jpeg_dec_my_error_exit), (gst_jpeg_dec_init), + (is_jpeg_start_marker), (is_jpeg_end_marker), + (gst_jpeg_dec_find_jpeg_header), (gst_jpeg_dec_ensure_header), + (gst_jpeg_dec_have_end_marker), + (gst_jpeg_dec_parse_tag_has_entropy_segment), + (gst_jpeg_dec_parse_image_data), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Port jpegdec to 0.9; handles 'progressive loading' now, ie. input does + no longer need to be one single buffer. + +2005-08-04 Andy Wingo + + * sys/oss/gstossaudio.c (plugin_init): Second-class citizen. + + * gst/videobox/gstvideobox.c (gst_video_box_get_size): Update for + API changes. + + * configure.ac (DEFAULT_AUDIOSINK, DEFAULT_VIDEOSINK): Set to + autoaudiosink and autovideosink. + +2005-08-04 Edward Hervey + + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry): + You need to allocatate (len+1) characters to store a len size string. + Also don't stop the processing task if the output pad is not linked. + +2005-08-03 Ronald S. Bultje + + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), + (gst_gconf_audio_sink_init), (do_toggle_element), + (cb_toggle_element), (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), + (gst_gconf_video_sink_init), (do_toggle_element), + (cb_toggle_element), (gst_gconf_video_sink_change_state): + * ext/gconf/gstgconfvideosink.h: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), + (gst_auto_audio_sink_init), (gst_auto_audio_sink_detect), + (gst_auto_audio_sink_change_state): + * gst/autodetect/gstautoaudiosink.h: + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), + (gst_auto_video_sink_init), (gst_auto_video_sink_detect), + (gst_auto_video_sink_change_state): + * gst/autodetect/gstautovideosink.h: + Use new ghostpad API; now they actually work in Totem, also. + +2005-08-03 Ronald S. Bultje + + * ext/libpng/Makefile.am: + Fix uninstalled build. + +2005-08-02 Edward Hervey + + * configure.ac: + * ext/Makefile.am: + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: + * ext/libpng/gstpngenc.c: + Ported pngenc , still have to port pngdec... + +2005-08-01 Stefan Kost + + reviewed by: + + * configure.ac: + * ext/ladspa/Makefile.am: + * ext/ladspa/gstladspa.c: (gst_ladspa_init), (gst_ladspa_loop), + (gst_ladspa_chain), (gst_ladspa_get), (plugin_init): + * ext/ladspa/gstladspa.h: + deactivate and remove dparams (libgstcontrol) + +2005-07-27 Wim Taymans + + * ext/faad/gstfaad.c: (gst_faad_event): + Compile fixes. + +2005-07-27 Wim Taymans + + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_event), + (gst_amrnbparse_loop): + * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event), + (gst_dvdec_handle_src_event), (gst_dvdec_decode_frame): + * ext/mad/gstid3tag.c: (gst_id3_tag_src_event), + (gst_id3_tag_sink_event), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_src_query), (index_seek), + (normal_seek), (gst_mad_sink_event), (gst_mad_chain): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/shout2/gstshout2.c: (gst_shout2send_event): + * ext/sidplay/gstsiddec.cc: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), + (gst_avi_demux_send_event), (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): + * gst/goom/gstgoom.c: (gst_goom_event): + * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), + (gst_rmdemux_chain), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream): + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_srcpad_event): + Various event updates and cleanups. + +2005-07-25 Christian Schaller + + + * gst-plugins.spec.in: add silence and videoflip + * gst/videofilter/Makefile.am: add missing header to noinst + +2005-07-25 Thomas Vander Stichele + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: (gst_gamma_setup): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_setup): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_class_init), + (gst_videofilter_getcaps), (gst_videofilter_setcaps), + (gst_videofilter_init), (gst_videofilter_chain), + (gst_videofilter_set_property), (gst_videofilter_get_property), + (gst_videofilter_setup), (gst_videofilter_class_add_pad_templates): + * gst/videofilter/gstvideofilter.h: + * gst/videofilter/gstvideoflip.c: (gst_videoflip_init), + (gst_videoflip_set_property), (gst_videoflip_get_property), + (plugin_init), (gst_videoflip_setup), (gst_videoflip_planar411): + forward port from 0.9 and enable videoflip now that it works + +2005-07-23 Edward Hervey + + * configure.ac: + * gst/silence/Makefile.am: + * gst/silence/gstsilence.h: + * gst/silence/gstsilence.c: + Ported silence to 0.9 using GstBaseSrc ... 180 lines :) + +2005-07-22 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_src_event): + First try forwarding events, makes seeking in AVI files with mp3 + audio work again. + +2005-07-20 Andy Wingo + + * ext/mpeg2dec/gstmpeg2dec.c (gst_mpeg2dec_sink_event): Signedness + fix. + +2005-07-20 Edward Hervey + + * configure.ac: + * gst/wavparse/gstwavparse.c: + * gst/wavparse/gstwavparse.h: + * gst/wavparse/Makefile.am: + Ported wavparse to 0.9 . Playing, seeking and state changes work. + Could need more loving on the headers though. + +2005-07-20 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/gconf/Makefile.am: + * ext/gconf/gconf.c: (gst_bin_find_unconnected_pad), + (gst_gconf_render_bin_from_description), + (gst_gconf_get_default_video_sink): + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), + (gst_gconf_audio_sink_class_init), (gst_gconf_audio_sink_dispose), + (cb_toggle_element), (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfelements.h: + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), + (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_dispose), + (cb_toggle_element), (gst_gconf_video_sink_change_state): + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), + (gst_auto_audio_sink_detect), (gst_auto_audio_sink_change_state): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init), (gst_auto_video_sink_class_init), + (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): + Port auto/gconfsinks to 0.9. They actually appear to work here in + Totem as well, making them actually useful. + +2005-07-20 Ronald S. Bultje + + * ext/faad/Makefile.am: + Fix uninstalled build. + +2005-07-19 Wim Taymans + + * sys/oss/gstosssink.c: (gst_oss_sink_get_format), + (gst_oss_sink_open): + Parse spec to set correct oss values. + +2005-07-19 Edgard N. A. G. Lima + + * configure.ac + * ext/Makefile.am + * ext/amrnb/amrnbdec.c + * ext/amrnb/amrnbenc.c + * ext/amrnb/amrnbparse.c + * ext/faad/gstfaad.c + * ext/mpeg2dec/gstmpeg2dec.c + Ported amrnb, faad, mpeg2dec to 0.9 + +2005-07-19 Andy Wingo + + * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Set the proper + framerate on the outbound buffer. + + * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Don't clobber + alloc_buffer's return value. + (gst_dvdec_decode_frame): Handle unlinked pads with grace and + agility. + + * ext/dv/gstdvdec.h: Fix signedness error. + +2005-07-19 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_sink_convert), (gst_dvdec_get_src_query_types), + (gst_dvdec_src_query), (gst_dvdec_get_sink_query_types), + (gst_dvdec_sink_query), (gst_dvdec_send_event), + (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), + (gst_dvdec_decode_audio), (gst_dvdec_decode_video), + (gst_dvdec_decode_frame), (gst_dvdec_flush), (gst_dvdec_chain): + * ext/dv/gstdvdec.h: + Implemented seeking in dvdec. + +2005-07-19 Andy Wingo + + * ext/Makefile.am: Enable dvdev and raw1394src. + +2005-07-18 Andy Wingo + + * configure.ac: Use AS_LIBTOOL_TAGS. Fix crap gettext commit + comment. + +2005-07-18 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_add_element), + (gst_rtspsrc_play): + Fix for core changes. + +2005-07-18 Jan Schmidt + + * ext/mad/gstid3tag.c: (gst_id3_tag_sink_event): + When returning to NORMAL state after reading tags, + pass on the discont event. + +2005-07-18 Wim Taymans + + * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), + (gst_rmdemux_change_state), (gst_rmdemux_chain), + (gst_rmdemux_get_stream_by_id), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream): + Send discont event before pushing first buffer. + +2005-07-17 Philippe Khalaf + + * gst/fdsrc/gstfdsrc.c: + Removed #include + +2005-07-16 Philippe Khalaf + + * gst/fdsrc/gstfdsrc.c: + * gst/fdsrc/gstfdsrc.h: + * gst/fdsrc/Makefile.am: + Moved fdsrc 0.9 port from gstreamer/gst/elements to here. + +2005-07-16 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event), + (gst_mad_chain): + Add convert function for proper timestamp calculations. + + * gst/avi/gstavidemux.c: (gst_avi_demux_send_event), + (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): + Send out initial discont. + +2005-07-15 Wim Taymans + + * gst/level/gstlevel.c: (gst_level_transform): + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_get_size), (gst_video_box_transform): + Port to new base class. + +2005-07-14 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_class_init), (gst_dv1394src_init), + (gst_dv1394src_iso_receive), (gst_dv1394src_create), + (gst_dv1394src_change_state), (gst_dv1394src_query): + It's PUSH_SRC now. + +2005-07-14 Thomas Vander Stichele + + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_class_init): + more autistic cleanliness in functions/names/defines + + +2005-07-10 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_get_type), + (gst_aasink_class_init), (gst_aasink_init): + * ext/esd/esdsink.c: (gst_esdsink_get_type), + (gst_esdsink_class_init): + * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), + (gst_cacasink_class_init), (gst_cacasink_init): + * ext/shout2/gstshout2.c: (gst_shout2send_get_type), + (gst_shout2send_class_init), (gst_shout2send_init): + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_get_type), + (gst_dynudpsink_class_init): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_class_init): + more macro splitting + +2005-07-08 Andy Wingo + + * sys/oss/: Port from THREADED+wim's fixes. + + * gst/avi/Makefile.am (libgstavi_la_CFLAGS): No gettext hacks, the + defines come from config.h. + + * autogen.sh: Run autopoint, etc. + + * Makefile.am (DIST_SUBDIRS, SUBDIRS): Go into po/. + + * configure.ac: Add gettext stuff. + +2005-07-07 Wim Taymans + + * gst/videobox/gstvideobox.c: (gst_video_box_init), + (gst_video_box_transform_caps), (gst_video_box_set_caps): + Logic was reversed. Needs some more fixes in the transform + function to include AYUV output. + Moved AYUV as prefered format. + +2005-07-07 Wim Taymans + + * configure.ac: + * ext/dv/Makefile.am: + * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), + (gst_dvdec_get_src_query_types), (gst_dvdec_src_query), + (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), + (gst_dvdec_video_getcaps), (gst_dvdec_video_setcaps), + (gst_dvdec_decode_audio), (gst_dvdec_decode_video), + (gst_dvdec_decode_frame), (gst_dvdec_chain), + (gst_dvdec_change_state), (gst_dvdec_set_property), + (gst_dvdec_get_property), (plugin_init): + * ext/dv/gstdvdec.h: + * ext/esd/esdsink.c: (gst_esdsink_class_init): + Ported DVdec to 0.9. + Parent of esdsink is GstAudioSink. + +2005-07-07 Wim Taymans + + * configure.ac: + * ext/raw1394/Makefile.am: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_class_init), (gst_dv1394src_init), + (gst_dv1394src_iso_receive), (gst_dv1394src_create), + (gst_dv1394src_change_state), (gst_dv1394src_convert), + (gst_dv1394src_get_query_types), (gst_dv1394src_query): + * ext/raw1394/gstdv1394src.h: + Ported the 1394 source to 0.9. + +2005-07-07 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_query_types): + * ext/mad/gstmad.c: (gst_mad_get_query_types), (gst_mad_src_query): + * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types): + Remove deprecated/unsed code. + +2005-07-06 Edward Hervey + + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + GST_BASESRC --> GST_BASE_SRC + +2005-07-05 Andy Wingo + + * gst/oneton: Removed (replaced by deinterleave). + + * gst/adder: + * gst/audioconvert: + * gst/audiorate: + * gst/audioscale: + * gst/ffmpegcolorspace: + * gst/playback: + * gst/sine: + * gst/subparse: + * gst/tags: + * gst/tcp: + * gst/videoscale: + * gst/volume: Removed dirs that are now in gst-plugins-base. + +2005-07-05 Edward Hervey + + * configure.ac: (GST_PLUGINS_ALL): + videofilter must be compiled first, since other plugins depend ont it. + +2005-07-05 Andy Wingo + + * Way, way, way too many files: + Remove crack comment from the 2000 era. + +2005-07-05 Andy Wingo + + * gst/videobox/gstvideobox.c: Clean up, port to 0.9, use + BaseTransform. + + * gst/videobox/Makefile.am: Link to base libs, include + plugins-base cflags, dist the README. + + * configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to + the build. + +2005-07-04 Wim Taymans + + * gst/realmedia/rmdemux.c: + I don't think that piece of changelog should go there. + +2005-07-04 Andy Wingo + + * examples/level/: + * examples/level/Makefile.am: + * examples/level/README: + * examples/level/demo.c: + * examples/level/plot.c: Examples moved out of the source dir. Not + updated tho. + + * configure.ac: Add level to the build. + + * gst/level/Makefile.am: + * gst/level/gstlevel.h: + * gst/level/gstlevel.c: Cleaned up, ported to 0.9. + + * ext/aalib/gstaasink.c (gst_aasink_fixate): Update for newer + fixate prototype. + +2005-07-03 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_add_stream), + (gst_rmdemux_src_getcaps), (gst_rmdemux_chain): + Added getcaps function no_more_pads call + +2005-07-01 Philippe Khalaf + * gst/udp/Makefile.am: + * gst/udp/gstudp.c: + * gst/udp/gstdynudpsink.c: (new) + * gst/udp/gstdynudpsink.h: (new) + Added new element (udpdynsink) that receives GstNetBuffers and sends the + udp packets to the source given in the buffer. It's used by rtpsession + element for now. + * gst/udp/gstudpsrc.c: + Fixed memory leak. + +2005-07-01 Jan Schmidt + + * configure.ac: + * ext/mad/Makefile.am: + * sys/oss/Makefile.am: + Roll gstreamer-interfaces-0.9.pc into gstreamer-plugins-base-0.9.pc + +2005-07-01 Jan Schmidt + * ext/libcaca/Makefile.am: + * ext/mad/Makefile.am: + * gst/effectv/Makefile.am: + * gst/udp/Makefile.am: + Replace GST_PLUGINS_LIBS_* with GST_PLUGINS_BASE_* + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query), + (gst_id3_tag_src_event), (gst_id3_tag_sink_event), + (gst_id3_tag_chain), (plugin_init): + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_chain): + Signedness warning fix, use gst_pad_get_peer instead of GST_PAD_PEER + in querying and event handling, because we're not holding the pad + lock and the peer may disappear. + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): + Signedness warning fixes. + + * gst/videofilter/gstvideotemplate.c: (plugin_init): + Remove gst_library_load + +2005-06-30 Edward Hervey + + * gst/avi/Makefile.am: (libgstavi_la_LIBADD): + Added linking to libgstriff-0.9 + + * ext/mad/gstmad.c: (gst_mad_src_query): + check the format of the upstream query and return query if it's the + same format as the requested one. + +2005-06-30 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + Compiler pains. + +2005-06-30 Ronald S. Bultje + + * configure.ac: + * gst/avi/Makefile.am: + * gst/avi/gstavi.c: (plugin_init): + * gst/avi/gstavidemux.c: (gst_avi_demux_get_type), + (gst_avi_demux_class_init), (gst_avi_demux_init), + (gst_avi_demux_reset), (gst_avi_demux_index_next), + (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_index_entry_for_byte), + (gst_avi_demux_index_entry_for_frame), (gst_avi_demux_src_convert), + (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), + (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), + (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), + (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop), (gst_avi_demux_sink_activate), + (gst_avi_demux_sink_activate_pull): + * gst/avi/gstavidemux.h: + Port from -THREADED to HEAD, and fix for latest API changes of + the day. Keep avimux dead for now. + +2005-06-29 Wim Taymans + + * ext/shout2/gstshout2.c: (gst_shout2send_render): + Fix build. + +2005-06-29 Andy Wingo + + * gst/videofilter/gstvideoexample.c: Removed gst_library_load, I + think. Whatever this plugin actually does, that I don't know. + +2005-06-29 Andy Wingo + + * ext/mad/gstid3tag.c (gst_id3_tag_get_event_masks): Reschmoove. + + * ext/mad/gstmad.c (gst_mad_get_event_masks): Remove. + (gst_mad_chain): Appease GCC. + + * ext/libcaca/gstcacasink.c (gst_cacasink_setcaps): Signedness. + + * ext/aalib/gstaasink.c (gst_aasink_fixate): Unref caps, not free. + (gst_aasink_scale): Signedness. + + * gst/udp/gstudpsink.c (gst_udpsink_get_type): Actually add the + URI handler. + + * gst/udp/gstudpsrc.c (gst_udpsrc_start): + (gst_udpsrc_create): Signedness. + + * gst/rtsp/sdpmessage.c (sdp_message_parse_buffer): Thanks + compiler! + (sdp_parse_line): Signedness fix. + + * configure.ac (GST_CFLAGS): GCC strikes back!!! Let the build + breakage ensue!!! + + * gst/rtsp/gstrtspsrc.c (gst_rtspsrc_loop, gst_rtspsrc_open): + Signedness, unused var fixes. + (gst_rtspsrc_close): Unused? + + * gst/realmedia/rmdemux.c (re_hexdump_bytes): Unused. + + * gst/law/mulaw-encode.c (gst_mulawenc_chain): Signeness fix. + + * gst/law/alaw-encode.c (alawenc_getcaps): Remove unneeded + declarations. Typo (probably crasher) fix. + + * gst/law/mulaw-encode.c (mulawdec_getcaps): + * gst/law/mulaw-encode.c (mulawenc_getcaps): + * gst/law/alaw-decode.c (alawdec_getcaps): Same crasher fix. + + * gst/goom/gstgoom.c (gst_goom_init): Hook up the event function. + + * gst/effectv/gstwarp.c (gst_warptv_setup): Signedness fix. + + * gst/effectv/gstdice.c (gst_dicetv_draw): Um, deferencing + uninitialized pointer not good. + + * gst/videofilter/gstvideoexample.c (plugin_init): + * gst/videofilter/Makefile.am (libgstvideoexample_la_LIBADD): Link + to libgstvideofilter instead of gst_library_load. + + * gst/alpha/gstalpha.c (gst_alpha_chroma_key_i420) + (gst_alpha_chroma_key_ayuv): Signedness fixen. + +2005-06-29 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + Fix case where outpad could not be decided. + +2005-06-29 Andy Wingo + + * ext/Makefile.am (MAD_DIR): Add mad to the build. + +2005-06-28 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + Fix old RPAD macro. + basesrc -> base_src + +2005-06-27 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): + * ext/mad/gstmad.c: (gst_mad_chain): + RPAD_ -> PAD + Fix args in bufferalloc function call. + Makes the mad plugin compile again + +2005-06-27 Owen Fraser-Green + + * gst/realmedia/rmdemux.c: Rewrote to use gstadapter. Also parses + audio and video header packets for known properties. + +2005-06-23 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Make rtspsrc a live source. + Don't try to parse NULL urls. + +2005-06-23 Wim Taymans + + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + Make udpsrc a live source. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + Use versioned net lib. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + Fix hack in makefile. + +2005-06-02 Andy Wingo + + * ext/mad/gstid3tag.c: Finish porting to 0.9: no more gstdata, + check for link functions before calling them, give + gst_message_new_tag its own copy of the tag list, set the parser + state before sending the event (because in 0.9 events are + processed immediately), casting fixes. + + * ext/mad/Makefile.am (libgstmad_la_LDFLAGS): Link with + gsttagedit. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_finalize), + (gst_multiudpsink_get_times), (gst_multiudpsink_render), + (gst_multiudpsink_set_property), (gst_multiudpsink_init_send), + (gst_multiudpsink_add), (client_compare), (free_client), + (gst_multiudpsink_remove), (gst_multiudpsink_clear), + (gst_multiudpsink_get_stats): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_unlock), (gst_udpsrc_stop): + Use NetBuffer and small cleanups. + Implement client removal in multiudpsink. + +2005-06-02 Wim Taymans + + * gst/rtsp/README: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + * gst/rtsp/rtsptransport.c: (rtsp_transport_new), + (rtsp_transport_init), (parse_mode), (parse_range), + (rtsp_transport_parse), (rtsp_transport_free): + RTSP cleanups. + +2005-06-02 Wim Taymans + + * gst/effectv/gstquark.c: (gst_quarktv_chain): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_init), (gst_video_box_sink_setcaps), + (gst_video_box_chain): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_getcaps), (gst_videorate_setcaps), + (gst_videorate_init), (gst_videorate_event), (gst_videorate_chain), + (gst_videorate_change_state): + Bufferalloc changes. + +2005-05-25 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_chain), (gst_mad_change_state): + * ext/sidplay/gstsiddec.cc: + * gst/alpha/gstalpha.c: (gst_alpha_chain): + * gst/goom/gstgoom.c: (gst_goom_chain): + No need to take the lock anymore, core already did + that before calling us. + +2005-05-25 Wim Taymans + + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_base_init), + (gst_amrnbenc_finalize), (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_query), (gst_amrnbparse_chain), + (gst_amrnbparse_read_header), (gst_amrnbparse_loop), + (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): + Core already took the lock. + +2005-05-19 Ronald S. Bultje + + * configure.ac: + * ext/esd/Makefile.am: + Disable tcp elements and esdmon (they don't compile). + +2005-05-19 Jan Schmidt + + * Makefile.am: + * ext/Makefile.am: + * sys/Makefile.am: + Make my automake version shut up about undefined variables + * gst/goom/gstgoom.c: + GstAdapter moved to base objects. + +2005-05-18 Wim Taymans + + * ext/amrnb/Makefile.am: + * ext/amrnb/amrnb.c: (plugin_init): + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), + (gst_amrnbdec_setcaps), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_get_type), + (gst_amrnbenc_base_init), (gst_amrnbenc_class_init), + (gst_amrnbenc_init), (gst_amrnbenc_finalize), + (gst_amrnbenc_setcaps), (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbenc.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_query), (gst_amrnbparse_event), + (gst_amrnbparse_chain), (gst_amrnbparse_read_header), + (gst_amrnbparse_loop), (gst_amrnbparse_sink_activate), + (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Ported AMR decoder/parse. + Added AMR encoder. + +2005-05-18 Wim Taymans + + * configure.ac: + * gst/goom/Makefile.am: + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_sink_setcaps), + (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_event), + (gst_goom_chain), (gst_goom_change_state), (plugin_init): + Ported goom. + Added goom and alpha to build. + +2005-05-17 Wim Taymans + + * configure.ac: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), + (gst_alpha_sink_setcaps), (gst_alpha_chain): + Ported alpha, remove alphacolor as functionality is in + ffmpegcolorspace. + +2005-05-17 Wim Taymans + + * ext/libcaca/gstcacasink.c: (gst_cacasink_setcaps), + (gst_cacasink_render), (gst_cacasink_open), (gst_cacasink_close), + (gst_cacasink_change_state): + * ext/libcaca/gstcacasink.h: + Cleanups. + +2005-05-15 David Schleef + + Move core plugins out of core. I don't mind fdsrc/fdsink + going back into the core; they were just disabled there, so + I moved them. Some of this stuff could (should) be deleted. + * gst/oldcore/Makefile.am: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstaggregator.h: + * gst/oldcore/gstelements.c: + * gst/oldcore/gstfdsink.c: + * gst/oldcore/gstfdsink.h: + * gst/oldcore/gstfdsrc.c: + * gst/oldcore/gstfdsrc.h: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmd5sink.h: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstpipefilter.h: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gstshaper.h: + * gst/oldcore/gststatistics.c: + * gst/oldcore/gststatistics.h: + +2005-05-13 Christian Schaller + + * ext/Makefile.am: dist esd directory + * gst-plugins.spec.in: add rtp plugins and esd plugin + * gst/effectv/Makefile.am: fix videofilter linking + * gst/rtp/Makefile.am: add missing headers + * gst/rtsp/Makefile.am: add missing headers + +2005-05-12 Wim Taymans + + * configure.ac: + * ext/sidplay/gstsiddec.cc: + Add working plugins to build. + Make sidplay compile again. + +2005-05-12 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): + * ext/mad/gstmad.c: (gst_mad_chain): + Fix mad and id3tag compilation again. + +2005-05-12 Wim Taymans + + * gst/udp/.cvsignore: + * gst/udp/Makefile.am: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_finalize), + (gst_multiudpsink_get_times), (gst_multiudpsink_render), + (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_close), + (gst_multiudpsink_add), (gst_multiudpsink_remove), + (gst_multiudpsink_clear), (gst_multiudpsink_get_stats), + (gst_multiudpsink_change_state): + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudp-marshal.list: + * gst/udp/gstudp.c: (plugin_init): + * gst/udp/gstudp.h: + * gst/udp/gstudpsink.c: (gst_udpsink_get_type), + (gst_udpsink_base_init), (gst_udpsink_class_init), + (gst_udpsink_init), (gst_udpsink_set_uri), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_uri_get_type), (gst_udpsink_uri_get_protocols), + (gst_udpsink_uri_get_uri), (gst_udpsink_uri_set_uri), + (gst_udpsink_uri_handler_init): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_unlock), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Added multifdsink to send UDP to multiple addresses. + Cleaned up UDP source/sink elements some more. + Make UDP sink extends from multiudpsink. + +2005-05-12 Tim-Philipp Müller + + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event): + Make queries actually work (update core first). + +2005-05-12 Wim Taymans + + * gst/rtsp/README: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get_type), + (gst_tcpclientsrc_base_init), (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init), (gst_tcpclientsrc_getcaps), + (gst_tcpclientsrc_stop), (gst_tcpclientsrc_eos), + (gst_tcpclientsrc_create), (gst_tcpclientsrc_start): + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get_type), + (gst_tcpserversrc_base_init), (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_create), + (gst_tcpserversrc_start), (gst_tcpserversrc_stop): + * gst/tcp/gsttcpserversrc.h: + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get_type), + (gst_tcpsrc_base_init), (gst_tcpsrc_class_init), (gst_tcpsrc_init), + (gst_tcpsrc_create), (gst_tcpsrc_start), (gst_tcpsrc_stop): + * gst/tcp/gsttcpsrc.h: + * gst/udp/gstudpsink.c: (gst_udpsink_base_init), + (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_change_state): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Make UDP and TCP elements use PushSrc. + + +2005-05-11 Tim-Philipp Müller + + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_src_query), + (index_seek), (normal_seek), (gst_mad_sink_event): + Port to new query API and replace gst_pad_convert() + and gst_pad_get_formats() usage. gstid3tag looks like + it needs some more love before it will work again, if + not a rewrite. + +2005-05-12 Zeeshan Ali + + * gst/effectv/Makefile.am: + Fixed the effectv build again. + +2005-05-11 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_get_type), + (gst_multifdsink_base_init), (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_render), + (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), + (gst_tcpclientsink_base_init), (gst_tcpclientsink_class_init), + (gst_tcpclientsink_init), (gst_tcpclientsink_render), + (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property), + (gst_tcpclientsink_change_state): + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpplugin.c: (plugin_init): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init): + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_get_type), + (gst_tcpsink_base_init), (gst_tcpsink_class_init), + (gst_tcpsink_setcaps), (gst_tcpsink_init), (gst_tcpsink_get_times), + (gst_tcpsink_render), (gst_tcpsink_set_property), + (gst_tcpsink_get_property): + * gst/tcp/gsttcpsink.h: + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_class_init), (gst_tcpsrc_get): + Ported over some sink elements. + Sources not ported yet as they require a PushSource base class. + +2005-05-11 Tim-Philipp Müller + + * gst/effectv/Makefile.am: + * gst/videofilter/Makefile.am: + Turn videofilter into a library (private for now) + +2005-05-11 Wim Taymans + + * gst/rtsp/README: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play): + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_send), (read_line), (parse_request_line), + (parse_line), (read_body), (rtsp_connection_receive), + (rtsp_connection_free): + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.c: (rtsp_find_method): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.c: (rtsp_message_set_body), + (rtsp_message_take_body): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtspstream.h: + * gst/rtsp/sdpmessage.c: (sdp_parse_line): + Added README + Some cleanups. + +2005-05-11 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), + (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_close), + (gst_rtspsrc_play), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Setup UDP sources correctly, receives raw data from RTSP + compliant servers now. + +2005-05-11 Wim Taymans + + * gst/rtsp/.cvsignore: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtsp.c: (plugin_init): + * gst/rtsp/gstrtsp.h: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_get_type), (gst_rtspsrc_base_init), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (gst_rtspsrc_create_stream), (rtspsrc_add_element), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_activate), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_open), + (rtsp_connection_create), (append_header), (rtsp_connection_send), + (read_line), (read_string), (read_key), (parse_response_status), + (parse_line), (read_body), (rtsp_connection_receive), + (rtsp_connection_close): + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_method_as_text), + (rtsp_header_as_text), (rtsp_status_as_text), + (rtsp_status_to_string), (rtsp_find_header_field): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), + (rtsp_message_init_request), (rtsp_message_new_response), + (rtsp_message_init_response), (rtsp_message_init_data), + (rtsp_message_add_header), (rtsp_message_remove_header), + (rtsp_message_get_header), (rtsp_message_get_header_copy), + (rtsp_message_set_body), (rtsp_message_set_body_copy), + (rtsp_message_get_body), (rtsp_message_get_body_copy), (dump_mem), + (dump_key_value), (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtspstream.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_new), + (rtsp_transport_init), (parse_mode), (parse_range), + (rtsp_transport_parse), (rtsp_transport_free): + * gst/rtsp/rtsptransport.h: + * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): + * gst/rtsp/rtspurl.h: + * gst/rtsp/sdp.h: + * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), + (sdp_message_clean), (sdp_message_free), (sdp_media_new), + (sdp_media_init), (sdp_message_set_origin), + (sdp_message_get_origin), (sdp_message_set_connection), + (sdp_message_get_connection), (sdp_message_add_bandwidth), + (sdp_message_add_time), (sdp_message_add_zone), + (sdp_message_set_key), (sdp_message_get_key), + (sdp_message_get_attribute_val), (sdp_message_add_attribute), + (sdp_message_add_media), (sdp_media_add_attribute), + (sdp_media_add_bandwidth), (sdp_media_add_format), + (sdp_media_get_attribute_val), (read_string), (read_string_del), + (sdp_parse_line), (sdp_message_parse_buffer), (print_media), + (sdp_message_dump): + * gst/rtsp/sdpmessage.h: + * gst/rtsp/test.c: (main): + Ported to 0.9. + Set up transports, init UDP ports, init RTP session managers. + +2005-05-11 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), + (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_chain_rtp), + (gst_rtpdec_chain_rtcp), (gst_rtpdec_set_property), + (gst_rtpdec_get_property), (gst_rtpdec_change_state), + (gst_rtpdec_plugin_init): + * gst/rtp/gstrtpdec.h: + * gst/udp/gstudpsink.c: (gst_udpsink_base_init), + (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_change_state): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_loop), (gst_udpsrc_set_uri), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_init_receive), + (gst_udpsrc_activate), (gst_udpsrc_change_state), + (gst_udpsrc_uri_get_type), (gst_udpsrc_uri_get_protocols), + (gst_udpsrc_uri_get_uri), (gst_udpsrc_uri_set_uri), + (gst_udpsrc_uri_handler_init): + * gst/udp/gstudpsrc.h: + UDP fixes, added uri handler. + Added rtpdec that will manage the RTP session in the future. + +2005-05-10 Arwed v. Merkatz + + * PORTED_09: + * configure.ac: + * ext/Makefile.am: + * ext/esd/Makefile.am: + * ext/esd/esdsink.c: (gst_esdsink_get_type), + (gst_esdsink_class_init), (gst_esdsink_init), + (gst_esdsink_dispose), (gst_esdsink_change_state), + (gst_caps_set_each), (gst_esdsink_getcaps), (gst_esdsink_open), + (gst_esdsink_close), (gst_esdsink_write), (gst_esdsink_delay), + (gst_esdsink_reset), (gst_esdsink_set_property), + (gst_esdsink_get_property), (gst_esdsink_factory_init): + * ext/esd/esdsink.h: + * ext/esd/gstesd.c: (plugin_init): + Ported esdsink plugin + +2005-05-10 Wim Taymans + + * gst/udp/Makefile.am: + * gst/udp/gstudpsink.c: (gst_udpsink_get_type), + (gst_udpsink_base_init), (gst_udpsink_class_init), + (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_init_send), (gst_udpsink_close), + (gst_udpsink_change_state): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_base_init), + (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_loop), + (gst_udpsrc_set_property), (gst_udpsrc_get_property), + (gst_udpsrc_init_receive), (gst_udpsrc_close), + (gst_udpsrc_activate), (gst_udpsrc_change_state): + * gst/udp/gstudpsrc.h: + Ported udp src/sink. + +2005-05-09 Zaheer Abbas Merali + + * PORTED_09: + * configure.ac: + * ext/Makefile.am: + * ext/shout2/Makefile.am: + * ext/shout2/gstshout2.c: (gst_shout2send_get_type), + (gst_shout2send_base_init), (gst_shout2send_class_init), + (gst_shout2send_init), (gst_shout2send_event), + (gst_shout2send_render), (gst_shout2send_set_property), + (gst_shout2send_get_property), (gst_shout2send_setcaps), + (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + + Port shout2 plugin + +2005-05-08 Zeeshan Ali + + * configure.ac: + * ext/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), + (gst_cacasink_class_init), (gst_cacasink_get_times), + (gst_cacasink_setcaps), (gst_cacasink_init), (gst_cacasink_render), + (plugin_init): + * ext/libcaca/gstcacasink.h: + Ported the libcaca plugin. + +2005-05-08 Zeeshan Ali + + * configure.ac: + * ext/mad/Makefile.am: + * effectv/Makefile.am: + Fixed a few things to enable the mad and effectv to be able to find the + headers in the gst-plugins-base/gst-libs and to link against the libs + in there. + +2005-05-07 Zeeshan Ali + + * configure.ac: + Fixed the build by fixing a small mistake of Wim. + +2005-05-06 Wim Taymans + + * configure.ac: + * ext/aalib/Makefile.am: + * ext/aalib/gstaasink.c: (gst_aasink_get_type), + (gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps), + (gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render), + (gst_aasink_set_property), (gst_aasink_get_property), + (gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state): + * ext/aalib/gstaasink.h: + * gst/smpte/Makefile.am: + * gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init), + (gst_smpte_collected): + * gst/smpte/gstsmpte.h: + Ported 2 more plugins. usgly hack in the Makefile.am though, I'm + sure someone will fix it. + +2005-05-06 Christian Schaller + + * configure.ac: add sidplay + * ext/Makefile.am: add sidplay + * ext/sidplay/Makefile.am: add GST_PLUGINS_CFLAGS + * ext/sidplay/gstsiddec.cc: remove bytestream.h + +2005-05-06 Christian Schaller + + * configure.ac: add gst-plugins-libs + +2005-05-06 Wim Taymans + + * configure.ac: + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + Ported sidplay. + +2005-05-06 Christian Schaller + + * configure.ac: + * ext/mad/Makefile.am: add linking of gstinterfaces + * ext/mad/gstid3tag.c: (plugin_init): remove library_load + * gst-plugins.spec.in: + * gst/effectv/Makefile.am: link to libgstvideofilter + * gst/effectv/gsteffectv.c: (plugin_init): same as for mad + * gst/videofilter/Makefile.am: make sure videoflip is not built + +2005-05-06 Wim Taymans + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_setcaps), + (gst_alawdec_init), (gst_alawdec_chain): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_setcaps), + (gst_alawenc_init), (gst_alawenc_chain): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_setcaps), + (gst_mulawdec_init), (gst_mulawdec_chain): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_setcaps), + (gst_mulawenc_init), (gst_mulawenc_chain): + Ported alaw and mulaw plugins to 0.9, fixed the negotiation as + well. + +2005-05-06 Christian Schaller + + * ext/alsa: removed plugins that are now in gst-plugins-base + * ext/gnomevfs: + * ext/theora: + * ext/vorbis: + * gst/adder: + * gst/audioconvert: + * gst/ffmpegcolorspace: + * gst/typefind: + * gst/videofilter: comment out videoflip and gamma plugins + +2005-05-06 Christian Schaller + + * gst-libs: Remove all files as this is in gst-plugins-base now + * gst-libs/README: add a remove informing of this move + +2005-05-06 Christian Schaller + + * PORTED_09: update to add videofilter + * configure.ac: re-add videofilter + * gst/videofilter/Makefile.am: remove videobalance (not ported yet) + * gst/videofilter/gstgamma.c: (gst_gamma_class_init): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_getcaps), + (gst_videofilter_setcaps), (gst_videofilter_init), + (gst_videofilter_chain), (gst_videofilter_set_output_size): + * gst/videofilter/gstvideoflip.c: (gst_videoflip_class_init): + +2005-05-06 Christian Schaller + + * ext/mad: ported plugin from threaded branch + * gst/effectv: ported plugins from threaded branch + * gst/law: enable law plugin as it compiles (Wim will fixor) + +2005-05-06 Zaheer Abbas Merali + + * configure.ac: + fix typo + +2005-05-05 Christian Schaller + + * Update configure.ac and Makefiles to only build what is actually + ported and not moved into gst-plugins-base + +2005-02-22 Thomas Vander Stichele + + * configure.ac: + hunting season on 0.9 is now OPEN + +2005-02-22 Ronald S. Bultje + + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Kick the hell out of gcc for not warning me about a symbol conflict. + +2005-02-22 Luca Ognibene + + Reviewed by: Tim-Philipp Müller + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link): + Don't leak caps string (fixes #168134) + + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init), + (gst_jpegenc_init), (gst_jpegenc_finalize), + (gst_jpegenc_change_state): + Don't leak line buffers and context struct (fixes #168133). + +2005-02-21 Tim-Philipp Müller + + * configure.ac: + * ext/dirac/gstdiracdec.cc: + (gst_diracdec_chain): + Since dirac 0.5.0 the framerate in dirac is expressed as a + rational number. Fix build and up requirement to 0.5.0, and + also pass parameters to gst_diracdec_link in the right order + (fixes #167959). + +2005-02-21 Maciej Katafiasz + + * ext/faad/gstfaad.c: (gst_faad_sinkconnect), (gst_faad_chain): + * ext/faad/gstfaad.h: + TEH LONGEST DEBUGGING SESSION EVAR is over. Fix interaction with + certain invalid muxed streams, where some packets will contain + junk after decoder data. Partially fixes #149158. + +2005-02-21 Jan Schmidt + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain): + Make sure we only write to writable buffers + +2005-02-20 Tim-Philipp Müller + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Do actually fix invalid RIFF fmt header values for alaw + and mulaw audio instead of just saying so. + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Give gst_riff_create_audio_caps_with_data() a chance to + fix up broken format header fields before extracting any + parameters from the header. (fixes #167633) + +2005-02-19 Martin Holters + + Reviewed by: Tim-Philipp Müller + + * gst/audioconvert/bufferframesconvert.c: + (buffer_frames_convert_link): + Don't leak othercaps. (fixes #167878) + +2005-02-19 Arwed v. Merkatz > + + * configure.ac: + * ext/libvisual/visual.c: (gst_visual_srclink), + (gst_visual_change_state): + Support libvisual 0.2.0. + +2005-02-18 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_chain): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain): + Use same rowstrides for I420 as used everywhere else. + +2005-02-17 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: (gst_avi_demux_invert): + Declare variables at beginning of block and make gcc-2.95 happy + (fixes # 167482, patch by Gergely Nagy). + + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + Move some includes into the header, so that struct sockaddr_in is + defined when it should be defined on FreeBSD as well (fixes + #167483). + + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): + Don't pass uninitialised values to setsockopt() here either. + +2005-02-17 Luca Ognibene + + Reviewed by: Tim-Philipp Müller + + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send): + Don't pass uninitialised values to setsockopt(). (fixes #167704) + +2005-02-16 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (add_sink): + Invert bin_add/link order to workaround deadlock in opt. + +2005-02-15 Ronald S. Bultje + + * gst/modplug/gstmodplug.cc: + Add missing break causing position queries to fail. + +2005-02-15 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_populate): + Granpos can apparently be -1, which screws up calculations... + +2005-02-16 Jan Schmidt + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_send_pending_navigation), + (gst_ximagesink_navigation_send_event), (gst_ximagesink_finalize), + (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_send_pending_navigation), + (gst_xvimagesink_navigation_send_event), + (gst_xvimagesink_finalize), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: + Use a mutex protected list to marshal navigation + events into the stream thread from whichever thread + sends them. + +2005-02-15 Tim-Philipp Müller + + * gst/speed/demo-mp3.c: (time_tick_cb), (main): + Display current position and track length; misc. clean-ups. + + * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query), + (speed_init), (speed_chain): + Add query function, so that the stream length and current position + get adjusted when queried (note that current position queries may + still be wrong if the audio sink returns values based on buffer + timestamps instead of passing on the query). + +2005-02-13 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (gst_audio_convert_channels): + create channel conversion matrix when linking + * gst/audioconvert/.cvsignore: + * gst/audioconvert/Makefile.am: + * gst/audioconvert/channelmixtest.c: (main): + add (ugly) test that ensures stereo <=> mono conversion works + correctly + +2005-02-13 Benjamin Otte + + * gst/audioconvert/gstchannelmix.h: + include missing header file + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_fill_compatible): + use same sign for both channels when converting to/from compatible + channel. Previously used different signs made the signals cancel + each other out and appear like silence. (fixes #167269) + +2005-02-12 Tim-Philipp Müller + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: + Convert to and from YV12 (fixes #156379). + +2005-02-12 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_sink_link), (gst_ximagesink_change_state), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_expose), (gst_ximagesink_set_property), + (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface + methods from chain and negotiation and vice versa (Fixes #166142). + * sys/ximage/ximagesink.h: Add stream_lock. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_expose): Check for xcontext before trying to link. + +2005-02-12 Tim-Philipp Müller + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_open): + Don't send "Hey! You gave me a NULL pointer you naughty person" as + error message when we can't open the DVD device (when dvdnav_open() + fails, src->dvdnav is NULL, so dvdnav_err_to_string() will return + the above). Send something more useful instead (fixes #167117). + +2005-02-11 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_sink_link), (gst_xvimagesink_change_state), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_expose), (gst_xvimagesink_set_property), + (gst_xvimagesink_finalize), (gst_xvimagesink_init): Protect interface + methods from chain and negotiation and vice versa (Fixes #166142). + Fix a possible bug of images in the buffer pool being discarded because + we are looking at the wrong geometry. + * sys/xvimage/xvimagesink.h: Add stream_lock. + +2005-02-11 David Schleef + + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer): Change uint to + unsigned int. (fixes #167128) + +2005-02-11 David Schleef + + * gst/librfb/Makefile.am: Testing stuff before committing is + for wimps... and people with fast machines. Fix stupid + mistake. + +2005-02-11 David Schleef + + * configure.ac: Pull in librfb from my CVS tree, because it is + too small and annoying to be separate. Move rfbsrc plugin + to gst/. + * ext/Makefile.am: + * ext/librfb/Makefile.am: + * ext/librfb/gstrfbsrc.c: + * gst/librfb/Makefile.am: + * gst/librfb/gstrfbsrc.c: + * gst/librfb/rfb.c: + * gst/librfb/rfb.h: + * gst/librfb/rfbbuffer.c: + * gst/librfb/rfbbuffer.h: + * gst/librfb/rfbbytestream.c: + * gst/librfb/rfbbytestream.h: + * gst/librfb/rfbcontext.h: + * gst/librfb/rfbdecoder.c: + * gst/librfb/rfbdecoder.h: + * gst/librfb/rfbutil.h: + +2005-02-10 Tim-Philipp Müller + + * gst/speed/Makefile.am: + * gst/speed/demo-mp3.c: (main): + * gst/speed/filter.func: + * gst/speed/gstspeed.c: (speed_link), (speed_parse_caps), + (speed_class_init), (speed_init), (speed_chain_int16), + (speed_chain_float32), (speed_chain), (speed_set_property), + (speed_get_property), (speed_change_state): + * gst/speed/gstspeed.h: + Fix speed element and make it chain-based (fixes #156467), + and make it handle more than one channel. + +2005-02-10 Jan Schmidt + + * ext/dts/gstdtsdec.c: (gst_dtsdec_init), (gst_dtsdec_channels), + (gst_dtsdec_handle_event), (gst_dtsdec_handle_frame), + (gst_dtsdec_chain), (gst_dtsdec_change_state): + * ext/dts/gstdtsdec.h: + Don't clobber the stack constructing the channels array. + Make the element chain-based. DTS tracks can now be played. + +2005-02-09 Tim-Philipp Müller + + * gst-libs/gst/audio/multichannel.h: + * gst-libs/gst/gconf/gconf.h: + * gst-libs/gst/idct/idct.h: + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/play/play.h: + * gst-libs/gst/resample/private.h: + * gst-libs/gst/resample/resample.h: + * gst-libs/gst/riff/riff-ids.h: + * gst-libs/gst/video/video.h: + * gst-libs/gst/video/videosink.h: + Add G_BEGIN_DECLS and G_END_DECLS around headers where + missing, so that they work when included from C++ code. + +2005-02-09 David Schleef + + * testsuite/gst-lint: Check for non-statically scoped + parent_class variables. This won't be a problem once + plugins are loaded with RTLD_LOCAL. + +2005-02-09 Ronald S. Bultje + + * ext/mplex/gstmplexibitstream.cc: + gcc madness. + +2005-02-09 Ronald S. Bultje + + * ext/ogg/gstogmparse.c: + * gst/debug/gstnavigationtest.c: + Die, thou faulty symbol pollutors (non-static parent_class). + +2005-02-08 Ronald S. Bultje + + * ext/mplex/gstmplexibitstream.cc: + Fix event handling (#165525). + +2005-02-08 Ronald S. Bultje + + * ext/mikmod/gstmikmod.c: + * gst/modplug/gstmodplug.cc: + Add missing endianness to template (fixes #165509). + +2005-02-08 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_data): + Fix wrong order of reading of optional bytes (#165290). + +2005-02-08 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Implement FILLER event awareness. + +2005-02-08 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_convert): + Fix track calculations (#166208). + +2005-02-08 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain): + * ext/libpng/gstpngenc.c: + Fix byte-order, use proper fixed caps. Fixes #164197. + +2005-02-08 Jan Schmidt + + * configure.ac: + Add dvdlpcmdec + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_reset), + (free_all_buffers), (gst_mpeg2dec_alloc_buffer): + Don't push buffers if the src pad isn't negotiated yet. + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format), + (gst_audio_convert_buffer_from_default_format): + Add support for 24-bit width. + + * gst/dvdlpcmdec/.cvsignore: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_get_type), + (gst_dvdlpcmdec_base_init), (gst_dvdlpcmdec_class_init), + (gst_dvdlpcm_reset), (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), + (gst_dvdlpcmdec_chain), (gst_dvdlpcmdec_change_state), + (plugin_init): + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + New decoder for rearranging DVD LPCM into our audio/x-raw-int + format. Needs support for the channels maps if someone can find + a DVD LPCM track with > 2 channels. + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_handle_dvd_event), + (gst_dvd_demux_send_discont), (gst_dvd_demux_handle_discont), + (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_process_private): + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), + (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_init_stream), + (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_handle_src_query): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_reset), + (gst_mpeg_parse_parse_packhead), (gst_mpeg_parse_loop), + (gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src), + (gst_mpeg_parse_handle_src_query), + (gst_mpeg_parse_handle_src_event): + Use audio/x-dvd-lpcm for LPCM output. + Add DTS output. + +2005-02-08 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/alpha/gstalphacolor.c: (gst_alpha_color_sink_link), + (transform_rgb), (transform_bgr), (gst_alpha_color_chain): + Add BGRA handling (#165736). + +2005-02-08 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_link): + * gst/law/alaw-encode.c: (alawenc_link): + * gst/law/mulaw-decode.c: (mulawdec_link): + * gst/law/mulaw-encode.c: (mulawenc_link): + Fix caps memleaks (#166600). + +2005-02-08 Tim-Philipp Müller + + * ext/tarkin/mem.h: + * ext/tarkin/wavelet.h: + * ext/tarkin/yuv.h: + * gst/ffmpegcolorspace/avcodec.h: + Include "_stdint.h" instead of . Fixes build on + systems that don't have stdint.h, like Solaris9 (fixes #166631). + +2005-02-05 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_clear), + (gst_xvimagesink_change_state): + Clear window on PAUSED->READY instead of READY->PAUSED. Stop + Xv video (and thereby regenerate Xv colourkey) in clear() so + that PLAY -> READY -> PLAY works (fixes #162504). + +2005-02-05 Ronald S. Bultje + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_getcaps): + Switch to list instead of range, since MJPEG-devices really just + support decimations, not any size. + +2005-02-05 Jan Schmidt + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_open_decoder), + (gst_mpeg2dec_reset), (free_all_buffers), + (gst_mpeg2dec_alloc_buffer), (handle_sequence): + * ext/mpeg2dec/gstmpeg2dec.h: + The libmpeg2 user-allocated buffer management is awkward, + to say the least. Hopefully this fixes things. + +2005-02-04 Andy Wingo + + * gst/audioconvert/bufferframesconvert.c + (buffer_frames_convert_fixate): New function, fixates to 256 + frames per buffer by default. (Much better than 1.) + (buffer_frames_convert_init): Set the fixate function for both src + and sink pad. + (buffer_frames_convert_link): After success setting nonfixed caps, + get the negotiated caps so we can know how many buffer-frames it + will be. No idea how this worked at all before. + +2005-02-05 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_close_decoder), (put_buffer), (check_buffer), + (free_buffer), (free_all_buffers), (gst_mpeg2dec_alloc_buffer), + (handle_sequence), (handle_picture): + * ext/mpeg2dec/gstmpeg2dec.h: + Rearrange buffer tracking and refcounting and refactor + a little for readability. + +2005-02-04 Jan Schmidt + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4ljpegsrc.c: (gst_v4ljpegsrc_get_type), + (gst_v4ljpegsrc_base_init), (gst_v4ljpegsrc_class_init), + (gst_v4ljpegsrc_init), (gst_v4ljpegsrc_src_link), + (gst_v4ljpegsrc_getcaps), (gst_v4ljpegsrc_get): + * sys/v4l/gstv4ljpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_open), (gst_v4lsrc_src_link): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_palette_name), + (gst_v4lsrc_get_fps): + * sys/v4l/v4lsrc_calls.h: + Add new v4ljpegsrc for handling the ov51x hacky "I'll give + you jpeg inside rgb frames" driver. + Don't error in the v4lsrc link function, just return + REFUSED. + +2005-02-03 Ronald S. Bultje + + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), + (gst_qcamsrc_open): + Use GST_ELEMENT_ERROR, not g_warning, if open failed. + +2005-02-02 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Change caps on MJPEG-B so it doesn't interfere with MJPEG/JPEG. + +2005-02-02 Ronald S. Bultje + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_change_state): + Reset negotiated state on PAUSED->READY. + +2005-02-02 David Schleef + + * configure.ac: Put DEFAULT_AUDIOSINK in config.h and use + whereever possible. (Fixes #165997) + * examples/capsfilter/capsfilter1.c: (main): + * examples/dynparams/filter.c: (create_ui): + * examples/seeking/cdparanoia.c: (get_track_info), (main): + * examples/seeking/chained.c: (main): + * examples/seeking/seek.c: (make_mod_pipeline), (make_dv_pipeline), + (make_wav_pipeline), (make_flac_pipeline), (make_sid_pipeline), + (make_vorbis_pipeline), (make_mp3_pipeline), (make_avi_pipeline), + (make_mpeg_pipeline), (make_mpegnt_pipeline): + * examples/seeking/spider_seek.c: (make_spider_pipeline): + * examples/switch/switcher.c: (main): + * ext/dv/demo-play.c: (main): + * ext/faad/gstfaad.c: (gst_faad_change_state): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/smoothwave/demo-osssrc.c: (main): + * gst-libs/gst/gconf/gconf.c: (gst_gconf_set_string), + (gst_gconf_render_bin_from_description), + (gst_gconf_get_default_audio_sink), + (gst_gconf_get_default_video_sink), + (gst_gconf_get_default_audio_src), + (gst_gconf_get_default_video_src), + (gst_gconf_get_default_visualization_element): + * gst/level/demo.c: (main): + * gst/level/plot.c: (main): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + * gst/playback/test.c: (gen_video_element), (gen_audio_element): + * gst/playondemand/demo-mp3.c: (setup_pipeline): + * gst/sine/demo-dparams.c: (main): + * gst/spectrum/demo-osssrc.c: (main): + * gst/speed/demo-mp3.c: (main): + * gst/volume/demo.c: (main): + * testsuite/embed/embed.c: (main): + +2005-02-02 Jan Schmidt + + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_class_init), + (gst_tcpclientsink_finalize): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_finalize): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_finalize): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_finalize): + Don't leak the hostname when shutting down. + In tcpserversrc, take a copy of the default hostname. + +2005-02-01 Ronald S. Bultje + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iso_receive): + Set caps to systemstream=TRUE. + +2005-02-01 Ronald S. Bultje + + * testsuite/Makefile.am: + Fix more OSX buildbots. + +2005-02-02 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + Don't send things to NULL PAD_PEERs + + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_chain): + Copy-on-write the incoming buffer. + + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegclock.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (normal_seek), (gst_mpeg_demux_handle_src_event): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: + (gst_mpeg_parse_update_streaminfo), (gst_mpeg_parse_reset), + (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead), + (gst_mpeg_parse_loop), (gst_mpeg_parse_get_rate), + (gst_mpeg_parse_convert_src), (gst_mpeg_parse_handle_src_query), + (gst_mpeg_parse_handle_src_event), (gst_mpeg_parse_change_state): + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstrfc2250enc.h: + Various changes to the way time is computed that make seeking and + total time estimation much better here. + Use G_BEGIN/END_DECLS instead of __cplusplus + + * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): + Use gst_buffer_stamp instead of only copying the TIMESTAMP + +2005-02-01 Ronald S. Bultje + + * gst/subparse/gstsubparse.c: + Fix OSX buildbot. + +2005-01-31 Tim-Philipp Müller + + * ext/theora/theoraenc.c: (theora_buffer_from_packet), + (theora_enc_chain), (theora_enc_change_state): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), + (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_chain), + (gst_vorbisenc_change_state): + * ext/vorbis/vorbisenc.h: + Set granulepos and timestamp correctly for streams not + starting at 0, taking into account the initial delay. + +2005-01-31 Tim-Philipp Müller + + * gst/mpegstream/gstdvddemux.c: + Add audio/x-dts to audio pad template caps + +2005-01-30 David Schleef + + * ext/polyp/polypsink.c: (gst_polypsink_base_init), + (create_context), (gst_polypsink_link): Fix silly endianness + bug. Add some debugging. Remove float from caps; it doesn't + work. Attempt to get remote audio working. + +2005-01-29 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add 3IV2 fourcc. + +2005-01-29 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream), (swap_line), + (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data): + * gst/avi/gstavidemux.h: + Invert DIB images. Fixes #132341. + +2005-01-29 Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_chain): + D'oh, reference the palette data, not the palette structure. + Fixes color distortion in #132341. + +2005-01-29 Ronald S. Bultje + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): + PAR can be non-fixed when not provided as argument (#162626). + +2005-01-29 David Moore + + Reviewed by: Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header): + Re-apply patch from #142272 that allows non-seekable sources, + re-proposed by Daniel Drake . + +2005-01-29 Ronald S. Bultje + + * gst/rtp/gstrtpgsmenc.c: (gst_rtpgsmenc_init): + Use the src template for creating the src pad (#162330). + +2005-01-29 Ronald S. Bultje + + * configure.ac: + * ext/musepack/Makefile.am: + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_class_init), + (gst_musepackdec_init), (gst_musepackdec_dispose), + (gst_musepackdec_src_query), (gst_musepackdec_src_convert), + (gst_musepack_stream_init), (gst_musepackdec_loop), + (gst_musepackdec_change_state): + * ext/musepack/gstmusepackdec.cpp: + * ext/musepack/gstmusepackdec.h: + * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), + (gst_musepack_reader_read), (gst_musepack_reader_seek), + (gst_musepack_reader_tell), (gst_musepack_reader_get_size), + (gst_musepack_reader_canseek), (gst_musepack_init_reader): + * ext/musepack/gstmusepackreader.cpp: + * ext/musepack/gstmusepackreader.h: + Update to 1.1 API (#165446). + +2005-01-28 Ronald S. Bultje + + * ext/Makefile.am: + Unbreak buildbot. + +2005-01-28 Andy Wingo + + * ext/dv/gstdvdec.c: Change the pixel aspect ratio of dvdec output + to reflect a different dubious internet source. Add a reference + and some commentary. + +2005-01-28 Ronald S. Bultje + + * gst/playback/gststreamselector.c: (gst_stream_selector_init), + (gst_stream_selector_get_caps), (gst_stream_selector_chain): + * gst/playback/gststreamselector.h: + Be more selective when we're redoing caps negotiation from + within the chain function on a stream change. + +2005-01-28 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrnb/amrnb.c: (plugin_init): + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_get_type), + (gst_amrnbdec_base_init), (gst_amrnbdec_class_init), + (gst_amrnbdec_init), (gst_amrnbdec_link), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), + (gst_amrnbparse_base_init), (gst_amrnbparse_class_init), + (gst_amrnbparse_init), (gst_amrnbparse_formats), + (gst_amrnbparse_querytypes), (gst_amrnbparse_query), + (gst_amrnbparse_handle_event), (gst_amrnbparse_reserve), + (gst_amrnbparse_loop), (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Add support for AMR-NB (mobile phone audio format; #155163, #163286). + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Add AMR-NB/-WB raw formats. + * ext/alsa/gstalsa.c: (gst_alsa_link): + Keep valid time when changing format. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + Add some more format-specific options (#140141, #143555, #155163). + +2005-01-28 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix logic error in timing of subtitle stream synchronization. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): + Add skip-chunk, which is found in kodak-camera streams. + +2005-01-27 Thomas Vander Stichele + + * po/LINGUAS: + * po/vi.po: + Adding Vietnamese translation (submitted by Clytie Siddall) + +2005-01-27 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (try_to_link_1): + Use realpad for signal. + +2005-01-27 Ronald S. Bultje + + * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_base_init): + Fix category so decodebin picks it up. + +2005-01-27 Ronald S. Bultje + + * ext/mad/Makefile.am: + * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_get_type), + (gst_id3demux_bin_base_init), (gst_id3demux_bin_class_init), + (gst_id3demux_bin_init), (gst_id3demux_bin_remove_pad), + (found_type), (gst_id3demux_bin_change_state): + * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), + (gst_id3_tag_init), (gst_id3_tag_handle_event), + (gst_id3_tag_src_link), (gst_id3_tag_chain), + (gst_id3_tag_change_state), (plugin_init): + * ext/mad/gstmad.h: + Add id3demuxbin (which is a simple bin consisting of id3demux + and typefind), take over rank from id3demux, remove typefind + code from id3demux. Makes all broken mp3s that I know of work, + and thereby fixes #152688. + +2005-01-27 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_src_event): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): + Allow seeks on audio pad, make mad forward those (#164826). + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Set duration (#165335). + +2005-01-27 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), + (gst_asf_demux_commit_taglist), (gst_asf_demux_process_comment), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_change_state), (gst_asf_demux_add_audio_stream), + (gst_asf_demux_add_video_stream), (gst_asf_demux_setup_pad): + * gst/asfdemux/gstasfdemux.h: + Improve metadata display, e.g. if the metadata comes before the + streams are loaded (which is perfectly valid). + +2005-01-27 Ronald S. Bultje + + * tools/gst-launch-ext-m.m: + Fix AVI/ASF pipelines (#165340). + +2005-01-26 Amaury Jacquot + * ext/cairo/gsttextoverlay.c: include string.h and strings.h to fix + build failure on amd64 + +2005-01-26 Tim-Philipp Müller + + * ext/mad/gstid3tag.c: (mad_id3_parse_latin1_string), + (mad_id3_parse_comment_frame), (gst_mad_id3_to_tag_list): + Check environment variables GST_ID3V2_TAG_ENCODING, + GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated + list of character encodings to force interpretation of non-unicode + strings stored in an ID3v2 tag to a particular encoding. If none + is specified, try to use current locale's encoding, then fall back + to ISO-8859-1 (which will always succeed). (Resolves #149274) + * gst/tags/gstid3tag.c: (gst_tag_from_id3_tag), + (gst_tag_extract_id3v1_string), (gst_tag_list_new_from_id3v1): + Check environment variables GST_ID3V1_TAG_ENCODING, + GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated + list of character encodings to use in case a string encountered + in an ID3v1 tag is not valid UTF-8 already. If no encoding is + specified, try to use the current locale's encoding, then fall + back to ISO-8859-1 (which will always succeed). + +2005-01-25 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + - on half framerate, compute the rate in advance so the comparisons + don't compare wrong values + - don't use mad_synth/frame_mute anymore, this mirrors mad_decoder + behaviour + - don't use mad_header_decode anymore, mad_frame_decode does that + automatically + - when getting rid of consumed bytes, reset the stream's skiplen + (fixes #163867) + +2005-01-26 Jan Schmidt + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init) + Use 1/2 a second for default max_discont, as PES streams from DVB + seem to have larger spacings in the SCR. + Fix a typo. + +2005-01-25 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_commit): + Notify delayed stream-info availability. + +2005-01-26 Jan Schmidt + * ext/a52dec/gsta52dec.c: (gst_a52dec_push), + (gst_a52dec_handle_event), (gst_a52dec_chain): + Add some debug output. Check that a discont has a valid + time associated. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop): + Ignore TAG events. A little extra debug for broken timestamps. + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop), + (dvdnavsrc_change_state): + Ensure we send a discont to engage the link before we send any + other events. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init), + (dvdreadsrc_finalize), (_close), (_open), (_seek_title), + (_seek_chapter), (seek_sector), (dvdreadsrc_get), + (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri): + Handle URI of the form dvd://title[,chapter[,angle]]. Currently only + dvd://title works in totem because typefinding sends a seek that ends + up going back to chapter 1 regardless. + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + Output correct timestamps and handle disconts. + * ext/ogg/gstoggdemux.c: (get_relative): + Small guard against a null dereference. + * ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize), + (gst_textoverlay_set_property): + Free memory when done. Don't call gst_event_filler_get_duration on + EOS events. Use GST_LOG and GST_WARNING instead of g_message and + g_warning. + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init), + (draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink), + (gst_sw_srclink), (gst_smoothwave_chain): + Draw solid lines, prettier colours. + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): + Add a default palette that'll work for some movies. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init), + (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont), + (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset): + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), + (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), + (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead): + * gst/mpegstream/gstmpegparse.h: + Use PTM/NAV events when for timestamp adjustment when connected to + dvdnavsrc. Don't use many discont events where one suffices. + * gst/playback/gstplaybasebin.c: (group_destroy), + (gen_preroll_element), (gst_play_base_bin_add_element): + * gst/playback/gstplaybasebin.h: + Make sure we remove subtitles from the same bin we put them in. + * gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip), + (gst_subparse_buffer_format_autodetect), + (gst_subparse_change_state): + Fix some memleaks and invalid accesses. + * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find), + (oggskel_type_find), (cmml_type_find), (plugin_init): + Some typefind functions for Annodex v3.0 files + * gst/wavparse/gstwavparse.h: + GstRiffReadClass is the correct parent class. + +2005-01-25 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add extradata to huffyuv (fixes #165013). + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data): + Fix extradata extraction if it is in the chunk size. + +2005-01-25 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/effectv/gstquark.c: (gst_quarktv_class_init), + (gst_quarktv_change_state), (gst_quarktv_dispose): + Memory free'ing location fix (#164708). + +2005-01-25 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_commit), + (gen_preroll_element), (probe_triggered), (gen_source_element), + (setup_source), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element): + Don't block for streams. + * gst/playback/gststreaminfo.c: (stream_info_change_state), + (gst_stream_info_set_mute): + Use gst_pad_set_active_recursive. + +2005-01-25 Andy Wingo + + * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Fix compile + for #ifndef HAVE_XVIDEO. + +2005-01-24 Jeffrey C. Ollie + + reviewed by: Maciej Katafiasz + + * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_chain): + * ext/gsm/gstgsmdec.h: + * ext/gsm/gstgsmenc.c: (gst_gsmenc_init), (gst_gsmenc_chain): + * ext/gsm/gstgsmenc.h: + Fix rate to 8kHz as per spec, removes obscure errors when no rate + was given by property. Add proper buffer timestamps and offsets. + +2005-01-24 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Audio can be <8000Hz. + +2005-01-22 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Explicit state change to workaround refcount bugs. + +2005-01-22 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_write_tag), + (gst_avimux_riff_get_avi_header): + Fix... + +2005-01-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_element_data), + (gst_riff_read_element_data): + * gst-libs/gst/riff/riff-read.h: + Add _peek version (req'ed in CDXA). + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init), + (gst_cdxaparse_loop): + Fix parsing in playbin. + * gst/playback/gstdecodebin.c: (close_pad_link): + Ignore current_ pads, they cause major annoyance. + +2005-01-19 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Safety guard. + +2005-01-19 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_write_tag): + Fix padding... + +2005-01-19 Ronald S. Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_buffer): + Allow for 0-sized buffers. Fixes length query problems in + starwars.mkv from the testsuite. + +2005-01-19 Tim-Philipp Müller + + * gst/videobox/gstvideobox.c: (gst_video_box_copy_plane_i420), + (gst_video_box_i420), (gst_video_box_chain): + Fix row strides for I420 (fixes #163159) + +2005-01-19 Ronald S. Bultje + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + MPEG2 has a useful rate property, so we can actually use that. + For MPEG-1, continue using the bytes/time properties. + +2005-01-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add intel-h263. + +2005-01-19 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + Fail if caps negotiation fails. Should fix #162184, and should + definately be in there regardless of it fixing the actual bug. + * gst/avi/gstavimux.c: (gst_avimux_get_type), (gst_avimux_init), + (gst_avimux_write_tag), (gst_avimux_riff_get_avi_header), + (gst_avimux_riff_get_avix_header), + (gst_avimux_riff_get_video_header), + (gst_avimux_riff_get_audio_header), (gst_avimux_write_index), + (gst_avimux_start_file), (gst_avimux_handle_event), + (gst_avimux_change_state): + * gst/avi/gstavimux.h: + Refactor structure writing to use GST_WRITE_UINT macros, add + metadata writing support. + +2005-01-18 Ronald S. Bultje + + * gst/playback/gststreaminfo.c: (gst_stream_info_dispose): + Elements may already be destroyed when this function is called. + +2005-01-18 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (gst_qtdemux_handle_esds): + More memory leak fixes (#149162). + +2005-01-18 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_add_stream): + Fix two memleaks. + +2005-01-18 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): + Argh... + +2005-01-17 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): + Fix off-by-one bug. Fixes warnings during playback of sincity.mp4 + when fixating to six channels in Totem. + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: (get_next_cell_for): + Fix compile warnings on Solaris 10 buildbot + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: (_read): + Don't read beyond the last cell in a chapter (fixes + invalid memory access) + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/stream_labels.c: + (dvdreadsrc_get_audio_stream_labels): + Use NULL for an empty GList instead of g_list_alloc(); fix + memory leaks; s/LCPM/LPCM/; use g_strdup_printf() instead + of GString (easier to bulk free later) + +2005-01-17 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps): + Fix BGRA32 caps (#164209). + +2005-01-17 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pixfmt): + alpha_mask can be RGBA/ABGR. Fixes #164265. + +2005-01-17 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), + (gst_mpeg2dec_alloc_buffer): + * ext/mpeg2dec/gstmpeg2dec.h: + Crop if decoding size is not the actual image size (#163676). + +2005-01-17 Steve Baker + + Reviewed by: Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (aiff_type_find), + (svx_type_find), (sds_type_find), (ircam_type_find), (plugin_init): + Add libsndfile typefind functions (#163309). + +2005-01-17 Ronald S. Bultje + + * tools/gst-launch-ext-m.m: + Add .aac, fix .m1v/.m2v (#163891). + +2005-01-17 Ronald S. Bultje + + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_wait): + Sanity check, don't wait endlessly since the clock might not + actually run at this point (which is a deadlock). Fixes #164069. + +2005-01-16 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (probe_triggered): + Of course, only pause if group is done... + +2005-01-16 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (probe_triggered): + Thread safety. + +2005-01-16 Jan Schmidt + + * ext/swfdec/gstswfdec.c: (gst_swfdec_change_state): + Don't return state change success when the parent + failed. + +2005-01-16 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_handle_event): + Free events (fix memleak in #162905). + +2005-01-15 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pixfmt): + Fix for depth = 15. Fixes #161675. + +2005-01-14 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Set FPS correctly, even for webcams and the like. + * sys/v4l/v4l_calls.c: (gst_v4l_set_chan_norm): + Don error on setting while capturing. + +2005-01-14 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + I'm a bad boy. using /1001. to force C to do float division + and not integer division (as it did in my last commit) + Thanks to David I. Lehn for pointing this mistake. + +2005-01-14 Ronald S. Bultje + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + Revert Johan´s 1.35->1.36 since it breaks compat. + +2005-01-14 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + * ext/libfame/gstlibfame.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + replace framerate aproximations by their real value + (24000/1001, 30000/1001, 60000/1001) + Finish fixing bug #164049 + +2005-01-13 Thomas Vander Stichele + + * ext/ogg/gstoggmux.c: + eos/bos debugging + * gst/tcp/gstmultifdsink.c: + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversrc.c: + improve reusability of elements after state changes and errors + make multifdsink throw away streamheaders when receiving new ones + +2005-01-13 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): + Fix for if items are already in list... + +2005-01-12 Benjamin Otte + + * gst/adder/gstadder.c: (gst_adder_loop): + fix adder a bit so it doesn't screw up with events as much anymore + +2005-01-12 Jan Schmidt + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link), + (pixbufscale_scale), (gst_pixbufscale_chain): + * ext/gdk_pixbuf/pixbufscale.h: + Incorporate changes from Tim-Philipp Mueller + to ensure rowstrides are calculated the same way as + ffmpegcolorspace + Use gst_buffer_stamp instead of copying TIMESTAMP manually, so + that we pick up duration and offset also. + +2005-01-11 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_class_init), + (gst_avimux_pad_unlink), (gst_avimux_release_pad): + Reusability fixes. + +2005-01-11 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), + (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): + Update flags when requested. + +2005-01-11 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): + Fix dmix. + +2005-01-11 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (gst_play_base_bin_init), (gst_play_base_bin_dispose), + (probe_triggered), (new_decoded_pad), (gen_source_element), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (gst_play_bin_init), (group_switch), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state): + Implement group-switch signal for use in apps to clear metadata + cache, clean up subtitle, add suburi property instead of # hack, + some error-out fixes. + +2005-01-11 Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Debug. + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame): + If we got a state change in the _get handler, don't return success. + +2005-01-10 Stephane LOEUILLET + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_my_output_message), + (gst_jpegdec_my_emit_message), (gst_jpegdec_init): + Make jpegdec quiet on MJPEG decoding + * gst/asfdemux/README: + Fix mimetypes for MJPEG and H263 + +2005-01-10 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Fix broken code generation by gcc by swapping arguments. + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + Fix \n in debug. + +2005-01-10 Stephane LOEUILLET + + * TODO: + delete this file, it is by far outdated + * ext/alsa/gstalsa.1: remove + * ext/alsa/gstalsa.c: (add_rates), (add_channels), (gst_alsa_caps), + (gst_alsa_check_sample_rates), (gst_alsa_rates_probe), + (gst_alsa_get_caps): + Add HW probing for supported sample rates. Fixes #161704 + +2005-01-10 Ronald S. Bultje + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Don't crash, biatch! :). + +2005-01-10 Ronald S. Bultje + + * ext/musepack/gstmusepackreader.cpp: + * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): + Some work on tags - still doesn't work in playbin... + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Handle events... + +2005-01-10 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): + Also shove tags on kid pads. + +2005-01-10 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): + Don't bail on unknown events. + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Don't crash on events before negotiation. + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Send tags on pads, too. + * gst/playback/gststreamselector.c: + (gst_stream_selector_request_new_pad): + Forward events on first pad if no input was selected yet. + +2005-01-10 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_substreams): + Don't disable streamtype if the stream doesn't exist, since + then playing a video after audio will disable both and nothing + will happen. Fixes the testsuite. + +2005-01-10 Ronald S. Bultje + + * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_interface_init), + (gst_v4l_xoverlay_set_xwindow_id): + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_interface_init), + (gst_v4l2_xoverlay_set_xwindow_id): + Add debug categories, fix overlay disabling. + +2005-01-10 Stephane LOEUILLET + + * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_get_caps): + * ext/alsa/gstalsa.h: + Add HW probing for period_count/size and buffer_size MIX/MAX + Adjust default/user defined value if out of bounds + Should fix bug #162024 + +2005-01-09 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event): + Fix warning (#161191). + +2005-01-09 Stephane LOEUILLET + + * ext/dvdread/stream_labels.c: + (dvdreadsrc_get_audio_stream_labels): + Fix warning (init the good variable in switch default) + +2005-01-09 Koop Mast + + Reviewed by: Ronald S. Bultje + + * gst/tta/gstttaparse.c: (gst_tta_src_event): + Fix gcc-2.95 compile (#163485). + +2005-01-09 Ronald S. Bultje + + * configure.ac: + * ext/flac/gstflacenc.c: (gst_flacenc_init), + (gst_flacenc_seek_callback), (gst_flacenc_write_callback), + (gst_flacenc_tell_callback), (gst_flacenc_chain), + (gst_flacenc_change_state): + * ext/flac/gstflacenc.h: + Update for API change in flac-1.1.1. Update requirement in + configure.ac. Fixes #162974. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_destroy): + Remove hack to get rid of assert and get rid of unlinked + signals properly. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source): + Set source to NULL so that resources are free'ed. Fixes issues + with playback of CDDA and similar device-accessing things. + +2005-01-09 Ronald S. Bultje + + * testsuite/embed/Makefile.am: + test->noinst, fix make test in buildbot. + +2005-01-09 Stephane LOEUILLET + + * ext/dvdread/stream_labels.c: new file + * ext/dvdread/stream_labels.h: new file + * ext/dvdread/Makefile.am: + * ext/dvdread/dvdreadsrc.c: (_seek_title): + Extract audio stream label from DVD IFO files. + It only dump them on the console for now, still have to + make playbin aware of them. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source): + Fix hanging subs. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (gen_preroll_element), (remove_groups), (setup_subtitle), + (gen_source_element), (setup_source): + * gst/playback/gstplaybasebin.h: + Multiple .sub files is just a stupid idea... Fix some threading + mistakes. Interestingly, external .sub files cause playbin to + hang, I don't know why... Parsing fixes contributed by François + Kooman . + +2005-01-09 Ronald S. Bultje + + * testsuite/embed/Makefile.am: + Fix buildbot. + +2005-01-09 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Add compression level property (#163323). + +2005-01-09 Ronald S. Bultje + + * configure.ac: + * examples/capsfilter/capsfilter1.c: (main): + * examples/seeking/spider_seek.c: (make_spider_pipeline): + * ext/dvdread/Makefile.am: + * ext/dvdread/demo-play: + * ext/dvdread/demo-play.c: + * gconf/gstreamer.schemas.in: + * gst-libs/gst/gconf/gconf.c: + * sys/v4l/TODO: + * testsuite/Makefile.am: + * testsuite/embed/Makefile.am: + * testsuite/embed/embed.c: (cb_expose), (main): + Remove all references to xvideosink, fix examples (#140845). + * gst/playback/gstplaybasebin.c: (group_destroy): + Apparently, disposal does not unlink - so do explicitely. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Add debug. + +2005-01-09 Maciej Katafiasz + + * README: fix PKG_CONFIG_PATH instructions, what was there + previously was breaking default search path, not nice. + Fixes #163358 + +2005-01-09 Ronald S. Bultje + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_init), + (gst_audioscale_chain): + %#^@^#@^@#^#@^#@^@#^@#^@#^@#^#@^#@^#@^@#^#@ fix seeking + when resampling - how the ^@$^!@^! is this possible?!? + +2005-01-09 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + Reset variables on READY. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), + (gst_matroska_mux_loop): + Require data before writing header. + +2005-01-09 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_chain): + Don't call mad_stream_sync() directly after recovering sync. + Fixes #151661. + +2005-01-09 Martin Eikermann + + Reviewed by: Ronald S. Bultje + + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init), + (snapshot_handler), (gst_snapshot_sinkconnect), + (gst_snapshot_chain): + Allocate resources when required, fix recursive signal emission + and fix caps. Fixes #161667. + +2005-01-09 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps), + (gst_pngdec_chain): + Handle only 8-bppc (bits-per-pixel-component) images, better + error handling and correct strides. Fixes #163177. + * ext/libpng/gstpngenc.c: (gst_pngenc_sinklink), + (gst_pngenc_chain): + Better error handling. Fixes #163348. + +2005-01-09 Ronald S. Bultje + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_get_type), + (dvdnavsrc_uri_get_type), (dvdnavsrc_uri_get_protocols), + (dvdnavsrc_uri_get_uri), (dvdnavsrc_uri_set_uri), + (dvdnavsrc_uri_handler_init): + Add DVD-nav URI (dvdnav://) for Totem testing purposes. + * gst/playback/gstplaybasebin.c: (gen_source_element): + Add MMS to streaming URIs. + +2005-01-09 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_navigation_send_event): + Check for pad availability before sending event. + +2005-01-08 Ronald S. Bultje + + * gst-plugins.spec.in: + Add subparse. + +2005-01-08 Ronald S. Bultje + + * configure.ac: + Since we use functions from CVS, up requirement. + +2005-01-08 Ronald S. Bultje + + * gst/playback/Makefile.am: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (group_destroy), (group_commit), (group_is_muted), + (gen_preroll_element), (add_stream), (unknown_type), + (probe_triggered), (preroll_unlinked), (mute_stream), + (silence_stream), (new_decoded_pad), (setup_substreams), + (setup_source), (get_active_source), (mute_group_type), + (muted_group_change_state), (set_active_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (add_sink), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), + (gst_stream_info_dispose), (stream_info_mute_pad), + (stream_info_change_state), (gst_stream_info_set_mute): + * gst/playback/gststreamselector.c: (gst_stream_selector_get_type), + (gst_stream_selector_base_init), (gst_stream_selector_class_init), + (gst_stream_selector_init), (gst_stream_selector_dispose), + (gst_stream_selector_get_linked_pad), + (gst_stream_selector_get_caps), (gst_stream_selector_link), + (gst_stream_selector_get_linked_pads), + (gst_stream_selector_request_new_pad), (gst_stream_selector_chain): + * gst/playback/gststreamselector.h: + Adding stream selection support plus required properties for + applications to use this. Fully fixes #100931. + +2005-01-08 Benjamin Otte + + * gst/games/gstpuzzle.c: (nav_event_handler): + - handle nav events differently: forward every event no matter if it + was handled or not. + - translate events + You can now cheat by using navigationtest ! puzzle and moving the + mouse close to the edge of a tile. ;) + +2005-01-08 Ronald S. Bultje + + * configure.ac: + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): + * ext/ogg/gstogmparse.c: (gst_ogm_text_parse_get_type), + (gst_ogm_text_parse_base_init), (gst_ogm_text_parse_init), + (gst_ogm_parse_get_sink_querytypes), (gst_ogm_parse_sink_convert), + (gst_ogm_parse_sink_query), (gst_ogm_parse_chain), + (gst_ogm_parse_plugin_init): + * ext/pango/gsttextoverlay.c: (gst_textoverlay_linkedpads), + (gst_textoverlay_link), (gst_textoverlay_getcaps), + (gst_textoverlay_event), (gst_textoverlay_video_chain), + (gst_textoverlay_loop), (gst_textoverlay_init), (plugin_init): + * ext/pango/gsttextoverlay.h: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_sync_streams), + (gst_matroska_demux_parse_blockgroup), + (gst_matroska_demux_subtitle_caps), + (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + * gst/playback/gstdecodebin.c: (close_pad_link): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (gen_preroll_element), (remove_groups), (add_stream), + (new_decoded_pad), (setup_subtitles), (gen_source_element), + (setup_source): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gen_text_element), (setup_sinks): + * gst/subparse/Makefile.am: + * gst/subparse/gstsubparse.c: (gst_subparse_get_type), + (gst_subparse_base_init), (gst_subparse_class_init), + (gst_subparse_init), (gst_subparse_formats), + (gst_subparse_eventmask), (gst_subparse_event), + (gst_subparse_handle_event), (convert_encoding), (get_next_line), + (parse_mdvdsub), (parse_mdvdsub_init), (parse_subrip), + (parse_subrip_deinit), (parse_subrip_init), (parse_mpsub), + (parse_mpsub_deinit), (parse_mpsub_init), + (gst_subparse_buffer_format_autodetect), + (gst_subparse_format_autodetect), (gst_subparse_loop), + (gst_subparse_change_state), (gst_subparse_type_find), + (plugin_init): + * gst/subparse/gstsubparse.h: + * gst/typefind/gsttypefindfunctions.c: (ogmtext_type_find), + (plugin_init): + Add subtitle support, .sub parser (supports SRT and MPsub), + OGM text support, Matroska UTF-8 text support, deadlock fixes + all over the place, subtitle awareness in decodebin/playbin + and some fixes to textoverlay to handle subtitles in a stream + correctly. Fixes #100931. + +2005-01-08 Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + Check for pad availability before doing a query on it. + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + really fix bpp24/32 dvdec caps (classic rgba indeed) + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + don't send text tags if they are empty (bis repetita) + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + remove unneeded comment from dvdec + (related to DV 4CC codes in AVI files) + moved them in gstreamer/docs/random/mimetypes + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + don't send text tags if they are empty + fix mem leak on error path + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (img_get_alpha_info): + * gst/ffmpegcolorspace/imgconvert_template.h: + adds BGR32 and BGRA32 to ffmpegcolorspace + (still bad colors, fixing it on next commit) + helps with dvdec outputing BGR32 + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + Fix audio caps i just broke (missing ',') + * gst/matroska/matroska-mux.c: (gst_matroska_mux_get_type), + (gst_matroska_mux_reset): + Fix typo + add FIXME about old "x-gst-metadata" crap + +2005-01-07 Stephane LOEUILLET + + * ext/dv/demo-play.c: (main): + xvideosink -> xvimagesink + * ext/dv/gstdvdec.c: + change rgb 32/32 caps to 24/32 (no alpha) + change nb of channels to be a list (2 or 4, not 2) + change sample rate to be a list (32, 44.1, 48 kHz) not a range + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + Add 'date/year' to extracted metadata list + +2005-01-07 Ronald S. Bultje + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + The return value of fixate_to does not imply that the requested + value was set, so don't assume. + +2005-01-07 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: (gst_pngenc_base_init), + (gst_pngenc_sinklink), (gst_pngenc_init), (gst_pngenc_chain): + * ext/libpng/gstpngenc.h: + Alpha support (encoder; #163161), mime fixage. + +2005-01-07 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * ext/faac/gstfaac.c: (gst_faac_outputformat_get_type), + (gst_faac_class_init), (gst_faac_init), (gst_faac_srcconnect), + (gst_faac_set_property), (gst_faac_get_property): + * ext/faac/gstfaac.h: + Allow for ADTS output (#153434). + +2005-01-07 Ronald S. Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Fix against template (#150576). + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (draw_puzzle): + don't draw a puzzle if either width or height of tiles would be 0. + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (gst_puzzle_get_type), + (gst_puzzle_class_init), (gst_puzzle_finalize): + no memleaks, please + (gst_puzzle_create), (gst_puzzle_init), + (gst_puzzle_set_property), (gst_puzzle_setup): + change initialization code around so we don't reshuffle on resize + (draw_puzzle): + fix another stupid typo + +2005-01-06 Benjamin Otte + + * gst/games/gstvideoimage.c: (copy_hline_YUY2): + fix stupid typo that borked copying on YUY2 + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (draw_puzzle): + fix edges when image sizes aren't multiples of tile sizes + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + make RGB endianness work correctly + (gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move): + refactor and fix race with initial shuffling + (nav_event_handler): + allow using the mouse to puzzle + (draw_puzzle): + insist on tiles having width and height as multiples of 4 to get + clean YUV image handling + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc): + s/DEBUG/LOG/ for common messages + (gst_xvimagesink_navigation_send_event): + fix mouse event translation to not include screen PAR + * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): + fix mouse event translation to actually work + +2005-01-06 Stephane LOEUILLET + + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + Extract TrackNumber metadata + clean up code + * gst/games/gstvideoimage.c: (gst_video_image_draw_rectangle): + Hope this is the good fix (var used unitialised) + +2005-01-06 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_chain): + Only increment timestamp if it's valid. Fixes raw AAC streams. + +2005-01-06 Benjamin Otte + + * configure.ac: + * gst/games/Makefile.am: + * gst/games/gstpuzzle.c: + add a puzzle game with... + * gst/games/gstvideoimage.c: + * gst/games/gstvideoimage.h: + ... full colorspace support (that includes YUV9 and RGB16)) stolen + from videotestsrc and made into something that would be a nice + library for a lot of other plugins. + +2005-01-06 Stephane LOEUILLET + + * configure.ac: + don't compile faad plugin if a RC of 2.0 is found + Fixes #155346 (and FC1 buildbot) + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + try to make Solaris compiler happier + +2005-01-06 Paul Jack + + Reviewed by: Ronald S. Bultje + + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): + Fix segfault (#161667). + +2005-01-05 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Fix framerate reporting. + +2005-01-05 Stephane LOEUILLET + + * gst-libs/gst/riff/riff-ids.h: + * gst/wavenc/riff.h: + Add AMR (VBR and CBR) ids to riff.h audio codec list + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_process_object): + Retrieve more tags from ASF files (Genre, AlbumTitle, Artist) + +2005-01-05 Martin Eikermann + + Reviewed by: Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_handle_discont): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_handle_discont): + Recreate pads on new-media (#160730). + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_new_pad): + Send discont even if manager changes timestamps (#161929). + +2005-01-05 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16): + Fix invalid memory access (#159211). + +2005-01-05 Ronald S. Bultje + + * examples/gstplay/player.c: (main): + Don't iterate. + * examples/seeking/seek.c: (fixate), (make_playerbin_pipeline): + Add visualizations. + * ext/a52dec/gsta52dec.c: (gst_a52dec_push), + (gst_a52dec_handle_frame): + Set duration. + * ext/dvdnav/gst-dvd: + Add audioconvert. Fixes #161325. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get): + Explicitely case to gint64. Possible valgrind error. + * gst-libs/gst/play/play.c: (caps_set), (setup_size), + (gst_play_tick_callback), (gst_play_change_state), + (gst_play_dispose), (gst_play_init), (gst_play_class_init), + (gst_play_set_location), (gst_play_get_location), + (gst_play_seek_to_time), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization), + (gst_play_get_framerate), (gst_play_get_all_by_interface), + (gst_play_new): + Use playbin. Fixes #139749 and #147744. + * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags): + Add genre tag. + * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), + (audioscale_get_type), (gst_audioscale_base_init), + (gst_audioscale_class_init), (gst_audioscale_expand_caps), + (gst_audioscale_getcaps), (gst_audioscale_fixate), + (gst_audioscale_link), (gst_audioscale_get_buffer), + (gst_audioscale_decrease_rate), (gst_audioscale_increase_rate), + (gst_audioscale_init), (gst_audioscale_dispose), + (gst_audioscale_chain), (gst_audioscale_set_property), + (gst_audioscale_get_property), (plugin_init): + Indent properly. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): + Fix LPCM. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), + (qtdemux_tag_add_str), (qtdemux_tag_add_num), + (qtdemux_tag_add_gnre), (qtdemux_video_caps): + Add more metadata (fixes #162656). + +2005-01-05 Thomas Vander Stichele + + * configure.ac: + back to cvs + +=== release 0.8.7 === + +2005-01-05 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + releasing 0.8.7, "Hyperspace" + +2005-01-05 Thomas Vander Stichele + + patch by: Tim-Philipp Müller + + * gst/playback/gstplaybasebin.c: + Fix for #162924 - free caps after use, not before + +2005-01-04 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/playback/gstplaybasebin.c: + * gst/wavparse/gstwavparse.c: + Fix for #154773 - fixes playback of small .wav files + +2005-01-03 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/audioscale/gstaudioscale.c: + Fix for #162819 - make audioscale reusable + Fixes playback of more than one file with playbin/totem + +2004-12-29 Thomas Vander Stichele + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + * gst/ffmpegcolorspace/imgconvert.c: + clean up the mess that made me cry and avoid needless duplication + +2004-12-29 Thomas Vander Stichele + + * gst/ffmpegcolorspace/imgconvert.c: + give some indication of why we're segfaulting + +2004-12-29 Ronald S. Bultje + + * configure.ac: + Fix indentation, fix v4l2 plugin detection. + * ext/Makefile.am: + Fix libmms location (Maciej, use diff -u!). + * ext/alsa/gstalsa.c: (gst_alsa_init): + Initialize caps cache to NULL. + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + Only change state on audiosink if it exists. + +2004-12-28 Maciej Katafiasz + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-demux.h: + Fix Vorbis streams failing to decode in some files, where cluster_time + isn't 0, because then it doesn't send codec_priv before actual data. + Remove time-based test and replace it with marker set on beginning of + new stream + +2004-12-28 David Schleef + + Merge patch from Ronald fixing problems with streaming + text. + * ext/cairo/gstcairo.c: (plugin_init): + * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), + (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), + (gst_textoverlay_video_chain), (gst_textoverlay_loop), + (gst_textoverlay_font_init), (gst_textoverlay_init), + (gst_textoverlay_set_property): + * ext/cairo/gsttextoverlay.h: + +2004-12-27 David Schleef + + * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), + (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), + (gst_textoverlay_video_chain), (gst_textoverlay_loop), + (gst_textoverlay_font_init), (gst_textoverlay_init), + (gst_textoverlay_set_property): Improvements to actually + render text as white on black outline on video, including + font selection and horizontal/vertical alignment. (Ronald's + christmas present) + * ext/cairo/gsttextoverlay.h: + +2004-12-26 Stephane Loeuillet + + * ext/ogg/gstogg.c: + * ext/ogg/gstogmparse.c: + fix ogm[audio/video]parse plugin registration + (riff won't load if bytestream is already loaded) + +2004-12-24 Thomas Vander Stichele + + * gst/audioconvert/gstchannelmix.c: + fix for GLIB < 2.4 + +2004-12-24 Thomas Vander Stichele + + * Makefile.am: + * configure.ac: + disable docs again until it actually passes make distcheck. + +2004-12-24 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_type_get), (qtdemux_audio_caps): + * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find), + (plugin_init): + Add 3GP (variables name Q3GP because they can't start with a + number). Add samr audio fourcc (used in .3gp files), decoder + is work in progress. Also do a GST_WARNING instead of ERROR + in case of unknown nodes, to decrease output. + +2004-12-24 Thomas Vander Stichele + + * Makefile.am: + really fix dist + +2004-12-23 Thomas Vander Stichele + + * configure.ac: + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.h: + Fixes #158382. Make speex plugin compatible with both 1.0 and 1.1. + Fix detection code in configure.ac + +2004-12-23 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Save position, so that queries give proper return values. Don't + know how this could ever have worked before... + +2004-12-23 Thomas Vander Stichele + + * configure.ac: + Put additional LAME check inside the conditional. Fixes #152339 + +2004-12-23 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan): + Add some more debug. Fix logic error when setting movi offset + while reading index. + +2004-12-23 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry): + Add some debugging. Better detection of broken indexes and the + accompanying index recovery. No infinite loops on state changes + when we're still in our loopfunction. + +2004-12-22 Ronald S. Bultje + + * configure.ac: + Fix up. + +2004-12-22 Archana Shah + + Reviewed by: Ronald S. Bultje + + * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_volume): + Normalizing the value before setting + (gst_sunaudiomixer_get_volume): + Normalizing the value after getting. Fixes bug# 161980 + +2004-12-22 Christian Fredrik Kalager Schaller + + * Makefile.am: Make sure docs gets disted + * docs/Makefile.am: Make sure all needed files get disted + * gst-plugins.spec.in: latest updates + +2004-12-22 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + Revert patch 1.38 as clock distribution over schedulers does + not work correcly in the core yet. + +2004-12-21 Stephane Loeuillet + + * sys/oss/README: remove this file, which predates my birth + (and which content is by far outdated) + +2004-12-20 Stefan Kost + + * Makefile.am: + * configure.ac: + * docs/Makefile.am: + * docs/libs/Makefile.am: + * docs/libs/gst-plugins-libs-docs.sgml: + * docs/libs/gst-plugins-libs-sections.txt: + * docs/libs/tmpl/gstgconf.sgml: + * docs/upload.mak: + * docs/version.entities.in: + Added boilerplate gtk-doc files for plugin-libs documentation. + +2004-12-19 Stephane Loeuillet + + * gst/auparse/gstauparse.c: fix int and float audio caps + +2004-12-19 Ronald S. Bultje + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): + g_assert() can be a macro, don't use #ifdef inside it. + +2004-12-19 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/videorate/gstvideorate.c: (gst_videorate_blank_data), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_change_state): + Event handling (fixes #159986). + +2004-12-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add BLZ0 (Blizzard's version of DivX) fourcc. + +2004-12-18 David Schleef + + * gst/tta/gstttadec.c: (gst_tta_dec_link): And yet another + portability fix. + +2004-12-18 David Schleef + + * gst/tta/ttadec.h: Disable some header code that isn't used + and clearly isn't portable. + +2004-12-18 David Schleef + + * gst/ffmpegcolorspace/imgconvert.c: (get_pix_fmt_info), + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_layout), + (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (img_copy), + (get_convert_table_entry), (img_convert), (img_get_alpha_info): + Fix code to not use GCC extensions (and c99 extensions that + Forte does not like.) + +2004-12-19 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), + (gst_deinterlace_chain): + Rowstride fixes. Fixes #161039. + * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), + (gst_video_crop_get_property), (gst_video_crop_add_to_struct_val), + (gst_video_crop_getcaps), (gst_video_crop_link), + (gst_video_crop_i420), (gst_video_crop_chain), + (gst_video_crop_change_state): + Rework of negotiation. Actually works now. Fixes #158650. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_sint): + That was very stupid. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix possible crasher. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_uint), + (gst_matroska_ebmlnum_sint), (gst_matroska_demux_parse_blockgroup): + Lace sizes can be zero. + +2004-12-18 Ronald S. Bultje + + * ext/musepack/gstmusepackdec.cpp: + Fetch error return values. Fixes #161624. + * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): + Really EOS. + +2004-12-18 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): + Work for truncated (unfinished download etc.) files. Fixes #160514. + +2004-12-18 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Fix for integer overflow. Makes #156001 not crash. Probably masks + the real bug. + +2004-12-17 Ronald S. Bultje + + * gst/ac3parse/gstac3parse.c: (plugin_init): + Parsers never have ranks. Fixes #159651. + +2004-12-17 Benjamin Otte + + * gst/playback/gstdecodebin.c: (compare_ranks): + make sure the facotries are ordered the same every time even if they + have the same rank by using the name + * gst/playback/gstdecodebin.c: (find_compatibles): + make sure we don't add factories to the list twice + +2004-12-16 David Schleef + + * configure.ac: look for musepack headers as musepack/*.h + (fixes #159847) + * ext/musepack/gstmusepackdec.h: use + * ext/musepack/gstmusepackreader.h: same + +2004-12-17 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_auds_with_data): + Read extradata correctly (fixes #155879). + +2004-12-16 David Schleef + + * gst/audioscale/gstaudioscale.c: allow passthru of >2 channel + audio. does _not_ attempt or allow conversion unless channels + is 1 or 2. + +2004-12-16 Christian Fredrik Kalager Schaller + + * tools/gst-launch-ext-m.m: fix mpeg and vob pipelines + +2004-12-16 David Schleef + + * gst/audioscale/gstaudioscale.c: the resample library only + handles 1 or 2 channels. Change caps to compensate. + +2004-12-16 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (aac_rate_idx), (aac_profile_idx), + (gst_matroska_demux_audio_caps): + Some MPEG-AAC hacks, because else it doesn't work... + +2004-12-16 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add h264. + +2004-12-16 Ronald S. Bultje + + * gst-libs/gst/audio/Makefile.am: + Try to fix buildbot. + +2004-12-16 Thomas Vander Stichele + + * gst/tcp/gstmultifdsink.c: + Clean up and uniformize debugging. + +2004-12-16 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_reset), (gst_dvd_demux_change_state): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), + (gst_mpeg_demux_change_state): + Reset on ready. Fixes 160276. + +2004-12-16 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_pad_link): + Fix memleak (#154815). + +2004-12-16 James Bowes + + Reviewed by: Ronald S. Bultje + + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init), + (gst_musicbrainz_init), (gst_musicbrainz_chain), + (gst_musicbrainz_set_property), (gst_musicbrainz_get_property): + * ext/musicbrainz/gsttrm.h: + Add support for using a proxy server when getting a trm id from + the MusicBrainz database (#149613). + +2004-12-16 Christophe Fergeau + + Reviewed by: Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (new_pad), (close_link): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + Fix memleaks (#157233). + +2004-12-16 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/resample/resample.c: (gst_resample_close): + * gst-libs/gst/resample/resample.h: + * gst/audioscale/gstaudioscale.c: + Fix memleak (#159215). + +2004-12-16 Toni Willberg + + Reviewed by: Ronald S. Bultje + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps): + * sys/oss/oss_probe.c: (main): + Check for mono/stereo support (similar to samplerate probing), + fixes #159433. Also add missing copyright header to oss_probe.c. + +2004-12-15 David Schleef + + * configure.ac: add audioresample and cairo plugins. Remove + HAVE_MMX stuff, because it's not used. + * ext/Makefile.am: same + * ext/audioresample/Makefile.am: You are not ready for an + audio resampling element based on audioresample. + * ext/audioresample/gstaudioresample.c: + * ext/audioresample/gstaudioresample.h: + * ext/cairo/Makefile.am: You are not ready for overlay elements + based on cairo. Don't look too closely, these elements kinda + suck right now. + * ext/cairo/gstcairo.c: new + * ext/cairo/gsttextoverlay.c: new + * ext/cairo/gsttextoverlay.h: new + * ext/cairo/gsttimeoverlay.c: new + * ext/cairo/gsttimeoverlay.h: new + * gst-libs/gst/media-info/media-info-priv.h: fix compile + problem with compilers that don't support variadic macros. + +2004-12-15 Balamurali Viswanathan + + Reviewed by: David Schleef + + * sys/sunaudio/gstsunaudio.c: (plugin_init): Apply patch from + Bala, registering sunaudiosrc (oops!), and cleaning up code a + bit. Also ran indent-gst. + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_init), + (gst_sunaudiosrc_change_state), (gst_sunaudiosrc_get), + (gst_sunaudiosrc_setparams): + +2004-12-14 David Schleef + + * gst/festival/gstfestival.c: (gst_festival_chain): Set the + output rate to 16000. Should fix #160235. + +2004-12-14 Zaheer Abbas Merali + + * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): + Add typefinding for mpeg2 pes streams + +2004-12-13 David Schleef + + * configure.ac: Applied patch from bug #143659, making default + sources and sinks OS-dependent (for Solaris), and added code + for OS/X. + * gconf/gstreamer.schemas.in: use OS-dependent sinks in gconf. + +2004-12-13 Stephane Loeuillet + + * gst-libs/gst/riff/riff-media.c: + forgot to add h2.64 to avidemux template caps + +2004-12-13 Stephane Loeuillet + + * gst/wavenc/riff.h: + * gst-libs/gst/riff/riff-media.c: + * gst-libs/gst/riff/riff-ids.h: + * gst/avi/gstavimux.c + add 4CC code for VideoSoft h264 in AVI (VSSH) + fixes bug #160655 + remove s323 from riff, it's quicktime specific :( + +2004-12-13 Stephane Loeuillet + + * gst/asfdemux/README + * gst/wavenc/riff.h + * gst-libs/gst/riff/riff-ids.h + * gst-libs/gst/riff/riff-media.c + * gst/qtdemux/qtdemux.c: + add new 4CC codes for h263 related codecs + fixes partially bug #155163 + +2004-12-12 Christian Fredrik Kalager Schaller + + * configure.ac: Update polyaudio requirement to 0.7 + * ext/polyp/polypsink.c: (create_stream): add patch from iain (158258) + +2004-12-11 Zaheer Abbas Merali + + * gst/interleave/deinterleave.c: + fix my name's spelling! :) + +2004-12-11 Stephane Loeuillet + + * AUTHORS ChangeLog + * gst/auparse/gstauparse.c + * gst/interleave/deinterleave.c + * gst/law/: + alaw-decode.c alaw-encode.c + mulaw-decode.c mulaw-encode.c + * gst/oneton/gstoneton.c + * sys/osxaudio/: + gstosxaudioelement.c gstosxaudiosink.c gstosxaudiosrc.c + * sys/osxvideo/: + cocoawindow.h cocoawindow.m + osxvideosink.h osxvideosink.m + + put the same mail address for Zaheer Abbas Merali everywhere + +2004-12-10 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_loop): + Align by packetsize, and assert that we a packet available before + playing. The first makes webstreams work (they often include + trailing padding data in a packet), the second allows pausing a + ASF stream in totem without getting demux errors afterwards. + +2004-12-09 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (get_relative): + Check for non-NULL before accessing member (end-of-chain). + +2004-12-09 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_set_property), (cdparanoia_get_property): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), + (dvdnavsrc_set_property), (dvdnavsrc_get_property): + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_init), (dvdreadsrc_set_property), + (dvdreadsrc_get_property): + * sys/vcd/vcdsrc.c: (gst_vcdsrc_class_init), + (gst_vcdsrc_set_property), (gst_vcdsrc_get_property): + Synchronize property names where not yet the case. Devices are + now device=X, other versions are deprecated (but still exist). + Also use g_free() unconditionally. + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (setup_source), (gst_play_base_bin_get_property): + Expose source. + +2004-12-09 Thomas Vander Stichele + + * configure.ac: move GCONF macro outside conditional for the am + conditional. Fixes #160439 + +2004-12-08 David Schleef + + * tools/gst-visualise-m.m: Switch to elements that currently + exist. + +2004-12-08 Ronald S. Bultje + + * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain): + We love wrong commas. + +2004-12-08 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_query): + Don't set DEFAULT, unsupported - makes length display incorrectly + in some cases. + +2004-12-07 Christian Fredrik Kalager Schaller + + * gst/monoscope/README: remove blurb about files being GPL + * gst/monoscope/gstmonoscope.c: Change license field to LGPL + * gst/monoscope/monoscope.c: Change license to BSD with explanation + monoscope is now effectively LGPL licensed + +2004-12-07 Christian Fredrik Kalager Schaller + + * gst/monoscope/README: Update information to be more correct + * gst/monoscope/convolve.c: Relicense to LGPL + * gst/monoscope/convolve.h: Relicense to LGPL + +2004-12-06 Arwed v. Merkatz + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + set BUFFER_DURATION to correct values (mpeg1 audio frame length is fixed) + * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link): + set default_duration for mpeg1 audio + +2004-12-06 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_close_audio): + * ext/alsa/gstalsa.h: + refactor big chunks of the core caps negotiation code to make it + a lot faster, because people claim it's really slow + (actually, just cache the getcaps when the device is opened) + +2004-12-06 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), + (gst_a52dec_handle_event), (gst_a52dec_update_streaminfo), + (gst_a52dec_handle_frame), (gst_a52dec_chain), + (gst_a52dec_change_state), (plugin_init): + * ext/a52dec/gsta52dec.h: + Do something useful with timestamps. Make chain-based (since + there's really no reason to be loopbased). + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Update current_byte/frame correctly. + +2004-12-04 Ronald S. Bultje + + * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags), + (gst_ape_demux_stream_init): + Forward tags, too. + +2004-12-04 Ronald S. Bultje + + * gst/apetag/apedemux.c: (gst_ape_demux_stream_init): + Let's make sure we're done typefinding when detecting tags. + +2004-12-03 Ronald S. Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), + (gst_ebml_read_init), (gst_ebml_read_use_event), + (gst_ebml_read_element_id), (gst_ebml_peek_id), + (gst_ebml_read_seek), (gst_ebml_read_skip), + (gst_ebml_read_reserve), (gst_ebml_read_buffer), + (gst_ebml_read_master): + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream), (gst_matroska_demux_audio_caps): + Disgustingly evil hack for working around INTERRUPT events and + their extremely annoying habit of being a pain in the ass. We + simply peek a cluster before reading any of it. + +2004-12-03 Ronald S. Bultje + + * ext/musepack/gstmusepackdec.cpp: + There's also floating point libmusepacks. + +2004-12-03 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_chanpos_from_gst), + (gst_faad_chanpos_to_gst), (gst_faad_chain): + Set DURATION even if source buffer didn't. Also use increasing + timestamps. + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Block_align can have larger values than 8192. + +2004-12-02 Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link): + Fix caps. + +2004-12-01 Ronald S. Bultje + + * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): + Fix logic bug. + +2004-12-01 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_type_find): + Yay, another one. + +2004-12-01 Ronald S. Bultje + + * ext/esd/esdsink.c: (gst_esdsink_chain): + Make error actually say something useful (fixes #156798). + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add Intel Video 5.0 fourcc (IV50). + +2004-12-01 Christophe Fergeau + + * ext/mad/gstmad.c: (mpg123_parse_xing_header): fix xing header + detection on mono and stereo mp3 files. + +2004-12-01 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Don't crash on EMPTY caps (e.g. when the demuxer didn't recognize + the contained stream). + +2004-12-01 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcconnect), (gst_faad_chain): + Oops, remove debug. + +2004-12-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps): + * gst/law/mulaw-decode.c: (mulawdec_getcaps): + Prevent warnings when negotiating caps (fixes #159338). + +2004-12-01 Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_chain): + Remove old leftover that shouldn't be there... + +2004-12-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): + Don't forward DISCONT events (fixes #159684). + +2004-12-01 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (remove_sinks), (setup_sinks): + Unlink manually since sometimes bin disposal (and therefore + pad unlinking) is delayed, which will cause a new media file + to not be able to start playing instantly. + +2004-11-29 Ronald S. Bultje + + * gst/playback/gststreaminfo.c: (stream_info_mute_pad): + On mute of an unlinked stream, check for pad availability so + we don't crash on unlinked pad. + +2004-11-29 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_massage_index): + Fix quite humiliating bug in omitting 0-sized index chunks but + forgetting to count them for timestamps. + +2004-11-29 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): + Actually leave the loop if we failed to sync. Don't crash. + +2004-11-28 Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_process_private): + * gst/mpegstream/gstdvddemux.h: + Fix crash (#159759). Doesn't work, though. :-(. + +2004-11-28 Benjamin Otte + + * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): + more overwriting protection due to modifying channels one by one + instead of all at once + +2004-11-28 Ronald S. Bultje + + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_fill_normalize): + Normalize using absolute values. + +2004-11-28 Julien MOUTTE + + * configure.ac: + * ext/Makefile.am: + * ext/directfb/Makefile.am: + * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_create), + (gst_directfbvideosink_get_pixel_format), + (gst_directfbvideosink_get_format_from_fourcc), + (gst_directfbvideosink_fixate), (gst_directfbvideosink_getcaps), + (gst_directfbvideosink_sink_link), + (gst_directfbvideosink_change_state), + (gst_directfbvideosink_chain), (gst_directfbvideosink_buffer_free), + (gst_directfbvideosink_buffer_alloc), + (gst_directfbvideosink_interface_supported), + (gst_directfbvideosink_interface_init), + (gst_directfbvideosink_navigation_send_event), + (gst_directfbvideosink_navigation_init), + (gst_directfbvideosink_set_property), + (gst_directfbvideosink_get_property), + (gst_directfbvideosink_finalize), (gst_directfbvideosink_init), + (gst_directfbvideosink_base_init), + (gst_directfbvideosink_class_init), + (gst_directfbvideosink_get_type), (plugin_init): + * ext/directfb/directfbvideosink.h: Adding a first version of + directfbvideosink. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): Initializing some + more. + +2004-11-28 Benjamin Otte + + * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): + walk the samples backwards if out_channels > in_channels so we don't + overwrite data + +2004-11-28 Ronald S. Bultje + + * gst/audioconvert/Makefile.am: + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), + (gst_audio_convert_link), (gst_audio_convert_change_state), + (gst_audio_convert_channels): + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_unset_matrix), + (gst_audio_convert_fill_identical), + (gst_audio_convert_fill_compatible), + (gst_audio_convert_detect_pos), (gst_audio_convert_fill_one_other), + (gst_audio_convert_fill_others), + (gst_audio_convert_fill_normalize), + (gst_audio_convert_fill_matrix), (gst_audio_convert_setup_matrix), + (gst_audio_convert_passthrough), (gst_audio_convert_mix): + * gst/audioconvert/gstchannelmix.h: + Implement a channel mixer. + +2004-11-28 Martin Soto + + * ext/alsa/gstalsasink.c (gst_alsa_sink_loop): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsa.c (gst_alsa_set_clock): + Make alsasink actually honor gst_element_set_clock and use that + clock instead of its internal one. + +2004-11-27 Christophe Fergeau + + * gst/playback/gstplaybasebin.c: (setup_source): fixed a caps leak + (gst_play_base_bin_change_state): nullify source and decoder when + going from READY to NULL so that we don't try to do weird stuff with + them when going from NULL to READY + * gst/playback/gstplaybin.c: (gst_play_bin_init): use gst_object_unref + instead of g_object_unref + (gen_video_element), (gen_audio_element): more refcounting fixes, now + it should be correct + (gst_play_bin_change_state): don't call remove_sinks if we are + currently disposing the object + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): + Don't forget bass if it's there. Else left channel is silent... + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop), + (gst_a52dec_change_state): + Don't do sample adjusting anymore, we use float audio now. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + Don't fixate to non-existing properties. + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), + (gst_a52dec_change_state): + Advertise that we can do surround sound. + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_reneg): + Add buffer-frames=0. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get_type), + (dvdreadsrc_init), (dvdreadsrc_get_event_mask), + (dvdreadsrc_get_query_types), (dvdreadsrc_get_formats), + (dvdreadsrc_srcpad_event), (dvdreadsrc_srcpad_query), + (_seek_title), (_seek_chapter), (get_next_cell_for), (_read), + (seek_sector), (dvdreadsrc_get), (dvdreadsrc_open_file), + (dvdreadsrc_change_state), (dvdreadsrc_uri_get_type), + (dvdreadsrc_uri_get_protocols), (dvdreadsrc_uri_get_uri), + (dvdreadsrc_uri_set_uri), (dvdreadsrc_uri_handler_init): + * ext/dvdread/dvdreadsrc.h: + Add seeking, querying for bytes, sectors, title, angle and + chapter. Handle multiple chapters. Relicense to LGPL because + Billy agreed on that (thanks Billy!). + +2004-11-27 Christophe Fergeau + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_dispose): + call parent dispose method + +2004-11-27 Martin Soto + + * gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active) + (gst_audio_clock_get_internal_time): + Fix active <-> inactive transitions: ensure time value always + grows and avoid abrupt value changes. + +2004-11-27 Arwed v. Merkatz + + * configure.ac: + * gst/tta/Makefile.am: + * gst/tta/crc32.h: + * gst/tta/filters.h: + * gst/tta/gsttta.c: + * gst/tta/gstttadec.c: + * gst/tta/gstttadec.h: + * gst/tta/gstttaparse.c: + * gst/tta/gstttaparse.h: + * gst/tta/ttadec.h: + added TTA parser and decoder + +2004-11-26 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (probe_triggered), (check_queue), (buffer_underrun), + (buffer_running), (buffer_overrun), (gen_source_element), + (setup_source): + * gst/playback/gstplaybasebin.h: + Implement buffering. Needs some more work. + +2004-11-26 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Fix ilog mask range overflow. + +2004-11-26 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps): + Don't omit the last (which in case of dmix is the only :) ) + channel count. Don't set channels if <= 2. + +2004-11-26 Christophe Fergeau + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): Removed 2 obsolete comments + +2004-11-26 Stephane Loeuillet + + * ext/vorbis/oggvorbisenc.c + * ext/vorbis/vorbisenc.c : + change description fields of those plugins to differentiate them + (pitivi show Encoders by description, they had the same one) + +2004-11-25 Christophe Fergeau + + Reviewed by: Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_dispose), + (gst_play_bin_set_property), (gen_video_element), + (gen_audio_element): + Refcounting fixes for provided audio-/videosinks. + +2004-11-25 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element), (setup_sinks), (gst_play_bin_change_state): + Don't reference all sinks, but only the video- and audiosinks. + The vis. element should be disposed when we're done with it. + We don't have any reason to keep it around. This fixes warnings + when reusing playbin for playing multiple audio files with + vis. enabled. Also release audio device on pause - idea stolen + from Rhythmbox. + +2004-11-25 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push), + (gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init): + * ext/alsa/gstalsa.c: (gst_alsa_get_caps): + * ext/alsa/gstalsaplugin.c: (plugin_init): + * ext/dts/gstdtsdec.c: (gst_dtsdec_channels), + (gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init): + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst), + (gst_faad_chanpos_to_gst), (gst_faad_sinkconnect), + (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), + (gst_faad_change_state), (plugin_init): + * ext/faad/gstfaad.h: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + * gst-libs/gst/audio/Makefile.am: + * gst-libs/gst/audio/audio.c: (plugin_init): + * gst-libs/gst/audio/multichannel.c: + (gst_audio_check_channel_positions), + (gst_audio_get_channel_positions), + (gst_audio_set_channel_positions), + (gst_audio_set_structure_channel_positions_list), + (add_list_to_struct), (gst_audio_set_caps_channel_positions_list), + (gst_audio_fixate_channel_positions): + * gst-libs/gst/audio/multichannel.h: + * gst-libs/gst/audio/testchannels.c: (main): + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_class_init), (gst_audio_convert_init), + (gst_audio_convert_dispose), (gst_audio_convert_getcaps), + (gst_audio_convert_parse_caps), (gst_audio_convert_link), + (gst_audio_convert_fixate), (gst_audio_convert_channels): + * gst/audioconvert/plugin.c: (plugin_init): + Surround sound support. + +2004-11-25 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): + Fix position for discont if we're close as well. Nitpicking, but + saves a few milliseconds of extra waiting or skipping. + +2004-11-25 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter): + We sometimes need parsers for playback, so add those too. + +2004-11-25 Ronald S. Bultje + + * configure.ac: + * gst/apetag/Makefile.am: + * gst/apetag/apedemux.c: (gst_ape_demux_get_type), + (gst_ape_demux_base_init), (gst_ape_demux_class_init), + (gst_ape_demux_init), (gst_ape_demux_get_src_formats), + (gst_ape_demux_get_src_query_types), + (gst_ape_demux_handle_src_query), (gst_ape_demux_get_event_mask), + (gst_ape_demux_handle_src_event), (gst_ape_demux_handle_event), + (gst_ape_demux_typefind_peek), (gst_ape_demux_typefind_get_length), + (gst_ape_demux_typefind_suggest), (gst_ape_demux_typefind), + (gst_ape_demux_parse_tags), (gst_ape_demux_stream_init), + (gst_ape_demux_stream_data), (gst_ape_demux_loop), + (gst_ape_demux_change_state): + * gst/apetag/apedemux.h: + * gst/apetag/apetag.c: (plugin_init): + * gst/typefind/gsttypefindfunctions.c: (apetag_type_find), + (plugin_init): + APE v1/2 tag reader plus typefind function. + +2004-11-25 Ronald S. Bultje + + * configure.ac: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + Remove hacks for older core. Require newer core version + accordingly. + +2004-11-25 Ronald S. Bultje + + * gst/cdxaparse/Makefile.am: + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_get_type), + (gst_cdxaparse_class_init), (gst_cdxaparse_init), + (gst_cdxaparse_loop), (gst_cdxaparse_change_state), (plugin_init): + * gst/cdxaparse/gstcdxaparse.h: + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_get_type), + (gst_cdxastrip_base_init), (gst_cdxastrip_class_init), + (gst_cdxastrip_init), (gst_cdxastrip_get_src_formats), + (gst_cdxastrip_get_src_query_types), + (gst_cdxastrip_handle_src_query), (gst_cdxastrip_get_event_mask), + (gst_cdxastrip_handle_src_event), (gst_cdxastrip_strip), + (gst_cdxastrip_sync), (gst_cdxastrip_handle_event), + (gst_cdxastrip_chain), (gst_cdxastrip_change_state): + * gst/cdxaparse/gstcdxastrip.h: + SVCD/VCD header stripping separated from CDXA image parsing. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (plugin_init): + Add VCD/SVCD header typefinding for VCD/SVCD. + * sys/vcd/vcdsrc.c: (gst_vcdsrc_get_type), (gst_vcdsrc_base_init), + (gst_vcdsrc_class_init), (gst_vcdsrc_init), + (gst_vcdsrc_set_property), (gst_vcdsrc_get_property), + (gst_vcdsrc_get_event_mask), (gst_vcdsrc_get_query_types), + (gst_vcdsrc_get_formats), (gst_vcdsrc_srcpad_event), + (gst_vcdsrc_srcpad_query), (gst_vcdsrc_get), + (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), + (gst_vcdsrc_change_state), (gst_vcdsrc_msf), + (gst_vcdsrc_recalculate), (gst_vcdsrc_uri_get_type), + (gst_vcdsrc_uri_get_protocols), (gst_vcdsrc_uri_get_uri), + (gst_vcdsrc_uri_set_uri), (gst_vcdsrc_uri_handler_init): + * sys/vcd/vcdsrc.h: + Fix up, add seeking, querying, URI interface. Works in totem now. + +2004-11-25 Thomas Vander Stichele + + * configure.ac: + back to CVS + +=== release 0.8.6 === + +2004-11-25 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + releasing 0.8.6, "IOU Love" + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/playback/gstplaybasebin.c: + Fix unplayable files error handling. Fixes #158365 + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: + Fix broken mp3 typefinding. Fixes #158375 + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * ext/ogg/gstoggdemux.c: + Fix sync on broken files. Fixes #158976 + +2004-11-23 Thomas Vander Stichele + + patch by: Edward Hervey + + * ext/libpng/gstpngenc.c: + Copy over buffer properties. Fixes #158832 + +2004-11-23 Thomas Vander Stichele + + patch by: Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + Fixes invalid reads (#158462) + +2004-11-23 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: + Probe less and cache it. Fixes #159187. + +2004-11-23 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: + Handle all video formats. Fixes #159186. + +2004-11-16 Jan Schmidt + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init), (gst_synaesthesia_init), + (gst_synaesthesia_dispose), (gst_synaesthesia_finalize), + (gst_synaesthesia_sink_link), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_src_link), (gst_synaesthesia_chain), + (gst_synaesthesia_change_state), (plugin_init): + Fix up synaesthesia to work under different samplerates/ buffer sizes. + Force 320x200 output, as that's the only thing the underlying + synaesthesia implementation supports. Still needs to be made + re-entrant. + +2004-11-14 Ronald S. Bultje + + * configure.ac: + Fix mpeg2enc configure check (similar to mplex check below). + +2004-11-14 Koop Mast + + reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + Fix for gcc-2.95 (fixes #158221). + +2004-11-13 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + Re-add clock distribution hack (until new core is released). + Fixes #158125. + +2004-11-13 Arwed v. Merkatz + * configure.ac: + fix mplex configure check segfaulting on some systems (bug #140994) + +2004-11-13 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait): + add debugging + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + do a wait when we enter the loop func with no data available to + write instead of getting into an 100% CPU loop by just returning and + being called again by the scheduler + +2004-11-13 Jan Schmidt + + * configure.ac: + * ext/libvisual/visual.c: (gst_visual_get_type), + (libvisual_log_handler), (gst_visual_getcaps), + (gst_visual_srclink), (gst_visual_change_state), (make_valid_name), + (plugin_init): + Update libvisual to 0.1.7. Link in the debug handling to gstreamer + * ext/smoothwave/Makefile.am: + * ext/smoothwave/demo-osssrc.c: (main): + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init), + (gst_smoothwave_init), (gst_smoothwave_dispose), (gst_sw_sinklink), + (gst_sw_srclink), (gst_smoothwave_chain), (gst_sw_change_state), + (plugin_init): + * ext/smoothwave/gstsmoothwave.h: + Make gstsmoothwave a working element in the 20th century. + + * gst/chart/gstchart.c: (gst_chart_init), (gst_chart_srcconnect): + Fix incorrect link function + +2004-11-12 Ronald S. Bultje + + * gst/volume/gstvolume.c: + Allow buffer-frames=0. + +2004-11-12 Iain + + * configure.ac: Check for polypaudio + + * ext/Makefile.am: Build the polyp dir + + * ext/polyp: The polypsink sources. + +2004-10-30 Iain + + * gst/interleave/interleave.c (interleave_unlink): Change the src pads + caps to reflect the new number of channels. + +2004-11-12 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Fix for negotiation order problem. This would show when the + ALSA loopfuction was called before any other function. ALSA + wouldn't do anything because we're not negotiated yet, leading + to an infinite loop. Showed in e.g. Rhythmbox. Fixes #158006. + +2004-11-11 Tim-Philipp Müller + + reviewed by: Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + No warnings (#157986). + +2004-11-11 Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Prefer apev1/2 and id3v1 (at end of file) over musepack. + +2004-11-11 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream): + Signal no-more-pads (so it works in playbin). + +2004-11-11 Ronald S. Bultje + + * ext/musepack/gstmusepackreader.cpp: + Workaround for older core. + +2004-11-11 Ronald S. Bultje + + * gst/ffmpegcolorspace/imgconvert.c: (yuv420p_to_yuv422): + Actually test for odd width/height rather than testing whether + a temporary variable that was 0 before we subtracted 1 is now + not equal to zero (which it always is). + +2004-11-11 Zaheer Abbas Merali + + * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): + Fix compilation if HAVE_XVIDEO is not defined + +2004-11-11 Zaheer Abbas Merali + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + Fix compilation if HAVE_XVIDEO is not defined + +2004-11-11 Jan Schmidt + + * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), + (gst_goom_dispose), (gst_goom_sinkconnect), (gst_goom_chain), + (gst_goom_change_state), (plugin_init): + Use the bytestream adapter so goom doesn't depend on the input + buffer size. + Add a debug category + +2004-11-11 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + Only set hardware parameters *after* negotiation. Before + negotiation, it will set ANY and that seems to cause crashes + (see e.g. #151288, #153227). + +2004-11-10 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + This seems to be antique leftover. It needs to pass error + checking. + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), + (gst_sdlvideosink_deinitsdl), (gst_sdlvideosink_initsdl), + (gst_sdlvideosink_destroy), (gst_sdlvideosink_create), + (gst_sdlvideosink_sinkconnect), (gst_sdlvideosink_chain): + Fix GstXOverlay implementation (#151059). + +2004-11-10 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Don't assert (#157853). + +2004-11-10 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + Fix bytes/samples confustion. + (gst_alsa_sink_mmap), (gst_alsa_sink_loop): + Fix for underrun (#144389). + +2004-11-09 Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + Disable halfway-seek for pending release (since it needs a new + core release). + +2004-11-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: + add autoprobe-fps property so we can separate autoprobing parts + +2004-11-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4lsrc_calls.c: + initialise fourcc to catch unset fourcc's, and debug + +2004-11-09 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): + * gst/playback/gstplaybin.c: (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (remove_sinks), (setup_sinks), (gst_play_bin_change_state), + (gst_play_bin_get_event_masks), (gst_play_bin_send_event), + (gst_play_bin_get_formats), (gst_play_bin_convert), + (gst_play_bin_get_query_types), (gst_play_bin_query): + Cleanups and some more documentation. + +2004-11-09 Jan Schmidt + + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), + (gst_cacasink_init), (gst_cacasink_chain): + * ext/libcaca/gstcacasink.h: + Cacasink inherits from VideoSink, so let that store the clock. + +2004-11-09 Wim Taymans + + * gst/playback/README: + * gst/playback/gstplaybasebin.c: (group_destroy), (group_is_muted), + (add_stream), (unknown_type), (add_element_stream), (no_more_pads), + (probe_triggered), (preroll_unlinked), (new_decoded_pad), + (gst_play_base_bin_change_state), (gst_play_base_bin_found_tag): + * gst/playback/gstplaybin.c: (gen_vis_element), (remove_sinks), + (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute), + (gst_stream_info_is_mute), (gst_stream_info_set_property): + * gst/playback/gststreaminfo.h: + Updated README. + Only switch groups if all streams have muted (EOSed). + Send Tags in sync with the stream playback instead of in + the playback/preroll phase. + Some cleanups, free the fakesrc elements. + +2004-11-09 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps_internal): + buffer-frames property was missing + * ext/arts/gst_arts.c: + rate missing from sinkcaps + * ext/audiofile/gstafparse.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/swfdec/gstswfdec.c: + int audio doesn't know buffer-frames + * ext/cdparanoia/gstcdparanoia.c: + int audio doesn't know chunksize either + * ext/nas/nassink.c: + it's endianness, not endianess + * gst-libs/gst/audio/audio.h: + make float standard pad template caps really describe float + * gst/law/mulaw.c: (linear_factory): + signed only, please + * gst/mpegstream/gstdvddemux.c: + widths of 20 are not valid + +2004-11-08 Thomas Vander Stichele + + Submitted by: Luca Ferretti + + * po/LINGUAS: + * po/it.po: + Add Italian + +2004-11-08 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): + * gst/playback/gstplaybasebin.c: (probe_triggered), + (gst_play_base_bin_change_state): + Updated README, added more comments for fixmes etc.. + +2004-11-08 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + We can remove this hack now. + +2004-11-08 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_blend_buffers), (gst_videomixer_loop): + Only mix AYUV for maximum quality. + +2004-11-08 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (get_relative), (gst_ogg_demux_src_query), + (gst_ogg_demux_push), (gst_ogg_pad_push): + Let's act as if we're synchronized now! :). + * ext/theora/theoradec.c: (theora_dec_chain): + Add some debug. + +2004-11-08 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_set_property), (gst_alpha_sink_link), + (gst_alpha_set_ayuv), (gst_alpha_set_i420), + (gst_alpha_chroma_key_ayuv), (gst_alpha_chroma_key_i420), + (gst_alpha_init_params), (gst_alpha_chain): + Implement alpha functions for AYUV too, this increases + accuracy quite a bit. + +2004-11-08 Wim Taymans + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (shrink12), (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace): + * gst/ffmpegcolorspace/imgconvert_template.h: + Added AYUV colorspace and handle RGBA a bit more respectful. + +2004-11-08 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + Actually always send a discont (cornercase when resending the + same serial-tagged chain twice). + +2004-11-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), + (gst_ximagesink_finalize): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. + +2004-11-08 Wim Taymans + + * gst/typefind/gsttypefindfunctions.c: (aac_type_find): + Don't segfault on NULL data. + +2004-11-08 Wim Taymans + + * gst/playback/gstdecodebin.c: (unlinked): + * gst/playback/gstplay-marshal.list: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (gst_play_base_bin_init), (group_create), (get_active_group), + (get_building_group), (group_destroy), (group_commit), + (queue_overrun), (remove_groups), (add_stream), (unknown_type), + (add_element_stream), (no_more_pads), (probe_triggered), + (preroll_unlinked), (new_decoded_pad), (removed_decoded_pad), + (state_change), (setup_source), (gst_play_base_bin_get_property), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_link_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (remove_sinks), (setup_sinks), (gst_play_bin_change_state): + Add support for chained ogg files. Prepare for playlist + support. This patch introduces the concept of pad groups, which + together compose one playable media file. + +2004-11-07 David Schleef + + * testsuite/gst-lint: Check for pad templates that aren't statically + scoped. + +2004-11-07 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musepack/gstmusepackdec.cpp: + * ext/musepack/gstmusepackdec.h: + * ext/musepack/gstmusepackreader.cpp: + * ext/musepack/gstmusepackreader.h: + Add musepack decoder. + * ext/faad/gstfaad.c: (gst_faad_base_init): + Make pad templates static. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (plugin_init): + Add musepack typefinder, make mp3 typefinding work halfway stream, + which doesn't actually work yet because id3demux doesn't implement + _get_length(). + +2004-11-07 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop): + Fix interrupt event handling (#144436). + +2004-11-07 Ronald S. Bultje + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_typefind): + Hide unused glory. + +2004-11-06 Tim-Philipp Müller + + reviewed by: Ronald S. Bultje + + * ext/vorbis/vorbisenc.c: (raw_caps_factory): + Fix weird caps (#157548). + +2004-11-06 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/rtp/gstrtpgsmparse.c: (gst_rtpgsm_caps_nego): + Add missing NULL terminator (#157543). + +2004-11-05 Thomas Vander Stichele + + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversrc.c: + ports can go up to 65535. Move common defines to gsttcp.h + +2004-11-05 Wim Taymans + + * gst/videotestsrc/videotestsrc.c: (paint_setup_Y41B), + (paint_hline_Y41B), (paint_setup_Y42B), (paint_hline_Y42B): + Added two more colorspaces. + +2004-11-05 Wim Taymans + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (yuv422p_to_yuv422), (yuv420p_to_yuv422), (shrink12), + (img_convert), (deinterlace_line), (deinterlace_line_inplace): + More stride fixes. + +2004-11-05 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), + (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), + (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), + (gst_videomixer_loop): + More stride fixes. + +2004-11-05 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_chain): + don't overflow data buffer. Flush not needed sync data when syncing + failed. + +2004-11-04 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), + (gst_alpha_get_property), (gst_alpha_add), (gst_alpha_chroma_key), + (gst_alpha_init_params), (gst_alpha_chain), + (gst_alpha_change_state): + Updated the chroma keying algorithm with something more + sophisticated. + +2004-11-03 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_blend_buffers), (gst_videomixer_loop): + Fix stride issues. Does not completely work for odd + heights. + +2004-11-03 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_chroma_key), (gst_alpha_chain): + Fix stride issues. Does not completely work for odd + heights. + +2004-11-03 Christophe Fergeau + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + * gst/videoscale/videoscale.c: (videoscale_find_by_structure): + leak fixes + +2004-11-03 Wim Taymans + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (avpicture_alloc): + * gst/ffmpegcolorspace/imgconvert_template.h: + Use correct _fill function to get correct strides. + +2004-11-02 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), + (qtdemux_parse_udta), (qtdemux_tag_add), (gst_qtdemux_handle_esds): + Change all g_print()s to debugging. Add a bunch of consistency + checks. + +2004-11-02 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (try_to_link_1), (get_our_ghost_pad), (remove_element_chain), + (unlinked), (no_more_pads), (close_link): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (unknown_type), (add_element_stream), (new_decoded_pad), + (removed_decoded_pad), (setup_source): + * gst/playback/gststreaminfo.c: (gst_stream_info_get_type), + (gst_stream_info_class_init), (gst_stream_info_init), + (gst_stream_info_new), (gst_stream_info_dispose), + (stream_info_mute_pad), (gst_stream_info_set_property), + (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Fix playback of multiple files. + a slightly different approach to handling dynamic pad removals. + This one only looks at pads that we have linked. + +2004-11-01 Christophe Fergeau + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_finalize): fix an "invalid + free" warning from libc. + +2004-11-01 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (get_unconnected_element), (remove_starting_from), (pad_removed), + (close_link): + Implement support for dynamic pad changing. We listen to "live" + pad removals (i.e. while playing) and re-setup autoplugging + after that. Playbasebin/playbin need some more work for this + to finally work, but decodebin supports (and replugs) chained + ogg now. + +2004-11-02 Jan Schmidt + + * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_dispose), + (gst_alsa_finalize): + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), + (gst_cdaudio_finalize): + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_finalize): + * ext/divx/gstdivxdec.c: (gst_divxdec_dispose): + * ext/divx/gstdivxenc.c: (gst_divxenc_dispose): + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_finalize): + * ext/flac/gstflacdec.c: (gst_flacdec_class_init), + (gst_flacdec_finalize): + * ext/flac/gstflacenc.c: (gst_flacenc_class_init), + (gst_flacenc_finalize): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_class_init), + (gst_gnomevfssink_finalize): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_class_init), + (gst_gnomevfssrc_finalize): + * ext/libfame/gstlibfame.c: (gst_fameenc_class_init), + (gst_fameenc_finalize): + * ext/nas/nassink.c: (gst_nassink_class_init), + (gst_nassink_finalize): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), + (gst_sdlvideosink_class_init): + * ext/sndfile/gstsf.c: (gst_sf_dispose): + * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_dispose): + * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_dispose): + * gst-libs/gst/tuner/tunernorm.c: (gst_tuner_norm_dispose): + * gst-libs/gst/xwindowlistener/xwindowlistener.c: + (gst_x_window_listener_dispose): + * gst/audioscale/gstaudioscale.c: + * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init), + (play_on_demand_finalize): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose): + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init), + (cdplayer_finalize): + * sys/glsink/glimagesink.c: (gst_glimagesink_finalize), + (gst_glimagesink_class_init): + * sys/oss/gstosselement.c: (gst_osselement_class_init), + (gst_osselement_finalize): + * sys/oss/gstosssink.c: (gst_osssink_dispose): + * sys/oss/gstosssrc.c: (gst_osssrc_dispose): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_dispose): + Fixes a bunch of problems with finalize and dispose functions, + either assumptions that dispose is only called once, or not calling + the parent class dispose/finalize function + +2004-11-01 Stefan Kost + + * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_link): + added two api precondition guards + use g_strdup with getenv to fix crash when using ENVVAR + +2004-11-01 Jan Schmidt + * ext/esd/esdsink.c: (gst_esdsink_class_init), + (gst_esdsink_finalize): + Use a finalize function, not dispose, and more importantly, + call the parent class finalize function too + +2004-11-01 Johan Dahlin + + * ext/ogg/gstoggdemux.c: + * gst/tags/gstvorbistag.c: + Plug leaks. + +2004-10-31 Benjamin Otte + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + lotsa memleaks today. But they're all small... + +2004-10-31 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + another memleak crushed + +2004-10-31 Benjamin Otte + + * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): + fix memleak + +2004-10-31 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + Hack to prevent crash when going to READY inside signal handler + while this function is active. + +2004-10-31 Ronald S. Bultje + + * gst/ffmpegcolorspace/Makefile.am: + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/common.h: + * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): + * gst/ffmpegcolorspace/dsputil.h: + * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_smpfmt_to_caps), + (gst_ffmpegcsp_codectype_to_caps), (gst_ffmpeg_caps_to_smpfmt), + (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_caps_with_codectype), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_get_type), + (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), + (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), + (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), + (gst_ffmpegcsp_get_property), (gst_ffmpegcolorspace_register): + * gst/ffmpegcolorspace/imgconvert.c: + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), + (avpicture_get_size), (avcodec_get_pix_fmt_loss), + (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), + (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), + (yuv422_to_yuv420p), (uyvy422_to_yuv420p), (uyvy422_to_yuv422p), + (yuv422_to_yuv422p), (yuv422p_to_yuv422), (yuv422p_to_uyvy422), + (uyvy411_to_yuv411p), (yuv420p_to_yuv422), (C_JPEG_TO_CCIR), + (img_convert_init), (img_apply_table), (shrink41), (shrink21), + (shrink12), (shrink22), (shrink44), (grow21_line), (grow41_line), + (grow21), (grow22), (grow41), (grow44), (conv411), + (gif_clut_index), (build_rgb_palette), (bitcopy_n), (mono_to_gray), + (monowhite_to_gray), (monoblack_to_gray), (gray_to_mono), + (gray_to_monowhite), (gray_to_monoblack), (avpicture_alloc), + (avpicture_free), (is_yuv_planar), (img_convert), + (get_alpha_info_pal8), (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace), (deinterlace_bottom_field), + (deinterlace_bottom_field_inplace), (avpicture_deinterlace): + * gst/ffmpegcolorspace/imgconvert_template.h: + * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): + * gst/ffmpegcolorspace/mmx.h: + * gst/ffmpegcolorspace/utils.c: (av_mallocz), (av_strdup), + (av_fast_realloc), (av_mallocz_static), (av_free_static), + (av_freep), (avcodec_get_context_defaults), + (avcodec_alloc_context), (avcodec_init): + Sync back from gst-ffmpeg. Deprecates ffcolorspace. Adds palette + handling plus update from ffmpeg CVS. Large clean-up. + +2004-10-31 Ronald S. Bultje + + * gst/playback/Makefile.am: + We need the marshallers for decodebin, too. + +2004-10-30 David Schleef + + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Make + quicktime typefinding work with 64-bit offsets. + +2004-10-30 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event): + Set EOS on the element when processing an EOS event. + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.h: + Only keep a const ptr to the mode + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data), + (gst_riff_create_audio_template_caps): + Allow WMAV3, with up to 6 channels. + * gst/asfdemux/gstasfmux.c: (gst_asfmux_request_new_pad): + Don't call gst_pad_set_event_function on a sink pad. + * gst/mpegstream/gstdvddemux.c: + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_set_cur_audio), (gst_dvd_demux_set_cur_subpicture): + Copy the explicit caps that were set across to the cur_* pads, + instead of trying to use a possibly non-existent negotiated caps. + Reset the type of subpicture pads to UNKNOWN after calling + init_stream, so that the caps get set. + +2004-10-29 Martin Pitt + + Reviewed by: Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + Don't touch buffer if it is of size 0 (fixes #151064). + +2004-10-29 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push), (gst_ogg_pad_push): + Synchronized discont handling. + +2004-10-29 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_push): + Make seeking sort-of exact again (fixes #156387). + +2004-10-29 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (unknown_type), + (add_element_stream), (new_decoded_pad), + (gst_play_base_bin_change_state): + * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Make caps explicitely available. Makes testing for unsupported + types possible. Improves error reporting. + +2004-10-29 Ronald S. Bultje + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format): + Really don't touch read-only buffers (#156563). + +2004-10-29 Sebastien Cote + + Reviewd by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Fix memleak (#155223). + +2004-10-29 Wim Taymans + + * gst/tcp/.cvsignore: + * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_remove_client_link), (is_sync_frame), + (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + Added burst on connect sync_method, deprecated sync_clients, + streamlined the sync code some more. + +2004-10-29 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (thread_error), (setup_source), + (gst_play_base_bin_change_state): + Improve error reporting. + +2004-10-28 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/fdsetstress.c: (mess_some_more), (run_test), (main): + * gst/tcp/gstfdset.c: (nearest_pow), (resize), (ensure_size), + (gst_fdset_new), (gst_fdset_free), (gst_fdset_set_mode), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + Added more locks around fdset structures. Fixed/reworked + the poll array resizing code. + Added stress test for fdset. + +2004-10-28 Zaheer Abbas Merali + + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): + fix build + +2004-10-28 Benjamin Otte + + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): + fix link function to always query channels and query width for + floats + * configure.ac: + add equalizer dir + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), + (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), + (gst_iir_equalizer_init), (gst_iir_equalizer_finalize), + (arg_to_scale), (setup_filter), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), + (plugin_init): + add an equalizer + +2004-10-27 Thomas Vander Stichele + + Submitted by: Kjartan Maraas + + * po/LINGUAS: + * po/nb.po: + Added Norwegian Bokmaal translation + +2004-10-27 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + Don't break on options (fixes #156488). + +2004-10-27 Thomas Vander Stichele + + * configure.ac: + * ext/cdaudio/Makefile.am: + * sys/Makefile.am: + fix build on older automake + +2004-10-26 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): + Allow a little margin when negotiating the framerate. + +2004-10-26 Stefan Kost + + * gst/level/gstlevel.c: + synchonised naming of pads and pad-templates + +2004-10-26 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_handle_event), (_find_chain_get_unknown_part), + (_find_streams_check), (gst_ogg_demux_push): + Fix EOS again. Needs to be done in a better way. We should not + remove the pad if there is no new chained stream. + +2004-10-26 Iain + + * ext/ogg/gstoggdemux.c (gst_ogg_pad_new): Free the tag list. + * gst/audioscale/gstaudioscale.c (gst_audioscale_link): Free the copy + of the caps. + * gst/interleave/interleave.c (interleave_class_init): Hook up release + pad. + (interleave_release_pad): Remove the pad. + * gst/level/gstlevel.c: Allow the level to take 1 or 2 channels. + * sys/sunaudio/gstsunaudio.c (gst_sunaudio_setparams): Pay attention to + the set device. + * sys/xvimage/xvimagesink.c (gst_xvimagesink_get_xv_support): Free the + attrs + (gst_xvimagesink_xcontext_clear): Free the xcontext. + (gst_xvimagesink_finalize): Free the par. + +2004-10-26 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_audsinkconnect), + (gst_avimux_stop_file): + First calculate the rate, and only then use it. Hdr.rate is a + multiple and not a derivative of hdr.scale. Scale is not the + same as blockalign but is solely related to rate. + +2004-10-26 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_init), + (gst_gnomevfssink_handle_event), (gst_gnomevfssink_chain): + Implement seeking. + +2004-10-25 James Henstridge + + Reviewed by: David Schleef + + * examples/gstplay/player.c: (got_stream_length), (main): + * examples/seeking/cdplayer.c: (update_scale): + * examples/seeking/seek.c: (format_value), (update_scale): + * examples/seeking/spider_seek.c: (format_value), (update_scale), + (stop_seek): + Build fixes on AMD64. + +2004-10-25 Zaheer Abbas Merali + + reviewed by: Ronald Bultje + + * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): + Fix for some v4l cards which hang in v4lsrc + +2004-10-25 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_remove), + (gst_ogg_demux_push), (gst_ogg_chains_clear): + Make sure to remove the pad when a new chain is + encountered. Set some vars to NULL so we don't try + to reference freed memory. + +2004-10-25 Wim Taymans + + * examples/seeking/Makefile.am: + * examples/seeking/cdplayer.c: (update_scale): + * examples/seeking/chained.c: (unlinked), (new_pad), (main): + * examples/seeking/playbin.c: (make_playerbin_pipeline), + (format_value), (update_scale), (iterate), (start_seek), + (stop_seek), (print_media_info), (play_cb), (pause_cb), (stop_cb), + (print_usage), (main): + Added some more examples, update others. + +2004-10-25 Ronald S. Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): + * ext/speex/gstspeexdec.c: (speex_dec_chain): + * ext/theora/theoradec.c: (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Add codec-name metadata. + +2004-10-25 Takao Fujiwara + + Reviewd by: Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + * po/POTFILES.in: + ALSA mixer track label internationalization (#154054). + +2004-10-25 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Export bitrate as metadata. + +2004-10-25 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Fix names, fix loop. + +2004-10-25 Ronald S. Bultje + + * ext/speex/gstspeexdec.c: (gst_speex_dec_init), + (speex_dec_convert): + sinkconvert function so oggdemux can get the file length (totem). + +2004-10-25 James Morrison + + Reviewed by: Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + Don't push incomplete packets. + * gst/typefind/gsttypefindfunctions.c: (m4a_type_find): + Fix MPEG-4 audio typefinding. + +2004-10-25 Ronald S. Bultje + + * sys/v4l/Makefile.am: + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_get_type), + (gst_v4lelement_init), (gst_v4lelement_dispose), + (gst_v4lelement_change_state): + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_open), + (gst_v4l_xoverlay_close), (idle_refresh), + (gst_v4l_xoverlay_set_xwindow_id): + * sys/v4l/gstv4lxoverlay.h: + * sys/v4l/v4l-overlay_calls.c: + * sys/v4l/v4l_calls.h: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: (plugin_init): + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_type), + (gst_v4l2element_init), (gst_v4l2element_dispose), + (gst_v4l2element_change_state): + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open), + (gst_v4l2_xoverlay_close), (idle_refresh), + (gst_v4l2_xoverlay_set_xwindow_id): + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2-overlay_calls.c: + * sys/v4l2/v4l2_calls.h: + Remove client-side overlay handling, use the X-server v4l plugin + for that. Nicer overlay, less code. Also make the plugin + compileable without X (but then without overlay, obviously). + Makes xwindowlistener obsolete, should we remove that? + +2004-10-25 Ronald S. Bultje + + * sys/oss/gstosssrc.c: (gst_osssrc_get_time), (gst_osssrc_get), + (gst_osssrc_src_query): + * sys/oss/gstosssrc.h: + OK, so people want offset in DEFAULT. This time, actually fix all + cases. + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Add FPS properly. + +2004-10-24 Ronald S. Bultje + + * gst/asfdemux/gstasfmux.c: + * gst/avi/gstavimux.c: + Framerate. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_set_property): + Fix properties (channel, norm, frequency). + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_property): + Flag typo. + * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults): + No warnings. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_clear_format_list): + Fix hang. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.h: + Yet Another Hack (tm) for kernel header borkedness. + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), + (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2_fourcc_from_structure), + (gst_v4l2src_link), (gst_v4l2src_getcaps), + (gst_v4l2src_change_state): + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), + (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): + Fix caps, keep track of state, work. + +2004-10-24 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Quiet. + +2004-10-24 Ronald S. Bultje + + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Don't mix bytes and samples. + +2004-10-24 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: + Basic pad template which accepts OGM tracks, speex, flac, vorbis + and theora. Any is incorrect. + * gst/asfdemux/gstasfmux.c: (gst_asfmux_vidsink_link): + Fix caps. + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_base_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_base_init), + (gst_v4lmjpegsrc_init), (gst_v4lmjpegsrc_srcconnect), + (gst_v4lmjpegsrc_getcaps), (gst_v4lmjpegsrc_change_state): + * sys/v4l/gstv4lmjpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), + (gst_v4lsrc_change_state): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_start), + (gst_v4lmjpegsrc_capture_stop): + Fix caps. Keep track of internal state. Work. + +2004-10-23 Ronald S. Bultje + + * ext/Makefile.am: + Fix the build fixes. + +2004-10-23 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (_find_chain_seek), + (gst_ogg_pad_push): + Check for pad availability before using it. + * ext/ogg/gstoggdemux.c: (_find_chain_process): + Fix parsing of chained ogg. Needs more work on the decoder side. + +2004-10-22 Benjamin Otte + + * gst/spectrum/Makefile.am: + * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main), + (idle_func): + Fix demo and reenable it. Yes, I'm currently playing with audio + analysis tools + +2004-10-22 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + We love it if files that start at zero work too... + +2004-10-22 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Handle files with missing EOS headers. + +2004-10-21 Zaheer Abbas Merali + + * gst/tcp/gsttcpserversink.c: + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_init_send): + Zero some variables first (need for accept not to return EINVAL) + +2004-10-20 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_push): + * ext/theora/theoradec.c: (theora_dec_sink_convert), + (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (gst_vorbis_dec_init), (vorbis_dec_convert), (vorbis_dec_chain): + Seeking and querying finetune. + +2004-10-20 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + * ext/raw1394/Makefile.am: + fix the build + +2004-10-20 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Wrong return. + * gst/playback/Makefile.am: + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init): + * gst/playback/gstplay-marshal.list: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init): + Fix marshallers. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event): + Silence. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_populate), + (gst_ogg_pad_push): + Yay for non-lineair granulepos in theora. + +2004-10-18 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): + * ext/dv/gstdvdec.h: + Make sure we renegotiate aspect ratio when the camera switches. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_push): + Start at zero. + * ext/theora/theoradec.c: (theora_dec_chain): + Skip headers. Bad idea for chained ogg, but fixes seeking. + +2004-10-18 Wim Taymans + + * configure.ac: + I swear, this is the last time I touch this. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_populate), + (_read_bos_process), (gst_ogg_demux_iterate), (gst_ogg_pad_new): + Faster seeking. + * ext/theora/theoradec.c: (theora_dec_sink_convert): + Time-to-default conversion. + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Don't error on unknown packets, just skip. We should probably + read them if we want to support chained ogg. + +2004-10-18 Wim Taymans + + * configure.ac: + Added cdaudio to wrong list. + +2004-10-18 Wim Taymans + + * configure.ac: + Revive cdaudio. + +2004-10-18 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), + (gst_smokeenc_resync), (gst_smokeenc_chain): + Fix mimetype on smoke encoder. + Add aspect ratio to dvdec. Not sure if these + values are correct though.... + +2004-10-18 Wim Taymans + + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init): + Fix vorbis property descriptions and ranges. + +2004-10-18 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Really do nothing when no data is available. + Go to the playing state when the stream is not seekable + instead of failing. + +2004-10-18 Wim Taymans + + * ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init), + (gst_cdaudio_get_event_masks), (gst_cdaudio_send_event), + (gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type), + (cdaudio_uri_get_protocols), (cdaudio_uri_get_uri), + (cdaudio_uri_set_uri), (cdaudio_uri_handler_init): + Added uri handler for cd:// + Port to new API. + +2004-10-18 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (gen_preroll_element), + (remove_prerolls), (unknown_type), (add_element_stream), + (new_decoded_pad), (setup_source), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_vis_element), (remove_sinks), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (stream_info_mute_pad), + (gst_stream_info_set_property), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Add sink padtemplate to decodebin. + Added some more comments. + Make queue size configurable in playbasebin. + Added possibility to use elements as sinks (ex cdaudio). + +2004-10-15 Wim Taymans + + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), + (gst_speexenc_chain): + Fix speex timestamps so that it gets muxed properly. + +2004-10-15 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_base_init), (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_dispose), + (gst_dv1394src_iso_receive), (gst_dv1394src_discover_avc_node), + (gst_dv1394src_change_state), (gst_dv1394src_get_event_mask), + (gst_dv1394src_event), (gst_dv1394src_get_formats), + (gst_dv1394src_convert), (gst_dv1394src_get_query_types), + (gst_dv1394src_query), (gst_dv1394src_uri_get_type), + (gst_dv1394src_uri_get_protocols), (gst_dv1394src_uri_get_uri), + (gst_dv1394src_uri_set_uri), (gst_dv1394src_uri_handler_init): + * ext/raw1394/gstdv1394src.h: + Added conversion/query functions. + Update buffer timestamps, + Added signals. + Added uri dv:// so it might play from the firewire in playbin. + Fix a possible leak. + Added debugging. + +2004-10-15 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_set_property), + (gst_dv1394src_get_property), (gst_dv1394src_iso_receive), + (gst_dv1394src_discover_avc_node), (gst_dv1394src_change_state): + * ext/raw1394/gstdv1394src.h: + Added AV/C VTR control support needed for some cameras. + Added automatic port detection. + Added properties for selecting the channel. + The configure.ac script is not yet updated to reflect the + new libavc1394 and librom1394 dependencies. + +2004-10-15 Wim Taymans + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse), (gst_qtdemux_handle_esds): + An esds box is not a container. + Fix parsing of mp4v boxes. + Do not try to renegotiate fps for each frame. Need to + find a better method. This should fix mp4 playback. + +2004-10-14 David Schleef + + * configure.ac: update for swfdec-0.3 and liboil-0.2 + * ext/swfdec/gstswfdec.c: update for swfdec-0.3 + * ext/swfdec/gstswfdec.h: same + * gst/videofilter/gstvideobalance.c: update for liboil-0.2 + * gst/videotestsrc/videotestsrc.c: same + +2004-10-14 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), + (is_sync_frame), (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): + Turn warnings into info. + Don't allow a state change in the streaming thread. + +2004-10-14 Thomas Vander Stichele + + * ext/vorbis/oggvorbisenc.c: + * ext/vorbis/vorbisdec.c: + fix template sample rate + +2004-10-13 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + Decoding the header first fixes some problems in resyncing + in more mp3s. + +2004-10-12 Wim Taymans + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_vis_element), (remove_sinks), (setup_sinks): + Added vis plugin support, need to configure the vis + element to activate it. + +2004-10-12 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get), + (gst_gnomevfssrc_srcpad_query), (gst_gnomevfssrc_srcpad_event): + Some debug. + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_handle_src_event), (gst_avi_demux_read_superindex), + (gst_avi_demux_read_subindexes), (gst_avi_demux_add_stream), + (gst_avi_demux_stream_index), (gst_avi_demux_skip), + (gst_avi_demux_sync), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), (gst_avi_demux_stream_header): + * gst/avi/gstavidemux.h: + Support for openDML-2.0 indx/ix## chunks. Support for broken index + recovery (where, if part of the index is broken, we will still read + the rest of the index and recover the broken part by stream + scanning). More broken media support. EOS workarounds. General AVI + braindamage headache recovery. Aspirin included. + +2004-10-11 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_open), + (cdparanoia_event), (cdparanoia_query): + Get rid of hideous lead-in. + +2004-10-11 Wim Taymans + + * gst/playback/gstplaybasebin.c: (setup_source): + Wrong var used to get g_list_next. + +2004-10-11 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_get), (cdparanoia_open): + Report discid as metadata, add duration. + +2004-10-11 Wim Taymans + + * gst/playback/gstplaybasebin.c: (setup_source): + Cleanup the previous pipeline a little earlier for the + case that a source element provides raw data. + +2004-10-11 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + reset v1 tag offset when there is no v1 tag. Fixes id3demux always + consuming the last 128 bytes, even though it was valid mp3 data. + +2004-10-10 Zaheer Abbas Merali + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), + (gst_v4lsrc_getcaps), (gst_v4lsrc_get): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + Change g_warnings to GST_WARNING_OBJECT and fix colourspace issue + +2004-10-10 Zaheer Abbas Merali + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps): + Fix for webcams that support only specific width or height + +2004-10-09 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): + Fix wrong discont event setup (fixes #154967). + +2004-10-09 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Error out on invalid data (fixes #154807). + +2004-10-09 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * ext/dvdread/dvdreadsrc.c: (_read): + Make titles > 0 work again (fixes #154834). + +2004-10-09 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_template_caps): + WMV3 missing in template caps. + +2004-10-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + OK, so the original code was too strict. It makes random AVI files + hang for seconds upon opening, which is unacceptable and is far + beyond the original goal of getting multiple chunks for one-chunk + sounc stream files. So now do just that. + +2004-10-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source), + (gst_play_base_bin_change_state): + Actually clean up streaminfo if output fails. This would trigger + if, for example, there was no CD in the drive. No preroll, so + a streaminfo structure is created, but the subsequent state change + of the thread fails. + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + Don't change state if parent failed. + +2004-10-08 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (gst_play_bin_init), (gst_play_bin_get_property), (handoff), + (gen_video_element), (remove_sinks): + Add small bits of code for screenshot handling. + +2004-10-08 Wim Taymans + + * gst/playback/gstplaybin.c: (gst_play_bin_set_property), + (gen_video_element), (gen_audio_element), (setup_sinks): + Don't assume the user provided sinks are named "sink"... + +2004-10-08 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gen_preroll_element), + (unknown_type), (setup_source), (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + Do not try to autoplug sources that generate raw streams like + cdparanoia. + disconnect the preroll overrun signal when we don't need it anymore. + +2004-10-08 Milosz Derezynski + + * ext/cdparanoia/gstcdparanoia.c: (_do_init), + Added reworked patch from #154903 from milosz derezynski (deadchip). + +2004-10-08 Wim Taymans + + * ext/cdparanoia/gstcdparanoia.c: (_do_init), + (cdparanoia_base_init), (cdparanoia_class_init), (cdparanoia_init), + (cdparanoia_dispose), (cdparanoia_get), (cdparanoia_change_state), + (cdparanoia_convert), (cdparanoia_uri_get_type), + (cdparanoia_uri_get_protocols), (cdparanoia_uri_get_uri), + (cdparanoia_uri_set_uri), (cdparanoia_uri_handler_init): + * ext/cdparanoia/gstcdparanoia.h: + This adds the cdda:// uri. + +2004-10-08 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (unknown_type), (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_init), + (gst_play_bin_set_property), (gen_video_element), + (gen_audio_element), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (stream_info_mute_pad), + (gst_stream_info_set_property), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Reuse the audio and video bins. + Some internal cleanups in the stream selection code. + +2004-10-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is + not coming from those elements. Moreover these elements should not keep + the xid they have been given when in NULL state. + +2004-10-07 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: + Actually only create a new toplevel window if we're not gonna + embed it right after. + +2004-10-07 Wim Taymans + + * gst/playback/gstplaybasebin.c: (play_base_bin_mute_pad), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream): + * gst/playback/gstplaybin.c: (setup_sinks): + Implement muting/unmuting of streams, mute streams that are not + used. + +2004-10-07 Wim Taymans + + * gst/typefind/gsttypefindfunctions.c: (ac3_type_find), + (plugin_init): + Added lame audio/x-ac3 typefind function. + +2004-10-06 Thomas Vander Stichele + + * configure.ac: + bump nano to cvs + +=== release 0.8.5 === + +2004-10-06 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + releasing 0.8.5, "Take You On" + +2004-10-06 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_init), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + * gst/playback/gstplaybin.c: (gen_video_element): + Do not signal the no_more_pads after the first pad when + we are plugging a non dynamic element with multiple + output pads (like swfdec, dvdec, ...). + +2004-10-06 Thomas Vander Stichele + + * configure.ac: + bump for prerelease + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/gstwavparse.c: + add ATRAC3 to STATIC CAPS to fix a warning + + * gst/matroska/ebml-read.c: + * gst-libs/gst/riff/riff-read.c: + fix typos + +2004-10-06 Stephane Loeuillet + + * gst-libs/gst/riff/riff-media.c: + generate caps for ATRAC3 audio streams + + * gst/realmedia/rmdemux.c: + generate caps for ATRAC3 audio streams + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/Makefile.am + * gst/wavparse/riff.h + * gst/wavparse/wavparse.vcproj + riff.h removal (unused and duplication with riff-ids.h) + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/gstwavparse.h + remove duplicated defines for audio codec codes + + * gst-libs/gst/riff/riff-ids.h + * gst/wavenc/riff.h: + add "4CC" code for ATRAC3 audio streams + add "4CC" code for ITU_G721_ADPCM (unused for now) + +2004-10-06 Wim Taymans + + * gst/flx/gstflxdec.c: (gst_flxdec_init), (gst_flxdec_loop): + Actually _do_ negotiation. Pass gdouble as arg instead + of guint64 for the framerate. + +2004-10-06 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_init), + (find_compatibles), (close_pad_link), (try_to_link_1), + (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + Set state on newly added element to READY so that negotiation + can happen ASAP. + Addes some more debug info. + Do not try to plug pads with multiple caps structures or ANY + because it is too dangerous since we do not do dynamic + replugging. + +2004-10-06 Thomas Vander Stichele + + written by: Gora Mohanty + + * po/LINGUAS: + * po/or.po: + add Oriya translation + +2004-10-05 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + Prevent overwrite of size member. Makes audio sound crappy. + +2004-10-05 Stephane Loeuillet + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Add rmvb to the list of known RealMedia extensions + +2004-10-05 Wim Taymans + + * ext/libmng/gstmngdec.c: (gst_mngdec_loop), (mngdec_error), + (mngdec_openstream), (mngdec_closestream), + (mngdec_handle_sink_event), (mngdec_readdata), + (mngdec_gettickcount), (mngdec_settimer), (mngdec_processheader), + (mngdec_getcanvasline), (mngdec_refresh), + (gst_mngdec_change_state): + Set the framerate correctly. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + There was something wrong with the index massaging. + +2004-10-04 Wim Taymans + + * ext/jpeg/gstjpeg.c: (smoke_type_find), (plugin_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), + (gst_smokedec_chain): + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), + (gst_smokeenc_init), (gst_smokeenc_resync), (gst_smokeenc_chain): + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.c: (smokecodec_encode_new), + (smokecodec_decode_new), (smokecodec_info_free), + (smokecodec_set_quality), (smokecodec_get_quality), + (smokecodec_set_threshold), (smokecodec_get_threshold), + (smokecodec_set_bitrate), (smokecodec_get_bitrate), + (find_best_size), (abs_diff), (put), (smokecodec_encode_id), + (smokecodec_encode), (smokecodec_parse_id), + (smokecodec_parse_header), (smokecodec_decode): + * ext/jpeg/smokecodec.h: + * ext/jpeg/smokeformat.h: + Updated smoke, new bitstream, allows embedding in ogg. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): + Fix seeking in some files. All this code is no longer needed (and + actually breaks stuff) because we now synchronize the full index + right when reading the header. + +2004-10-04 Wim Taymans + + * configure.ac: + configure update for libmng. + +2004-10-04 Wim Taymans + + * ext/libmng/Makefile.am: + * ext/libmng/gstmng.c: (plugin_init): + * ext/libmng/gstmng.h: + * ext/libmng/gstmngdec.c: (gst_mngdec_get_type), + (gst_mngdec_base_init), (gst_mngdec_class_init), + (gst_mngdec_sinklink), (gst_mngdec_init), (gst_mngdec_src_getcaps), + (gst_mngdec_loop), (gst_mngdec_get_property), + (gst_mngdec_set_property), (mngdec_error), (mngdec_openstream), + (mngdec_closestream), (mngdec_handle_sink_event), + (mngdec_readdata), (mngdec_gettickcount), (mngdec_settimer), + (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), + (gst_mngdec_change_state): + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.c: (gst_mngenc_get_type), + (mng_caps_factory), (raw_caps_factory), (gst_mngenc_base_init), + (gst_mngenc_class_init), (gst_mngenc_sinklink), (gst_mngenc_init), + (gst_mngenc_chain), (gst_mngenc_get_property), + (gst_mngenc_set_property): + * ext/libmng/gstmngenc.h: + Added basic MNG decoder. Needs more work. The encoder does + not work yet. + +2004-10-04 Ronald S. Bultje + + * gst/realmedia/rmdemux.c: (gst_rmdemux_handle_sink_event), + (gst_rmdemux_loop), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_dump_mdpr): + Don't hang on length=0 chunks. Some negotiation fixes. Signal + no-more-pads. + +2004-10-04 Thomas Vander Stichele + + * configure.ac: + you need at least 1.0.4 of speex + +2004-10-04 Iain + + * ext/speex/gstspeexdec.h: Revert the includes changes. + + * ext/speex/gstspeexenc.[ch]: Revert the includes changes. + +2004-09-30 Iain + + * sys/sunaudio/gstsunaudio.c (gst_sunaudiosink_open): Use the device + found during init or set as a property instead of hardcoding /dev/audio + +2004-10-04 Ronald S. Bultje + + * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), + (gst_rmdemux_init), (gst_rmdemux_handle_sink_event), + (gst_rmdemux_loop), (gst_rmdemux_add_stream), (re_hexdump_bytes), + (re_dump_pascal_string), (gst_rmdemux_dump__rmf), + (gst_rmdemux_dump_prop), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_dump_mdpr), (gst_rmdemux_dump_indx), + (gst_rmdemux_dump_data): + Use debug category, fix EOS handling. filesrc ! rmdemux now + works. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (sort), (gst_avi_demux_massage_index), + (gst_avi_demux_stream_header), (gst_avi_demux_stream_data): + Improve allocation, cutting and sorting of the index. How takes a + few seconds instead of minutes. + +2004-10-03 Christophe Fergeau + + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr): + fixed compilation + +2004-10-02 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add wing commander format mimetype/fourccs. + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + Don't crash if some value is 0. + +2004-10-02 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add DIB fourcc (raw, palettized 8-bit RGB). + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data): + Oops, fix strf_data reading bug. + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Use a non-NULL tag. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Time for hacks. Sorry Dave. At least one quicktime movie (a + trailer) that I've encountered contains multiple video tracks. + One of those is the actual video track, the other are one-frame + tracks (images). Unfortunately, the number of frames according + to the trak header is 1 for each, so that doesn't help. So + instead, I look at the duration and discard tracks with a + duration shorter than 20% of the length of the stream. Better + than nothing. + +2004-10-01 Christian Schaller + + * ext/ivorbis/vorbis.c: + Patch from Phil Blundell (Bug 152341) + +2004-10-01 Wim Taymans + + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), + (speex_dec_get_formats), (speex_dec_convert), + (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), + (speex_dec_chain), (gst_speexdec_get_property), + (gst_speexdec_set_property): + Small cleanups. + +2004-10-01 Wim Taymans + + * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), + (gst_wavparse_stream_init), (gst_wavparse_fmt), + (gst_wavparse_other), (gst_wavparse_loop), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + * gst/wavparse/gstwavparse.h: + Added some more debugging info. + Fix the case where the length of the file is 0. + Make sure we seek to sample borders. + +2004-10-01 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + Add some debug info to decodebin, update README + +2004-10-01 Ronald S. Bultje + + * ext/dvdnav/dvdnavsrc.c: (dvdnav_handle_navigation_event): + Don't use g_print(); use GST_DEBUG(). + +2004-10-01 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_queue_pads): + Handle EOS properly. + +2004-10-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_sinkconnect), + (gst_faad_chain), (gst_faad_change_state): + * ext/faad/gstfaad.h: + Allow playback of raw (unframed) MPEG AAC files (#148993). + +2004-10-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Throw error if we didn't recognize the stream. Fixes #152289. + +2004-10-01 Ronald S. Bultje + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): + Fix negotiation. + +2004-10-01 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Fix memleak. + +2004-10-01 Balamurali Viswanathan + + Reviewed by: Ronald S. Bultje + + * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_setparams): + Solve #152805. + * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_mute): + Solve 152806. + +2004-10-01 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_audio_caps_with_data): + Add codec_data handling (like asfdemux used to do). + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream): + Use riff-media for caps creation instead of our own (mostly + broken) copy of its functions. + +2004-10-01 Ronald S. Bultje + + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_capture): + Don't actually error out if we get another return value than + -EINVAL. Opposite to what I first thought, drivers have random + return values for this, although -EINVAL is the expected return + value. Since this is not fatal, we shouldn't use + GST_ELEMENT_ERROR() but just GST_ERROR_OBJECT(). + +2004-10-01 Ronald S. Bultje + + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_init), (dvdreadsrc_dispose), (dvdreadsrc_set_property), + (dvdreadsrc_get_property), (_open), (_seek), (_read), + (dvdreadsrc_get), (dvdreadsrc_open_file), + (dvdreadsrc_change_state): + Fix. Don't do one big huge loop around the whole DVD, that will + cache all data and thus eat sizeof(dvd) (several GB) before we + see something. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Actually NULL'ify event after using it. + * gst/matroska/ebml-read.c: (gst_ebml_read_use_event), + (gst_ebml_read_handle_event), (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_skip): + Handle events. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), + (gst_dvd_demux_init), (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_plugin_init): + Fix timing (this will probably break if I seek using menus, but + I didn't get there yet). VOBs and normal DVDs should now work. + Add a mpeg2-only pad with high rank so this get autoplugged for + MPEG-2 movies. + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_base_init), + (gst_mpeg_demux_class_init), (gst_mpeg_demux_init), + (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), + (gst_mpeg_demux_get_private_stream), (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_plugin_init): + Use this as second rank for MPEG-1 and MPEG-2. Still use this for + MPEG-1 but use dvddemux for MPEG-2. + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), + (gst_mpeg_parse_init), (gst_mpeg_parse_new_pad), + (gst_mpeg_parse_parse_packhead): + Timing. Only add pad template if it exists. Add sink template from + class and not from ourselves. This means we will always use the + correct sink template even if it is not the one defined in this + file. + +2004-09-29 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Fix playback of mpeg again, timestamps where screwed up by + patch 1.61. + +2004-09-29 Ronald S. Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_src_query): + Only return true if we actually filled something in. Prevents + player applications from showing a random length for flac files. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), + (gst_riff_read_use_event), (gst_riff_read_handle_event), + (gst_riff_read_seek), (gst_riff_read_skip), (gst_riff_read_strh), + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_iavs): + OK, ok, so I implemented event handling. Apparently it's normal + that we receive random events at random points without asking + for it. + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), + (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data), (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Implement non-lineair chunk handling and subchunk processing. + The first solves playback of AVI files where the audio and video + data of individual buffers that we read are not synchronized. + This should not happen according to the wonderful AVI specs, but + of course it does happen in reality. It is also a prerequisite for + the second. Subchunk processing allows us to cut chunks in small + pieces and process each of these pieces separately. This is + required because I've seen several AVI files with incredibly large + audio chunks, even some files with only one audio chunk for the + whole file. This allows for proper playback including seeking. + This patch is supposed to fix all AVI A/V sync issues. + * gst/flx/gstflxdec.c: (gst_flxdec_class_init), + (flx_decode_chunks), (flx_decode_color), (gst_flxdec_loop): + Work. + * gst/modplug/gstmodplug.cc: + Proper return value setting for the query() function. + * gst/playback/gstplaybasebin.c: (setup_source): + Being in non-playing state (after, e.g., EOS) is not necessarily + a bad thing. Allow for that. This fixes playback of short files. + They don't actually playback fully now, because the clock already + runs. This means that small files (<500kB) with a small length + (<2sec) will still not or barely play. Other files, such as mod + or flx, will work correctly, however. + +2004-09-28 Wim Taymans + + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (gst_speex_dec_base_init), + (gst_speex_dec_class_init), (speex_dec_get_formats), + (speex_get_event_masks), (speex_get_query_types), + (gst_speex_dec_init), (speex_dec_convert), (speex_dec_src_query), + (speex_dec_src_event), (speex_dec_event), (speex_dec_chain), + (gst_speexdec_get_property), (gst_speexdec_set_property), + (speex_dec_change_state): + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.c: (gst_speexenc_get_formats), + (gst_speexenc_get_type), (speex_caps_factory), (raw_caps_factory), + (gst_speexenc_base_init), (gst_speexenc_class_init), + (gst_speexenc_sinkconnect), (gst_speexenc_convert_src), + (gst_speexenc_convert_sink), (gst_speexenc_get_query_types), + (gst_speexenc_src_query), (gst_speexenc_init), + (gst_speexenc_get_tag_value), (comment_init), (comment_add), + (gst_speexenc_metadata_set1), (gst_speexenc_set_metadata), + (gst_speexenc_setup), (gst_speexenc_buffer_from_data), + (gst_speexenc_push_buffer), (gst_speexenc_set_header_on_caps), + (gst_speexenc_chain), (gst_speexenc_get_property), + (gst_speexenc_set_property), (gst_speexenc_change_state): + * ext/speex/gstspeexenc.h: + Rewrote speex encoder, make sure it can be embedded in ogg. + Implemented speex decoder. + +2004-09-28 Christian Schaller + + * configure.ac: + Remove kioslave plugin. Markey is brewing a new working one + * ext/Makefile.am: Remove kioslave plugin + * ext/kio: remove + * gst-plugins.spec.in: remove kio plugin from spec + +2004-09-27 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), + (is_sync_frame), (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients): + * gst/tcp/gstmultifdsink.h: + Make syncing to keyframes actually work for new clients and lagging + clients. + +2004-09-26 Benjamin Otte + + * gst/debug/gstnavigationtest.c: (gst_navigationtest_class_init), + (gst_navigationtest_handle_src_event), (draw_box_planar411), + (gst_navigationtest_planar411), (gst_navigationtest_change_state): + * gst/debug/gstnavigationtest.h: + make navigationtest display button-press and button-release events + +2004-09-26 Iain + + * gst/interleave/interleave.c (all_channels_new_media): Checks if all + the channels have received a new media event. + (interleave_buffered_loop): Compresses a new media event on all + channels into one. + +2004-09-26 Iain + + * gst/wavenc/gstwavenc.c (gst_wavenc_chain): Company says we need to + call the sinkpad's default event handler and not the srcpads. He also + says this is confusing :) + (gst_wavenc_stop_file): Company says that seek events only go upstream + we should send a discontinuous downstream instead. + +2004-09-25 Christian Schaller + + * Update SPEC file to be usable in conjunction with Fedora Core, + Fedora.us and freshrpms packages + * Fix typo in multifilesrc test Makefile + +2004-09-24 Wim Taymans + + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + Only signal the no_more_pads signal when we have + added the stream to our list. + +2004-09-24 Wim Taymans + + * gst/playback/gstplaybasebin.c: (remove_prerolls), + (new_decoded_pad): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (setup_sinks): + Don't try to preroll or decode more than one audio/video + track. + +2004-09-24 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Throw error if we failed to find a suitable output. This should + throw an error if we successfully set up a pipeline (e.g. because + we recognized a media file) but found no decodable streams in it + (e.g. because it contains only media stream types for which we + have no decoders, or because it's not a media type). + +2004-09-23 Ronald S. Bultje + + * ext/dirac/Makefile.am: + * ext/dirac/gstdirac.cc: + * ext/dirac/gstdiracdec.cc: + * ext/dirac/gstdiracdec.h: + Do something. Don't actually know if this works because I don't + have a demuxer yet. + * ext/gsm/gstgsmdec.c: (gst_gsmdec_getcaps): + Add channels=1 to caps returned from _getcaps(). + * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_get_type), + (gst_ogm_video_parse_get_type), (gst_ogm_audio_parse_base_init), + (gst_ogm_video_parse_base_init), (gst_ogm_parse_init), + (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init), + (gst_ogm_parse_sink_convert), (gst_ogm_parse_chain), + (gst_ogm_parse_change_state): + Separate between audio/video so ogmaudioparse actually uses the + audio pad templates. Both audio and video work now, including + autoplugging. Also use sometimes-srcpad hack. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Handle events better. Don't hang on infinite loops. + * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), + (gst_avi_demux_init), (gst_avi_demux_reset), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_header), (gst_avi_demux_stream_data), + (gst_avi_demux_change_state): + * gst/avi/gstavidemux.h: + Improve A/V sync. Still not perfect. + * gst/matroska/ebml-read.c: (gst_ebml_read_seek), + (gst_ebml_read_skip): + Handle events better. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (gst_qtdemux_loop_header), (qtdemux_parse_trak), + (qtdemux_audio_caps): + Add IMA4. Improve event handling. Save offset after a seek when + the headers are at the end of the file so that we don't end up in + an infinite loop. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): + Add low-priority typefind support for files with no length. + +2004-09-23 Zaheer Abbas Merali + + * testsuite/multifilesink/Makefile.am: + fix typo + +2004-09-22 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix + mistakes from thaytan's patches. + +2004-09-23 Jan Schmidt + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + For completeness, XSync in the destroy function as xvimage does. + +2004-09-23 Jan Schmidt + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): + Correct caps negotiation + * gst/volume/gstvolume.c: (volume_chain_float), + (volume_chain_int16): + Modify debug output to be little more informative + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_destroy): + Add XSync calls after detaching from the shared memory segment to + avoid a crash. + +2004-09-22 Zaheer Abbas Merali + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_loop): + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), + (gst_vorbisenc_chain): + * ext/vorbis/vorbisenc.h: + remove explicit newmedia support from oggmux and vorbisenc + add debug category to vorbisenc + * gst/multifilesink/gstmultifilesink.c: + (gst_multifilesink_class_init), (gst_multifilesink_init), + (gst_multifilesink_dispose), (gst_multifilesink_set_location), + (gst_multifilesink_set_property), (gst_multifilesink_next_file), + (gst_multifilesink_handle_event), (gst_multifilesink_chain), + (plugin_init): + * gst/multifilesink/gstmultifilesink.h: + add support for streamheader in multifilesink + +2004-09-22 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (_read_var_length), (_read_guid), + (gst_asf_demux_process_segment), (gst_asf_demux_handle_data), + (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event): + Prevent infinite loops. More correct error reporting. + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Error out if negotiation fails. + * gst/playback/gstplaybasebin.c: (setup_source), + (gst_play_base_bin_change_state), (gst_play_base_bin_error), + (gst_play_base_bin_found_tag): + Error/tag forwarding. Pre-roll fixes for source errors on state + changes (e.g. "file does not exist") to prevent hangs. + +2004-09-21 Zaheer Abbas Merali + + * testsuite/multifilesink/Makefile.am: + * testsuite/multifilesink/lame_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/multifilesrc_test.c: (main): + * testsuite/multifilesink/oggtheora_test.c: + (gst_newmedia_base_init), (gst_newmedia_class_init), + (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), + (test_format), (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/oggvorbis_test.c: + (gst_newmedia_base_init), (gst_newmedia_class_init), + (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), + (test_format), (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/wavenc_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + New media tests + +2004-09-20 Christian Schaller + + * Fix mikmod license to LGPL as they have relicensed + * Move Dirac and Effectv into LGPL section of README_license + +2004-09-20 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), + (gst_mad_change_state): + Allow for mp3 rate/channels changes. However, only very + conservatively. Reason that we *have* to enable this is smiply + because the mad find_sync() function is not good enough, it will + regularly sync on random data as valid frames and therefore make + us provide random caps as *final* caps of the stream. The best fix + I could think of is to simply require several of the same stream + changes in a row before we change caps. + The actual testcase that works now is # + * ext/ogg/Makefile.am: + * ext/ogg/gstogg.c: (plugin_init): + * ext/ogg/gstogmparse.c: + OGM support (video only for now; I need an audio sample file). + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_process_stream), (gst_asf_demux_video_caps), + (gst_asf_demux_add_video_stream): + WMV extradata. + * gst/playback/gstplaybasebin.c: (unknown_type): + Don't error out on single unknown-types after all. It's wrong. + If we found type of video and audio but not of a subtitle stream, + it will still error out (which is unwanted). Will find a better fix + later on. + * gst/typefind/gsttypefindfunctions.c: (ogmvideo_type_find), + (ogmaudio_type_find), (plugin_init): + OGM support. + +2004-09-20 Johan Dahlin + + * ext/jpeg/gstjpegdec.c (gst_jpegdec_chain): Allocate the buffer + after setting caps. + +2004-09-19 Zaheer Abbas Merali + + * gst/wavenc/gstwavenc.c: (gst_wavenc_init), (gst_wavenc_chain): + * gst/wavenc/gstwavenc.h: + Added newmedia support to wavenc + +2004-09-17 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_fd_has_closed), + (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), + (gst_fdset_fd_can_write), (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_get_stats), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_handle_clients), + (gst_multifdsink_close), (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_removed): + Small cleanups in fdset.c + Use a hastable to map fd to the client structure for faster + lookup in _remove and get_stats. + Added virtual function to close the fds. + Handle clients even when the select/poll call was unblocked because + of a command. + Implement syncing to keyframe in the recovery procedure. + +2004-09-16 Iain + + * gst/audioconvert/gstaudioconvert.c (_fixate_caps_to_int): Free the + try caps. + +2004-09-15 Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream): + Caps are only set if the type of the stream is unknown, but this + is initialized in ->init_stream(), so set to UNKNOWN after calling + ->init_stream() so that capsnego starts. + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_data): + Just hardcode for raw audio then. AVI audio sucks. + +2004-09-15 Arwed v. Merkatz + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-mux.c: (audiosink_templ), + (gst_matroska_mux_audio_pad_link): + * gst/typefind/gsttypefindfunctions.c: (tta_caps), (plugin_init): + Use audio/x-ttafile for tta files and audio/x-tta for raw tta frames. + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_data): + Try to fix a/v sync issues. + +2004-09-15 David Schleef + + * configure.ac: remove NASM check, since we don't use it. Update + dirac check to 0.4 + * ext/dirac/gstdiracdec.cc: update to current 0.4 API + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Initialized variables. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (qtdemux_parse), (qtdemux_parse_trak), + (gst_qtdemux_handle_esds), (qtdemux_audio_caps): Fix seeking, add + SVQ3 format + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_data): + * gst/avi/gstavidemux.h: + Fix for compressed audio (mp3) timestamp generation. How did this + ever work? + +2004-09-15 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_get_property): + Volume is a double not a float. + +2004-09-15 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): + Don't close the fd in multifdsink as we didn't open it in the + first place. Some cleanups. + +2004-09-15 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Fix the case where the muxer would mark pages as delta + frames when they are not (vorbis only ogg). + +2004-09-15 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (state_change), (setup_source), + (gst_play_base_bin_change_state): + Handle the case where we failed to setup a clear pipeline. This + will throw an error (or EOS, another nice case) and if you don't + catch that, the app will wait for the signal forever (and thus + hang). + +2004-09-15 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssink.c: + (gst_gnomevfssink_uri_get_protocols): + * ext/gnomevfs/gstgnomevfssrc.c: + (gst_gnomevfssrc_uri_get_protocols): + * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): + * ext/gnomevfs/gstgnomevfsuri.h: + Use _uri_new() instead of _open(), so it doesn't take as long and + Christophe's computer won't hang. + * gst/playback/gstplaybasebin.c: (unknown_type): + Throw error on unknown media type, so apps actually display it. + +2004-09-14 Brian Cameron + + * gst/playback/gstplaybasebin.c: (queue_overrun), (no_more_pads), + (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_add_element): + * gst/playback/gstplaybin.c: (gst_play_bin_send_event): + Some more work on making sure seeking pauses the pipeline and + that changing the uri actually does something. + +2004-09-17 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_close): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + Be a bit more paranoid when freeing memory. + +2004-09-13 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Don't crash by dividing by zero (see sample movie in #126922). + +2004-09-13 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Don't touch non-existing data (fixes crash on file in #140147). + +2004-09-13 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: + (gst_play_base_bin_dispose), (gst_play_base_bin_set_property): + Handle double disposals, and proper change of URIs. + +2004-09-13 Martin Eikermann + + * gst/mpegstream/gstmpegparse.c: + fix synchronistation for streams recorded from digital PCR + fixes bug #119376 + +2004-09-13 Ronald S. Bultje + + * ext/gnomevfs/Makefile.am: + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_get_type), + (gst_gnomevfssink_dispose), (gst_gnomevfssink_init), + (gst_gnomevfssink_uri_get_type), + (gst_gnomevfssink_uri_get_protocols), + (gst_gnomevfssink_uri_get_uri), (gst_gnomevfssink_uri_set_uri), + (gst_gnomevfssink_uri_handler_init), + (gst_gnomevfssink_set_property), (gst_gnomevfssink_get_property), + (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_type), + (gst_gnomevfssrc_init), (gst_gnomevfssrc_dispose), + (gst_gnomevfssrc_uri_get_type), + (gst_gnomevfssrc_uri_get_protocols), (gst_gnomevfssrc_uri_get_uri), + (gst_gnomevfssrc_uri_set_uri), (gst_gnomevfssrc_uri_handler_init), + (gst_gnomevfssrc_set_property), (gst_gnomevfssrc_get_property), + (gst_gnomevfssrc_open_file), (gst_gnomevfssrc_close_file): + * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): + * ext/gnomevfs/gstgnomevfsuri.h: + Add URI support to Gnome-VFS plugins. Tries to load a fixed list + of fake URIs to see which this version of Gnome-VFS likes, and + uses that for the Gst-URI interface. Makes playbin support http:// + streams. Also fix up some stupid behaviour in gnomevfssrc. + +2004-09-13 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), + (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): + Update mixer (to sync with other sessions) if we try to obtain + a new value. This makes alsamixer work accross applications. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + Only call sync functions if we're running, else alsalib asserts. + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): + Sometimes fails to compile. Possibly a gcc bug. + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + Add a reference to an application-provided object, because we lose + this same reference if we add it to the bin. If we don't do this, + we can only use this object once and thus crash if we go from + ready to playing, back to ready and back to playing again. + Also add an audioscale element because several cheap soundcards - + like mine - don't support all samplerates. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_xcontext_clear), (gst_ximagesink_change_state): + Fix wrong order or PAR calls. Makes automatically obtained PAR + from the X server atually being used. + +2004-09-12 David Schleef + + Fixes: #151879, #151881, #151882, #151883, #151884, #151886, + #151887, #152102, #152247. + * examples/indexing/indexmpeg.c: 64-bit warning fixes. + * examples/seeking/cdparanoia.c: same + * examples/seeking/cdplayer.c: same + * examples/seeking/seek.c: same + * examples/seeking/spider_seek.c: same + * examples/seeking/vorbisfile.c: same + * examples/stats/mp2ogg.c: same + * ext/esd/esdsink.c: (gst_esdsink_class_init), + (gst_esdsink_dispose): Dispose of element properly. + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_seek): 64-bit warning + fixes. + * ext/nas/nassink.c: (gst_nassink_class_init), + (gst_nassink_dispose): Dispose of element correctly. + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix leak. + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): + Fix 64-bit warning. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): + Fix 64-bit warning. + +2004-09-12 Stephane Loeuillet + + * configure.ac : change speex detection as 1.1.6 now uses + .pc/pkg-config and they changed their headers location. + +2004-09-09 Arwed v. Merkatz + + * gst/matroska/matroska-mux.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), + (gst_matroska_mux_start), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data): + Write multiple blocks/frames per cluster. + Write meta-seek information (seek heads). + +2004-09-09 Scott Wheeler + + * gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_set_property), (gst_play_bin_get_property), + (gen_audio_element), (gen_audio_element): + Add a volume element / property to the pipeline. + +2004-09-07 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): + Copy timestamps from the master pad to the output buffers. + +2004-09-03 Thomas Vander Stichele + + * ext/raw1394/gstdv1394src.c: + throw errors when applicable + +2004-09-01 Arwed v. Merkatz + + * gst/matroska/ebml-ids.h: + * gst/matroska/ebml-read.c: (gst_ebml_read_date): + * gst/matroska/ebml-write.c: (gst_ebml_write_date): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_finish): + automatically convert unix time <-> ebml time when reading/writing + a date, use gst_ebml_write_uint to write CUETIME, + not gst_ebml_write_date. + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), + (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_link), + (gst_matroska_mux_track_header), (gst_matroska_mux_start), + (gst_matroska_mux_write_data): + Write track and segment UIDs, write muxing date, write + TRACKDEFAULTDURATION for TTA audio, write BLOCKDURATION if known. + Create cues for audio only files. + +2004-08-31 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + Re-commit ALSA switches. + * gst/adder/gstadder.c: (gst_adder_loop): + 64-bit fix (#151416). + * gst/debug/progressreport.c: (gst_progressreport_report): + 64-bit fix (#151419). + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents): + 64-bit fix (#151420). + * gst/playback/test3.c: (update_scale): + 64-bit fix (#151421). + +2004-08-31 Thomas Vander Stichele + + * configure.ac: + bump nano to cvs + +=== release 0.8.4 === + +2004-08-02 Thomas Vander Stichele + + * configure.ac: releasing 0.8.4, "Alias" + +2004-08-31 Thomas Vander Stichele + + * ext/theora/Makefile.am: + fix makefile. Fixes #151462. + +2004-08-30 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write): + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): + Fix some memory leaks. + +2004-08-30 Thomas Vander Stichele + + Patch by: David Schleef + + * configure.ac: + * sys/Makefile.am: + rename our detection macro for V4L2. Fixes #151236. + +2004-08-30 Thomas Vander Stichele + + Patch by: David Schleef + + * configure.ac: + check to define LAMEPRESET. Fixes #151232. + +2004-08-27 David Schleef + + * sys/glsink/glimagesink.c: (gst_glimagesink_ximage_put), + (gst_glimagesink_xwindow_new), (gst_glimagesink_xcontext_get), + (gst_glimagesink_fixate): Move local variable declarations to + make gcc-2.95 happy. + +2004-08-27 Thomas Vander Stichele + + * configure.ac: + bump nano for prerelease + +2004-08-27 David Schleef + + * sys/sunaudio/Makefile.am: Add sunaudiosrc patch from Bala + * sys/sunaudio/gstsunaudiosrc.c: + * sys/sunaudio/gstsunaudiosrc.h: + +2004-08-27 Arwed v. Merkatz + + * gst/matroska/ebml-read.c: (gst_ebml_peed_id), (gst_ebml_read_element_id), + handle EOS correctly + * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_link): + * gst/matroska/matroska-mux.h: + added BITMAPINFOHEADER structure, mux video/x-divx and video/x-xvid in + VFW compatibility mode + +2004-08-27 Thomas Vander Stichele + + patch by: Zaheer Abbas Merali + + * ext/ogg/gstoggmux.c: + * ext/vorbis/vorbisenc.c: + * ext/vorbis/vorbisenc.h: + handle NEWMEDIA + +2004-08-26 Arwed v. Merkatz + + * gst/matroska/ebml-write.c: (gst_ebml_write_float), + fix byte order reversion on little endian machines. + * gst/matroska/matroska-mux.c: (audiosink_templ), + (gst_matroska_mux_audio_pad_link): + add TTA codec to the list of supported codecs. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), + (gst_matroska_mux_start), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data): + * gst/matroska/matroska-mux.h: + write segment duration correctly, write muxing app string, fixes bugs + #140897 and #140898. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_loop), + wait for all pads to be negotiated before starting to mux. + +2004-08-26 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain): + * ext/lame/gstlame.h: + Added new media support to lame + +2004-08-25 Arwed v. Merkatz + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup), + send vorbis headers at the beginning of a stream, fixes bug #141554. + Interpret BLOCKDURATION and set buffer duration accordingly, fixes + bug #148950. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + enable demuxing of TTA audio streams, fixes bug #148951. + * gst/typefind/gsttypefindfunctions.c: (tta_type_find), (plugin_init), + enable typefinding for TTA audio files, fixes bug #148711. + * ext/xvid/gstxviddec.c: (gst_xviddec_chain), + set XVID_LOWDELAY flag for decoding so xvid always returns an image, + fixes playback of packed bitstream and xvid with bframes, bug #135407. + +2004-08-24 Sebastien Cote + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_read_skip): fix infinite loop in wavparse, fixes bug + #144616, patch reviewed by Ronald and committed by Christophe Fergeau + + +2004-08-23 Iain + + * ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): Special case COMM + tags. They appear to be handled differently to normal. + (tag_list_to_id3_tag_foreach): Ditto. + +2004-08-22 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Make sure we never send -1 granulepos. + +2004-08-20 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_loop): + I will accept bitchslappings with non sharp objects. + +2004-08-20 Zaheer Abbas Merali + + * configure.ac: + Clean up the test for lame presets + +2004-08-19 Zaheer Abbas Merali + + * configure.ac: + * ext/lame/Makefile.am: + * ext/lame/gstlame.c: (gst_lame_class_init), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): + Only enable lame presets if version of lame has presets in API + +2004-08-19 Jan Schmidt + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_get): + * gst/udp/gstudpsrc.h: + Don't call gst_pad_push in a get function. Fixes #150449 + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_set_mode), + (gst_fdset_get_mode), (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + * gst/tcp/gstfdset.h: + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write): + * gst/tcp/gstmultifdsink.h: + Some extra checks in gstfdset. + Only use send() when the fd is a socket. Don't try to + read from write only fds. + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + Add more locking and bounds checking. + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_wait): + Realloc test fdset in the lock and right before starting + the poll call. Bump the limit to 4096. + +2004-08-17 David Schleef + + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: Fix caps to handle full range + of rates and channels. Make debugging less obnoxious. + + Patch from Balamurali Viswanathan implementing a mixer for + Sun audio. (bug #144091): + * sys/sunaudio/gstsunelement.c: + * sys/sunaudio/gstsunelement.h: + * sys/sunaudio/gstsunmixer.c: + * sys/sunaudio/gstsunmixer.h: + +2004-08-17 Zaheer Abbas Merali + + * gst/audioscale/gstaudioscale.c: + * gst/audioscale/gstaudioscale.h: + made audioscale resample from any sample rate to any sample rate + +2004-08-17 Thomas Vander Stichele + + * ext/libpng/gstpngdec.c: + error out on unsupported types + +2004-08-17 Iain + + * ext/flac/gstflacenc.c (gst_flacenc_update_quality): Only set the + mid_side and loose_mid_side properties if its a stereo stream. + +2004-08-17 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_get_formats), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): + Add a debug line. + +2004-08-17 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate), + (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_buffer_from_page), (gst_ogg_mux_push_page), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Mark delta units in the muxer. + Try to decode the packet after an out-of-sync error from + libogg. + +2004-08-17 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_set_property), (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + Added option to send a keyframe to clients as the first buffer. + Make timeout property writable. + +2004-08-17 Thomas Vander Stichele + + patch by: Wim Taymans + + * gst/tcp/gstfdset.c: + * gst/tcp/gstmultifdsink.c: + fix index comparison, should include 0 + +2004-08-16 Wim Taymans + + * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_new), + (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + copy when reallocing for poll so the select arguments don't get + changed during the call + +2004-08-16 Wim Taymans + + * ext/theora/theoraenc.c: (gst_border_mode_get_type), + (gst_theora_enc_class_init), (theora_enc_sink_link), + (theora_buffer_from_packet), (theora_enc_chain): + Fix bug where buffers were not marked as keyframes + correctly. + +2004-08-15 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), + (gst_lame_preset_get_type), (gst_lame_class_init): + describe the enum values for vbr mode and presets more verbosely + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_mode_get_type), + (gst_lame_quality_get_type), (gst_lame_padding_get_type), + (gst_lame_preset_get_type), (gst_lame_class_init), (gst_lame_init), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + add preset property to lame so it can use lame presets + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_get_property): + whoops forgot break, thanks teuf + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), + (gst_lame_class_init), (gst_lame_src_getcaps), + (gst_lame_sink_link), (gst_lame_init), (gst_lame_set_property), + (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + fix lame's broken vbr stuff, allow it to resample if need be, and also + make xing header optional + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_getcaps), (gst_lame_init): + added getcaps function so samplerate doesnt get fixated to silly values + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_link): + revert previous fix + +2004-08-12 Johan Dahlin + + * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Remove bogus + checks. Doesn't matter what state we are in. Interfaces are a + compile time thing, not runtime. It also broke the python bindings. + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_link): + made source pad link function check if sinkpad is ok..fixes the problem + where core fixates the output rate of lame stupidly + +2004-08-12 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_fixate): + * sys/v4l/v4l_calls.c: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_set_capture): + fix fixate function to handle nonsimple caps. + remove bogus check in _link + cleanups + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init): + set default compression ratio parameter to 0.0 so bitrate parameter + works :) + +2004-08-11 David Schleef + + * gst/tcp/gstfdset.c: Fix compile problem on OS/X. + +2004-08-11 David Schleef + + * gst/mpeg1sys/gstmpeg1systemencode.c: Oops, this was correct + before. + +2004-08-11 David Schleef + + * gst-libs/gst/video/videosink.h: Change copyright block to LGPL. + +2004-08-11 David Schleef + + * ext/pango/gsttextoverlay.c: Add copyright block and fix plugin + license field + * gst-libs/gst/idct/Makefile.am: Remove mmx/sse code + * gst-libs/gst/video/gstvideosink.c: Change copyright block to + LGPL. + * gst/auparse/gstauparse.c: Fix plugin license field. + * gst/monoscope/gstmonoscope.c: Fix plugin license field. + * gst/mpeg1sys/gstmpeg1systemencode.c: Fix plugin license field. + * gst/rtp/gstrtp.c: Fix plugin license field. + +2004-08-11 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstfdset.c: (gst_fdset_mode_get_type), (nearest_pow), + (ensure_size), (gst_fdset_new), (gst_fdset_free), + (gst_fdset_set_mode), (gst_fdset_get_mode), (gst_fdset_add_fd), + (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), + (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), + (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), + (gst_fdset_fd_can_write), (gst_fdset_wait): + * gst/tcp/gstfdset.h: + * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_clear), (gst_multifdsink_get_stats), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property), (gst_multifdsink_init_send), + (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_wait), (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Abstracted away the select call, implemented poll (yes we ran into + the 1024 limit in production). + +2004-08-11 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpplugin.c: + improve debuggging, remove assert + +2004-08-10 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), + (gst_client_status_get_type), (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp-marshal.list: + Starting to prepare for specifying buffer time in other units + than buffers. Expose remove reason in signal. + +2004-08-10 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), + (gst_multifdsink_chain), (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + Added more debugging info. Changed the way clients are + removed from the lists. Fixed a bug where a bad file descriptor + could cause many clients to be removed. + +2004-08-06 Benjamin Otte + + * gst/videotestsrc/gstvideotestsrc.c: (generate_capslist): + allow all pixel-aspect-ratios, not just 1:1 + +2004-08-09 David Schleef + + * sys/glsink/ARB_multitexture.h: Remove old files. + * sys/glsink/EXT_paletted_texture.h: + * sys/glsink/NV_register_combiners.h: + * sys/glsink/gstgl_nvimage.c: + * sys/glsink/gstgl_pdrimage.c: + * sys/glsink/gstgl_rgbimage.c: + * sys/glsink/gstglsink.c: + * sys/glsink/gstglsink.h: + * sys/glsink/gstglxwindow.c: + * sys/glsink/regcomb_yuvrgb.c: + +2004-08-09 David Schleef + + Patch from Gernot Ziegler rewriting the + GL sink plugin. (Bug #147302) + + * configure.ac: Test for OpenGL + * sys/Makefile.am: Use test for OpenGL + * sys/glsink/Makefile.am: + * sys/glsink/glimagesink.c: rewrite + * sys/glsink/glimagesink.h: rewrite + +2004-08-09 David Schleef + + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init): Only allow + sane framerates. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): same + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): same + * testsuite/gst-lint: Test for G_GUINT64_FORMAT usage near gettext. + +2004-08-09 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + Do a bit more logging, make the client_read code more robust. + +2004-08-09 Thomas Vander Stichele + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init_source), + (gst_jpegdec_fill_input_buffer), (gst_jpegdec_skip_input_data), + (gst_jpegdec_resync_to_restart), (gst_jpegdec_term_source), + (gst_jpegdec_init), (gst_jpegdec_chain): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), + (gst_multipart_demux_chain), (gst_multipart_demux_change_state): + cleanups, debugging fixes and memleak plugging + +2004-08-09 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_get_formats), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain), + (theora_dec_change_state): + Don't crash on missing header packets. + +2004-08-09 Thomas Vander Stichele + + * po/LINGUAS: + * po/sq.po: + Added Albanian translation (Laurent Dhima) + * po/cs.po: + updated + +2004-08-09 Thomas Vander Stichele + + * ext/lame/gstlame.c: + fix/add debugging + +2004-08-09 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: + * sys/xvimage/xvimagesink.c: + assign all TOO_LAZY's to a real category. Thanks to Warthy Warthog. + +2004-08-06 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + Make sure we don't try to read more from a client that what + ioctl says us or we deadlock. + +2004-08-05 Thomas Vander Stichele + + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_link), + (gst_videotestsrc_change_state), (gst_videotestsrc_src_query), + (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): + decouple running_time and n_frames so it can handle changing + framerate while running + +2004-08-05 Thomas Vander Stichele + + * po/nl.po: + * po/sv.po: + updated translations + +2004-08-04 Benjamin Otte + + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_get_capslist), (generate_capslist), + (plugin_init): + generate the list of supported caps at startup and reuse it instead + of always generating it + +2004-07-30 Benjamin Otte + + * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link): + whoops, last checkin broke normal build + +2004-08-03 Benjamin Otte + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume), + (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), + (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), + (gst_alsa_mixer_get_option): + * ext/dvdnav/dvdnavsrc.c: (dvdnav_get_event_name), + (dvdnavsrc_print_event): + * ext/ogg/gstoggdemux.c: (_find_chain_process), (gst_ogg_print): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_pad_link), + (gst_ogg_mux_pad_unlink): + * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link), + (gst_multipart_mux_pad_unlink): + * gst/videofilter/gstvideobalance.c: + (gst_videobalance_colorbalance_set_value): + * gst/videomixer/videomixer.c: (gst_videomixer_pad_link), + (gst_videomixer_pad_unlink): + * po/uk.po: + * sys/oss/gstossmixer.c: + * sys/v4l/gstv4lcolorbalance.c: + * sys/v4l/gstv4ltuner.c: + * sys/v4l/v4lsrc_calls.c: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2tuner.c: + compile fixes for --disable-gst-debug, G_DISABLE_ASSERT and friends + +2004-08-03 Benjamin Otte + + * examples/dynparams/filter.c: (ui_control_create): + * examples/gstplay/player.c: (print_tag): + * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): + * ext/gdk_pixbuf/gstgdkanimation.c: + (gst_gdk_animation_iter_may_advance): + * ext/jack/gstjack.c: (gst_jack_request_new_pad): + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), + (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): + * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): + * gst-libs/gst/media-info/media-info-test.c: (print_tag): + * gst/sine/demo-dparams.c: (main): + * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): + * testsuite/alsa/formats.c: (create_pipeline): + * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): + fixes for G_DISABLE_ASSERT and friends + * gst/typefind/gsttypefindfunctions.c: (aac_type_find), + (mp3_type_frame_length_from_header), (mp3_type_find), + (plugin_init): + require mp3 typefinding to have at least MIN_HEADERS valid headers + add typefinding for AAC adts files + +2004-08-04 Jan Schmidt + + * sys/ximage/ximagesink.c: + (gst_ximagesink_calculate_pixel_aspect_ratio): + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio): + Make sure we calculate pixel-aspect-ratio using floating point maths + +2004-08-03 Thomas Vander Stichele + + * po/uk.po: + updated translation + +2004-08-03 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get): + add debugging for display PAR calculation + +2004-08-02 David Schleef + + * configure.ac: Fix mikmod CFLAGS. + +2004-07-27 Benjamin Otte + + * gst/audioscale/gstaudioscale.c: + - fix templates to only support S16, it's the only format that works + - make caps nego code use try_set_caps_nonfixed and fixation instead + of try_set_caps twice, which is not nice for autopluggers + - change rank to secondary, so autopluggers can pick it up after + audioconvert + +2004-08-02 Iain + + * gst/interleave/interleave.c (interleave_init), + (interleave_request_new_pad), + (interleave_pad_removed), + (interleave_buffered_loop): Use the real pad count, not the artificial + one. + +2004-08-02 Thomas Vander Stichele + + * configure.ac: bump nano back to development + +=== release 0.8.3 === + +2004-08-02 Thomas Vander Stichele + + * configure.ac: releasing 0.8.3, "Water" + +2004-08-02 Thomas Vander Stichele + + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio), + (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_sink_link), + (gst_xvimagesink_change_state), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): + * sys/xvimage/xvimagesink.h: + apply similar PAR fixes as to ximagesink + +2004-08-02 Thomas Vander Stichele + + patch from: Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_src_link), (gst_lame_init): + add link function to lame. Fixes #148986. + +2004-08-02 Johan Dahlin + + * gst/multipart/multipartmux.c (gst_multipart_mux_next_buffer): + fix debugging log + +2004-07-30 David Schleef + + * gst/videomixer/Makefile.am: Fix things that should have been + fixed in the last checkin. + +2004-07-30 David Schleef + + * gst/multipart/Makefile.am: Fix things that should have been + fixed in the last checkin. + +2004-07-30 David Schleef + + * testsuite/multifilesink/Makefile.am: Fix unused variable. + +2004-07-30 Thomas Vander Stichele + + * configure.ac: + bump nano for prerelease + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + updates + +2004-07-30 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_clear), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + * gst/tcp/gstmultifdsink.h: + Recover from a select with a bad file descriptor by removing + the client. + +2004-07-30 Thomas Vander Stichele + + * configure.ac: + fix requirement of core + * gst-libs/gst/play/play.c: (gst_play_error_plugin), + (gst_play_pipeline_setup): + don't use colorspace element. do use hermescolorspace element. + make macro to get a colorspace element. + mark strings for translation. + * po/POTFILES.in: + add play.c + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + update translations + +2004-07-30 Zaheer Abbas Merali + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): + fix default for newmedia flag + +2004-07-30 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (gst_theora_dec_init), (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain), (theora_dec_set_property), + (theora_dec_get_property): + * ext/theora/theoraenc.c: (gst_border_mode_get_type), + (gst_theora_enc_class_init), (gst_theora_enc_init), + (theora_enc_sink_link), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Added cropping option to theora decoder. + Added border option to theora encoder. + +2004-07-30 Zaheer Abbas Merali + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Added newmedia support to pngenc so now gst-launch-0.8 videotestsrc ! ffmpegcolorspace ! pngenc snapshot=false newmedia=true ! multifilesink location=blah%d.png works as expected + +2004-07-30 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Fix encoding of non-multiple-of-16 video. + +2004-07-29 David Schleef + + * configure.ac: make test for audiofile more strict + +2004-07-25 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + give different names to typefind functions + +2004-07-28 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_calculate_pixel_aspect_ratio), + (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), + (gst_ximagesink_sink_link), (gst_ximagesink_change_state), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_set_property), + (gst_ximagesink_get_property), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + allocate PAR's dynamically. + use autodetected PAR if no object-set PAR is given. + add workaround for directfb's X not setting physical size. + fix to xvimagesink will follow tomorrow. + +2004-07-28 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_chain): send tag events downstream + * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), + (gst_shout2send_get_type), (gst_shout2send_set_clock), + (gst_shout2send_class_init), (gst_shout2send_init), + (set_shout_metadata), (gst_shout2send_set_metadata), + (gst_shout2send_chain), (gst_shout2send_set_property), + (gst_shout2send_get_property), (gst_shout2send_connect), + (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + - fix for sending mp3 audio to icecast2 server, if pad link function not + called before PAUSED state + - added option to use GStreamer clock sync (as opposed to libshout's own sync) + - added tagging support for mp3 audio broadcasted + * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): + debug info + +2004-07-28 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_push): + Return query failure when we don't know the length of + an ogg stream insteda of returning TRUE with a bogus value. + +2004-07-28 Wim Taymans + + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + Don't screw up the 1 Chroma for 1 luma sample situation when we + have an odd offset/width by adding a black border in those cases. + +2004-07-28 Wim Taymans + + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + * ext/theora/theoraenc.c: (theora_enc_sink_link): + Added first attempt at cropping of the image as required by the + theora spec. We need more properties in the caps (offset_x, + offset_y,stride) to implement this correctly. + +2004-07-28 Jan Schmidt + + * ext/dvdnav/README: + Update the README to use dvddemux + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): + Ensure getcaps returns a subset of the template caps + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_base_init), + (gst_mpeg2subt_init): + Ensure getcaps returns a subset of the template caps + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_init), (gst_dvd_demux_get_video_stream), + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_set_cur_subpicture): + * gst/mpegstream/gstdvddemux.h: + Set the explicit caps on the current_video pad before pushing + anything + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream): + Free caps used to gst_pad_set_explicit_caps, which takes a const + GstCaps * + +2004-07-28 Thomas Vander Stichele + + * configure.ac: update GStreamer requirement to 0.8.4 because of + GstFraction. + +2004-07-28 Wim Taymans + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), + (gst_wavparse_handle_seek), (gst_wavparse_srcpad_event): + Add the pad to the element after setting up the caps. This + makes it a lot easier to autoplug. + +2004-07-27 Steve Lhomme + + * gst/median/gstmedian.c: + * gst/mpeg2subt/gstmpeg2subt.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegpacketize.c: + * gst/rtjpeg/gstrtjpeg.c: + * gst/rtjpeg/gstrtjpegdec.c: + * gst/rtjpeg/gstrtjpegenc.c: + * gst/sine/gstsinesrc.c: + * gst/smooth/gstsmooth.c: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmpte.h: + * gst/stereo/gststereo.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideofilter.c: + * gst/videofilter/gstvideoflip.c: + * gst/videoscale/gstvideoscale.c: + * gst/videoscale/videoscale.c: + * gst/videotestsrc/gstvideotestsrc.c: + * gst/videotestsrc/videotestsrc.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + fix local includes and 64 bits constants + +2004-07-27 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/*/*.vcproj: + * gst/*/*.vcproj: + more working plugins + +2004-07-27 Zaheer Abbas Merali + + * testsuite/alsa/Makefile.am: + * testsuite/alsa/srcstate.c: + add test for alsasrc changing state + +2004-07-27 Zaheer Abbas Merali + + * gst/silence/gstsilence.c: (gst_silence_init), (gst_silence_link), + (gst_silence_get): + * gst/silence/gstsilence.h: + fix silence generation for 16bit raw audio + +2004-07-27 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_video_caps), (gst_matroska_demux_plugin_init): + * gst/mpegaudio/common.c: + * gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init), + (gst_videoscale_getcaps), (gst_videoscale_link), + (gst_videoscale_src_fixate), (gst_videoscale_init), + (gst_videoscale_finalize): + * gst/videoscale/gstvideoscale.h: + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_get_capslist): + * gst/wavenc/gstwavenc.c: + * sys/oss/gstossmixer.c: (fill_labels): + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents), + (gst_ximagesink_calculate_pixel_aspect_ratio), + (gst_ximagesink_xcontext_get), (gst_ximagesink_fixate), + (gst_ximagesink_getcaps), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_set_property), (gst_ximagesink_get_property), + (gst_ximagesink_init), (gst_ximagesink_class_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): + * sys/xvimage/xvimagesink.h: + first batch of pixel aspect ratio commits. + +2004-07-27 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_chain): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_fill): + handle stride, needs work if we want to move stride handling + upstream, but works correctly for our purposes. + +2004-07-27 Thomas Vander Stichele + + * gst/videoscale/README: + add testing examples + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link), + (gst_videoscale_chain): + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_get_size): + add get_size function that handles stride like videotestsrc. + fixes conversion for YUV formats for as much as I can test them. + +2004-07-27 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xvimage_put): + further cleanups, logging, error handling and synchronizing + +2004-07-27 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_class_init), (gst_videomixer_init), + (gst_videomixer_getcaps), (gst_videomixer_request_new_pad), + (gst_videomixer_blend_ayuv_i420), (pad_zorder_compare), + (gst_videomixer_sort_pads), (gst_videomixer_fill_checker), + (gst_videomixer_fill_color), (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), + (gst_videomixer_loop), (plugin_init): + Be a nicer negotiation citizen and provide a getcaps function on + the srcpad. This also fixes a crash when resizing. + +2004-07-27 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new): Some fixes to image size calculation. + +2004-07-27 Wim Taymans + + * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps): + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Added snapshot property to pngenc. + removed g_print from pngdec + +2004-07-27 Steve Lhomme + + * gst/ac3parse/ac3parse.vcproj + * gst/adder/adder.vcproj + * gst/alpha/alpha.vcproj + * gst/alpha/alphacolor.vcproj + * gst/asfdemux/asf.vcproj + * gst/audioconvert/audioconvert.vcproj + * gst/audiorate/audiorate.vcproj + * gst/audioscale/audioscale.vcproj + * gst/auparse/auparse.vcproj + * gst/avi/avi.vcproj + * gst/cdxaparse/cdxaparse.vcproj + * gst/chart/chart.vcproj + * gst/colorspace/colorspace.vcproj + * gst/cutter/cutter.vcproj + * gst/debug/debug.vcproj + * gst/debug/efence.vcproj + * gst/debug/navigationtest.vcproj + * gst/deinterlace/deinterlace.vcproj + * gst/effectv/effectv.vcproj + * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj + * gst/filter/filter.vcproj + * gst/flx/flxdec.vcproj + * gst/goom/goom.vcproj + * gst/interleave/interleave.vcproj + * gst/law/alaw.vcproj + * gst/law/mulaw.vcproj + * gst/matroska/matroska.vcproj + * gst/median/median.vcproj + * gst/mixmatrix/mixmatrix.vcproj + * gst/mpeg1sys/mpeg1systemencode.vcproj + * gst/mpeg1videoparse/mp1videoparse.vcproj + * gst/mpeg2sub/mpeg2subt.vcproj + * gst/mpegaudio/mpegaudio.vcproj + * gst/mpegaudioparse/mpegaudioparse.vcproj + * gst/mpegstream/mpegstream.vcproj + * gst/multifilesink/multifilesink.vcproj + * gst/multipart/multipart.vcproj + * gst/oneton/oneton.vcproj + * gst/overlay/overlay.vcproj + * gst/passthrough/passthrough.vcproj + * gst/qtdemux/qtdemux.vcproj + * gst/realmedia/rmdemux.vcproj + * gst/rtjpeg/rtjpeg.vcproj + * gst/rtp/rtp.vcproj + * gst/silence/silence.vcproj + * gst/sine/sinesrc.vcproj + * gst/smooth/smooth.vcproj + * gst/smpte/smpte.vcproj + * gst/spectrum/spectrum.vcproj + * gst/speed/speed.vcproj + * gst/stereo/stereo.vcproj + * gst/switch/switch.vcproj + * gst/tags/tagedit.vcproj + * gst/tcp/tcp.vcproj + * gst/typefind/typefindfunctions.vcproj + * gst/udp/udp.vcproj + * gst/videobox/videobox.vcproj + * gst/videocrop/videocrop.vcproj + * gst/videodrop/videodrop.vcproj + * gst/videofilter/gamma.vcproj + * gst/videofilter/videobalance.vcproj + * gst/videofilter/videofilter.vcproj + * gst/videofilter/videoflip.vcproj + * gst/videoflip/videoflip.vcproj + * gst/videomixer/videomixer.vcproj + * gst/videorate/videorate.vcproj + * gst/videoscale/videoscale.vcproj + * gst/videotestsrc/videotestsrc.vcproj + * gst/virtualdub/virtualdub.vcproj + * gst/volenv/volenv.vcproj + * gst/volume/volume.vcproj + * gst/wavenc/wavenc.vcproj + * gst/wavparse/wavparse.vcproj + * gst/y4m/y4menc.vcproj + * gst-libs/gst/audio/audio.vcproj + * gst-libs/gst/audio/audiofilter.vcproj + * gst-libs/gst/colorbalance/colorbalance.vcproj + * gst-libs/gst/idct/idtc.vcproj + * gst-libs/gst/media-info/media-info.vcproj + * gst-libs/gst/mixer/mixer.vcproj + * gst-libs/gst/navigation/navigation.vcproj + * gst-libs/gst/play/play.vcproj + * gst-libs/gst/propertyprobe/propertyprobe.vcproj + * gst-libs/gst/resample/resample.vcproj + * gst-libs/gst/riff/riff.vcproj + * gst-libs/gst/tuner/tuner.vcproj + * gst-libs/gst/video/video.vcproj + * gst-libs/gst/xoverlay/xoverlay.vcproj + avoid problems with math.h, fix release dependancy + rename GStreamer-0.8.lib to libgstreamer.lib + +2004-07-27 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate): When + the atom is not available we have to unlock the mutex. Fixes #148023 + +2004-07-26 Steve Lhomme + + * gst-libs/gst/media-info/media-info.h: + issue for a vararg macro with MSVC + +2004-07-26 Steve Lhomme + + * gst/effectv/effectv.vcproj + * gst-libs/gst/idct/idct.vcproj: + * gst-libs/gst/media-info/media-info.vcproj: + * gst-libs/gst/navigation/navigation.vcproj: + * gst-libs/gst/propertyprobe/propertyprobe.vcproj: + * gst-libs/gst/video/video.vcproj: + * gst-libs/gst/xoverlay/xoverlay.vcproj: + fixes for build problems + +2004-07-26 Steve Lhomme + + * gst-libs/gst/audio/audio.def: + * gst-libs/gst/audio/riff.def: + add some definitions needed by plugins + +2004-07-26 Steve Lhomme + + * gst/asfdemux/gstasfmux.c + Fix some 64 bits constants to be glib friendly + +2004-07-26 Steve Lhomme + + * gst/ac3parse/gstac3parse.c + * gst/audioscale/gstaudioscale.c + * gst/auparse/gstauparse.c + * gst/colorspace/gstcolorspace.c + * gst/colorspace/yuv2rgb.h + local include fixes + +2004-07-26 Steve Lhomme + + * win32/gst.sln + add more plugins to the build + +2004-07-26 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new): Some more fixes to image size calculation. + +2004-07-26 Thomas Vander Stichele + + * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), + (gst_level_set_property), (gst_level_get_property), + (gst_level_base_init), (gst_level_class_init): + add debugging categories. cleanups. + +2004-07-26 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_planar411), (gst_videoscale_planar400), + (gst_videoscale_packed422), (gst_videoscale_packed422rev), + (gst_videoscale_scale_nearest_str1), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_16bit), + (gst_videoscale_scale_nearest_24bit): + fixed stride issues + tested with 320x240 -> 321, 322, 324 x240 + tested with YV12, I420, YUY2, UYVY + fixed packed422rev (don't think it could have worked before) + by testing with UYVY + +2004-07-26 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_init), + (gst_lame_chain), (gst_lame_setup), (gst_lame_change_state), + (plugin_init): + add debugging category, add error checks like checking return values + of setup calls, make sure it still works after + PLAYING=>NULL=>PLAYING, fix encoding of mono streams + +2004-07-26 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), + (gst_mpeg_demux_process_private): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_data): + Check for error codes from the negotiation functions. Make sure + we really set the pad caps when a new pad is created. + +2004-07-26 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pix_fmt): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_pad_link): + don't make function do two things at the same time without reason. + +2004-07-26 Steve Lhomme + + * gst/ac3parse/ac3parse.vcproj + * gst/adder/adder.vcproj + * gst/alpha/alpha.vcproj + * gst/alpha/alphacolor.vcproj + * gst/asfdemux/asf.vcproj + * gst/audioconvert/audioconvert.vcproj + * gst/audiorate/audiorate.vcproj + * gst/audioscale/audioscale.vcproj + * gst/auparse/auparse.vcproj + * gst/avi/avi.vcproj + * gst/cdxaparse/cdxaparse.vcproj + * gst/chart/chart.vcproj + * gst/colorspace/colorspace.vcproj + * gst/cutter/cutter.vcproj + * gst/debug/debug.vcproj + * gst/debug/efence.vcproj + * gst/debug/navigationtest.vcproj + * gst/deinterlace/deinterlace.vcproj + * gst/effectv/effectv.vcproj + * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj + * gst/filter/filter.vcproj + * gst/flx/flxdec.vcproj + * gst/goom/goom.vcproj + * gst/interleave/interleave.vcproj + * gst/law/alaw.vcproj + * gst/law/mulaw.vcproj + * gst/matroska/matroska.vcproj + * gst/median/median.vcproj + * gst/mixmatrix/mixmatrix.vcproj + * gst/mpeg1sys/mpeg1systemencode.vcproj + * gst/mpeg1videoparse/mp1videoparse.vcproj + * gst/mpeg2sub/mpeg2subt.vcproj + * gst/mpegaudio/mpegaudio.vcproj + * gst/mpegaudioparse/mpegaudioparse.vcproj + * gst/mpegstream/mpegstream.vcproj + * gst/multifilesink/multifilesink.vcproj + * gst/multipart/multipart.vcproj + * gst/oneton/oneton.vcproj + * gst/overlay/overlay.vcproj + * gst/passthrough/passthrough.vcproj + * gst/qtdemux/qtdemux.vcproj + * gst/realmedia/rmdemux.vcproj + * gst/rtjpeg/rtjpeg.vcproj + * gst/rtp/rtp.vcproj + * gst/silence/silence.vcproj + * gst/sine/sinesrc.vcproj + * gst/smooth/smooth.vcproj + * gst/smpte/smpte.vcproj + * gst/spectrum/spectrum.vcproj + * gst/speed/speed.vcproj + * gst/stereo/stereo.vcproj + * gst/switch/switch.vcproj + * gst/tags/tagedit.vcproj + * gst/tcp/tcp.vcproj + * gst/typefind/typefindfunctions.vcproj + * gst/udp/udp.vcproj + * gst/videobox/videobox.vcproj + * gst/videocrop/videocrop.vcproj + * gst/videodrop/videodrop.vcproj + * gst/videofilter/gamma.vcproj + * gst/videofilter/videobalance.vcproj + * gst/videofilter/videofilter.vcproj + * gst/videofilter/videoflip.vcproj + * gst/videoflip/videoflip.vcproj + * gst/videomixer/videomixer.vcproj + * gst/videorate/videorate.vcproj + * gst/videoscale/videoscale.vcproj + * gst/videotestsrc/videotestsrc.vcproj + * gst/virtualdub/virtualdub.vcproj + * gst/volenv/volenv.vcproj + * gst/volume/volume.vcproj + * gst/wavenc/wavenc.vcproj + * gst/wavparse/wavparse.vcproj + * gst/y4m/y4menc.vcproj + more plugins supported under windows + +2004-07-26 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_put), (gst_ximagesink_renegotiate_size), + (gst_ximagesink_chain), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc): + Add debugging statements. Use the sizes as returned by the + *CreateImage calls. + +2004-07-26 Johan Dahlin + + * gst/tcp/gsttcpclientsrc.c (gst_tcpclientsrc_get): Make sure that + the pad is negotiated. + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c (gst_ffmpegcolorspace_chain): Ditto + +2004-07-26 Steve Lhomme + + * gst-libs/gst/colorbalance/colorbalance.vcproj: + * gst-libs/gst/idct/idct.vcproj: + * gst-libs/gst/media-info/media-info.vcproj: + * gst-libs/gst/mixer/mixer.vcproj: + * gst-libs/gst/navigation/navigation.vcproj: + * gst-libs/gst/play/play.vcproj: + * gst-libs/gst/propertyprobe/propertyprobe.vcproj: + * gst-libs/gst/resample/resample.vcproj: + * gst-libs/gst/tuner/tuner.vcproj: + * gst-libs/gst/video/video.vcproj: + * gst-libs/gst/xoverlay/xoverlay.vcproj: + more plugins supported under windows + +2004-07-25 Iain + + * gst/wavparse/gstwavparse.c (gst_wavparse_fmt): Set the caps on the + pad now rather than when the pad is created because state changes wipe + explicit caps (fixes #148043). + +2004-07-25 Sebastien Cote + + reviewed by Benjamin Otte + + * ext/mad/gstmad.c: + fix mad plugin crashing on Sun (fixes #148289) + +2004-07-25 Steve Lhomme + + * gst/avi/avi.def: + * gst/avi/avi.vcproj: + * gst/matroska/matroska.def: + * gst/matroska/matroska.vcproj: + remove unused .def files + +2004-07-25 Steve Lhomme + + * gst-libs/gst/audio/gstaudiofilter.c: + Clean the local include + +2004-07-25 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/audio/audio.def: + * gst-libs/gst/audio/audio.vcproj: + * gst-libs/gst/audio/audiofilter.vcproj: + * gst-libs/gst/audio/riff.def: + * gst-libs/gst/audio/riff.vcproj: + * gst-libs/gst/gst-libs.def: + * gst-libs/gst/gst-libs.vcproj: + * gst/avi/avi.vcproj: + * gst/avi/avi.vcproj: + Copy the files where needed after building, cleaner projects + +2004-07-25 Steve Lhomme + + * gst/matroska/ebml-write.c: + Fix some 64 bits constants to be glib friendly + +2004-07-24 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/gst-libs.def: + * gst-libs/gst/gst-libs.vcproj: + * gst/matroska/matroska.def: + * gst/matroska/matroska.vcproj: + Add the preliminary canvas to build plugins on Win32 + +2004-07-23 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + don't enfore negotiation from source side, it breaks + sinesrc ! audioconvert ! osssink + +2004-07-22 David Schleef + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add typefind + for ELF files, since they can easily be recognized as audio/mpeg. + (bug #147441) + +2004-07-22 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_planar411), (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + fix 16bit and 24bit for stride (24bit might need testing) + don't pretend we do more than one algorithm + +2004-07-22 Zaheer Abbas Merali + + * configure.ac: + * gst/Makefile.am: + * gst/multifilesink/Makefile.am: + * gst/multifilesink/gstmultifilesink.c: + (gst_multifilesink_get_formats), + (gst_multifilesink_get_query_types), (_do_init), + (gst_multifilesink_base_init), (gst_multifilesink_class_init), + (gst_multifilesink_init), (gst_multifilesink_dispose), + (gst_multifilesink_set_location), (gst_multifilesink_set_property), + (gst_multifilesink_get_property), (gst_multifilesink_open_file), + (gst_multifilesink_close_file), (gst_multifilesink_next_file), + (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), + (gst_multifilesink_chain), (gst_multifilesink_change_state), + (gst_multifilesink_uri_get_type), + (gst_multifilesink_uri_get_protocols), + (gst_multifilesink_uri_get_uri), (gst_multifilesink_uri_set_uri), + (gst_multifilesink_uri_handler_init), (plugin_init): + * gst/multifilesink/gstmultifilesink.h: + * testsuite/Makefile.am: + * testsuite/multifilesink/Makefile.am: + * testsuite/multifilesink/fakesrc_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + multifilesink plugin for creating new files every time a new media + discontinuity event occurs + +2004-07-22 Wim Taymans + + * gst/alpha/Makefile.am: + * gst/alpha/gstalphacolor.c: (gst_alpha_color_get_type), + (gst_alpha_color_base_init), (gst_alpha_color_class_init), + (gst_alpha_color_init), (gst_alpha_color_set_property), + (gst_alpha_color_get_property), (gst_alpha_color_sink_link), + (transform), (gst_alpha_color_chain), + (gst_alpha_color_change_state), (plugin_init): + Stupid plugin to to RGBA to AYUV conversion because none of + the colorspace plugins can handle that yet. + +2004-07-22 Wim Taymans + + * examples/seeking/seek.c: (update_scale), (main): + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), + (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), + (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (unknown_type), + (no_more_pads), (new_stream), (setup_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + * gst/playback/gststreaminfo.h: + More playback updates, attempt to fix things after the state change + breakage. + +2004-07-22 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_planar411), + (gst_videoscale_scale_nearest_16bit): + comment algorithm + +2004-07-22 Thomas Vander Stichele + + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_class_init), (gst_videotestsrc_src_link), + (gst_videotestsrc_init), (gst_videotestsrc_get), + (gst_videotestsrc_set_pattern), (gst_videotestsrc_set_property), + (gst_videotestsrc_get_property): + * gst/videotestsrc/gstvideotestsrc.h: + * gst/videotestsrc/videotestsrc.c: + * gst/videotestsrc/videotestsrc.h: + cleanup and commenting + +2004-07-21 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init), + (gst_ogg_demux_get_formats), (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_demux_src_convert), + (gst_ogg_demux_handle_event), (gst_ogg_demux_seek_before), + (_find_chain_get_unknown_part), (_find_streams_check), + (gst_ogg_demux_push), (gst_ogg_pad_push): + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (vorbis_dec_convert), (vorbis_dec_src_query), + (vorbis_dec_src_event), (vorbis_dec_event): + More seeking fixes, oggdemux now supports seeking to time and + uses the downstream element to convert granulepos to time. + Seeking in theora-only ogg files now works. + +2004-07-21 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_init), + (theora_get_formats), (theora_get_event_masks), + (theora_get_query_types), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (vorbis_get_event_masks), (vorbis_get_query_types), + (gst_vorbis_dec_init), (vorbis_dec_convert), + (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_event): + Added query/convert/formats functions to vorbis and theora decoders + so that the outside world can use them too. Fixed seeking on an + ogg/theora/vorbis file by disabling the seeking seeking on the + theora srcpad. + +2004-07-21 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize + images creation for both elements. We don't create the image on caps + nego or renego, we just destroy the internal one if present if it does + not match the needs. The chain function takes care of creating a new + image when needed. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains + the image format information. The buffer pool checks for the context + image format and discard images with different formats. + * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. + +2004-07-21 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): + no point in doing any chaining if the pad we want to push from + isn't usable. + +2004-07-20 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Fix double end-to-native symbol conversion (#148021). + +2004-07-20 David Schleef + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): + Don't use an Atom that doesn't exist. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer): + * gst/tcp/gstmultifdsink.h: + More multifdsink stats. Avoid deadlock by releasing locks + before sending out a signal. + +2004-07-20 Thomas Vander Stichele + + * po/LINGUAS: + * po/hu.po: + added Hungarian translation (Laszlo Dvornik) + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer): + * gst/tcp/gsttcp-marshal.list: + Fixed the stupid marshal definition. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_chain), + (gst_multifdsink_set_property), (gst_multifdsink_get_property), + (gst_multifdsink_init_send): + * gst/tcp/gstmultifdsink.h: + Added more stats, added timeout for a client, fixed some typos + and added some comments. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp-marshal.list: + Added get_stats method that returns a GValueArray of + stats values. + +2004-07-19 Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): + make sure longname, description and author are valid UTF-8 + +2004-07-19 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state), + (gst_ximagesink_set_property): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state), + (gst_xvimagesink_set_property): + make sure SYNCHRONOUS is respected after getting the X context + +2004-07-18 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_event), + (gst_matroska_demux_parse_blockgroup): + * gst/matroska/matroska-ids.h: + add BlockReference tag and ignore it to clear out log. + ignore NAVIGATION events to clear out log. + +2004-07-18 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), + (gst_matroska_demux_add_stream): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init): + add debug categories + +2004-07-16 Wim Taymans + + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: (plugin_init): + * ext/libpng/gstpngdec.c: (user_error_fn), (user_warning_fn), + (gst_pngdec_get_type), (gst_pngdec_base_init), + (gst_pngdec_class_init), (gst_pngdec_sinklink), (gst_pngdec_init), + (gst_pngdec_src_getcaps), (user_read_data), (gst_pngdec_chain): + * ext/libpng/gstpngdec.h: + Added png decoder. + +2004-07-16 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_buffer_free), + (gst_ximagesink_buffer_alloc): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc): + * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized + again. Using internal data pointer of the x(v)image to store image's + data to be coherent with the buffer alloc mechanism. Investigated the + image destruction code to be sure that everything gets freed correctly. + +2004-07-16 Wim Taymans + + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + Make sure we don't create 0 sized subbuffers in riff-read. + Signal the no more pads signal after reading the avi header. + +2004-07-16 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), + (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), + (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (unknown_type), + (no_more_pads), (new_stream), (setup_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + Better error recovery. Added configurable preroll queue size. Faster + detection of no-more-pads. + +2004-07-16 Wim Taymans + + * gst-libs/gst/video/video.h: + Added 32 bits RGBA. Not sure if we should use another mime-type + for alpha rgb. Currently the presence of the alpha_mask property + signals an alpha channel. + +2004-07-16 Wim Taymans + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + FPS seems to be 0.0 to MAX everywhere else. + +2004-07-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + mp42/mp43 (no caps) exist too. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + Set pixel_width/height; we've got them in-caps. + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + * gst/wavparse/gstwavparse.c: (plugin_init): + Both are valid primary. + * sys/oss/gstossmixer.c: + Remove i18n hack and enable translations. + +2004-07-15 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): + fix for non-shm xv. Original patch by Tim Ringenbach (fixes #147248) + +2004-07-15 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_sw_params_dump), (gst_alsa_hw_params_dump), + (gst_alsa_close_audio): + disable some of the debugging code for now. Writing debugging to a + buffer is broken in current alsalib releases. + +2004-07-12 Benjamin Otte + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer): + use bufferpools + +2004-07-14 Thomas Vander Stichele + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_dec_src_query), (theora_dec_event): + * ext/theora/theoraenc.c: (gst_theora_enc_class_init): + add debugging categories. Remove \n's. + +2004-07-13 Johan Dahlin + + * gst/playback/gstplaybin.c (gst_play_bin_set_property) + (gst_play_bin_get_property): Impl. + +2004-07-13 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_seek_before): + When trying to find the stream length, seek back N pages + instead of just one, where N is the number of streams in + the current chain. + +2004-07-13 Wim Taymans + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data), + (gst_riff_create_audio_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_auds): + * gst-libs/gst/riff/riff-read.h: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream): + Set codec_data on caps for avidemuxer. + +2004-07-12 David Schleef + + * configure.ac: Fix test for Objective C + +2004-07-12 Jan Schmidt + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), + (gst_gdk_pixbuf_chain): + Add svg and pcx to template caps, and ensure that getcaps returns a + subset of the template caps. + Copy each row manually for output, as gdkpixbuf may pad the + rowstride to a 32-bit word boundary. + +2004-07-12 Wim Taymans + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps), + (gst_riff_create_video_template_caps): + Fix the template caps to include some more media types. + +2004-07-12 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (no_more_pads), + (new_stream), (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (play_base_eos), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (plugin_init): + * gst/playback/test4.c: (main): + More fixes on reusing of the element. + +2004-07-11 Benjamin Otte + + * ext/mad/gstmad.c: (normal_seek): + allow seeking for other methods than just SET + +2004-07-11 Andy Wingo + + * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_link): For + float, "any" caps -> buffer_frames=[0,MAX]. + + * gst/interleave/interleave.c (interleave_getcaps): Seems the core + doesn't intersect our caps with the template any more. Do it + ourselves. + (interleave_buffered_loop): Use g_newa instead of malloc/free. + +2004-07-09 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (no_more_pads), + (new_stream), (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (play_base_eos), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (plugin_init): + * gst/playback/test4.c: (main): + Work on object reuse and seeking. + +2004-07-09 Wim Taymans + + * examples/seeking/seek.c: (iterate): + Don't consume all CPU in the idle loop. + +2004-07-09 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_new_output_pad), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_process_private): + Add pad to element *after* setting the pad functions so that + the scheduler can use the correct ones. + +2004-07-09 Wim Taymans + + * ext/theora/theoradec.c: (theora_dec_from_granulepos), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_chain): + Sync to keyframe after seek + +2004-07-09 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop), (gst_alsa_sink_change_state): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_change_state): + * ext/libvisual/visual.c: (gst_visual_change_state): + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_change_state): + * ext/theora/theoradec.c: (theora_dec_change_state): + * ext/theora/theoraenc.c: (theora_enc_change_state): + * ext/vorbis/vorbisdec.c: (vorbis_dec_change_state): + * gst-libs/gst/navigation/navigation.c: + * gst/adder/gstadder.c: (gst_adder_change_state): + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), + (gst_audio_convert_get_buffer): + * gst/multipart/multipartdemux.c: + (gst_multipart_demux_change_state): + * gst/playback/gstdecodebin.c: (gst_decode_bin_change_state): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + * gst/videoscale/gstvideoscale.c: + (gst_videoscale_handle_src_event): + * gst/volume/gstvolume.c: (volume_chain_int16): + don't assert in state change, this should be done by the base + GstElement class. + various debugging fixes. + +2004-07-08 Thomas Vander Stichele + + * configure.ac: + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_dispose), (gst_play_set_location), + (gst_play_set_data_src), (gst_play_set_video_sink), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_sink_element), + (gst_play_get_all_by_interface): + * gst-libs/gst/play/play.h: + add new method to get elements implementing an interface. + add various error logging + +2004-07-08 Wim Taymans + + * examples/seeking/seek.c: (make_dv_pipeline), (make_avi_pipeline), + (make_mpeg_pipeline), (make_mpegnt_pipeline), + (make_playerbin_pipeline), (query_durations_elems), + (query_durations_pads), (query_positions_elems), + (query_positions_pads), (update_scale), (iterate), (stop_seek), + (main): + Added playbin seeking example. + +2004-07-08 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_set_location), + (gst_play_set_data_src), (gst_play_set_video_sink), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_framerate): + use a macro to look up elements from hash table + +2004-07-08 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_get_length_callback), (gst_play_set_location), + (gst_play_seek_to_time), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization), + (gst_play_get_sink_element): + - add debugging info + - fix looking up sink elements by iterating over complete caps + - put everything except for source and autoplugger in a complete bin + +2004-07-08 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_drain_audio): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_flush_one_pad), + (gst_alsa_sink_check_event), (gst_alsa_sink_mmap), + (gst_alsa_sink_write), (gst_alsa_sink_loop): + * ext/alsa/gstalsasink.h: + - add debugging info + - clean up schizophrenia of data/buffer/event + - fix double event unref error + +2004-07-08 Wim Taymans + + * gst/playback/Makefile.am: + Add headers to noinst + +2004-07-08 Thomas Vander Stichele + + * tools/gst-launch-ext-m.m: + * tools/gst-launch-ext.1.in: + convert to the third millenium + +2004-07-07 David Schleef + + * sys/dxr3/Makefile.am: noinst_SOURCES should be nodist_SOURCES + +2004-07-07 Wim Taymans + + * gst/playback/Makefile.am: + * gst/playback/README: + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (rebuild_pipeline), (queue_overrun), + (gen_preroll_element), (no_more_pads), (new_stream), + (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (setup_sinks), (gst_play_bin_change_state), + (gst_play_bin_get_event_masks), (gst_play_bin_send_event), + (gst_play_bin_get_formats), (gst_play_bin_convert), + (gst_play_bin_get_query_types), (gst_play_bin_query), + (plugin_init): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (gst_stream_info_set_property), + (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + * gst/playback/test.c: (gen_video_element), (gen_audio_element), + (main): + * gst/playback/test2.c: (main): + * gst/playback/test3.c: (update_scale), (main): + More playbin fixes. Added README. Do better element filtering. + Added base class to preroll media. Added test apps. + +2004-07-07 Thomas Vander Stichele + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_flush_decoder): + * ext/mpeg2dec/gstmpeg2dec.h: + various debugging improvements. Reset stream to next picture + instead of sequence header, otherwise seeks cannot work. + +2004-07-07 Wim Taymans + + * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), + (gst_video_box_class_init), (gst_video_box_set_property), + (gst_video_box_i420), (gst_video_box_ayuv), (gst_video_box_chain): + Use pad_alloc where possible. + +2004-07-07 Wim Taymans + + * sys/oss/gstosselement.c: (gst_osselement_reset), + (gst_osselement_parse_caps): + * sys/oss/gstosselement.h: + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Fix offset on osssrc. + +2004-07-07 Wim Taymans + + * ext/theora/theora.c: (plugin_init): + * ext/theora/theoradec.c: (theora_dec_from_granulepos), + (theora_dec_src_query), (theora_dec_chain): + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_buffer_from_packet), + (theora_push_packet), (theora_enc_chain): + Fix theora granulepos calculation. + Fix overflow in duration/position calculation. + Bump rank to PRIMARY for theoradec. + Use granulepos of last packet to calculate position. + Set keyframe flag on buffers when needed. + +2004-07-06 David Schleef + + * gst/playback/Makefile.am: 'test' in bin_PROGRAMS? Are you + serious? (Fixed, obviously.) + +2004-07-06 Thomas Vander Stichele + + * po/LINGUAS: + * po/cs.po: + added Czech translation (Miloslav Trmac) + +2004-07-05 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (close_link), (type_found), (gst_decode_bin_set_property), + (gst_decode_bin_get_property), (gst_decode_bin_get_event_masks), + (gst_decode_bin_send_event), (gst_decode_bin_get_formats), + (gst_decode_bin_convert), (gst_decode_bin_get_query_types), + (gst_decode_bin_query), (plugin_init): + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (rebuild_pipeline), (get_audio_element), + (get_video_element), (new_pad), (setup_source), + (gst_play_bin_set_property), (gst_play_bin_get_property), + (gst_play_bin_change_state), (gst_play_bin_add_element), + (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): + * gst/playback/test.c: (main): + More fixes, cleaned up playbin, make it use decodebin. Added + threaded property to playbin. + +2004-07-05 Wim Taymans + + * configure.ac: + * gst/playback/Makefile.am: + * gst/playback/decodetest.c: (main): + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (close_link), (type_found), (gst_decode_bin_set_property), + (gst_decode_bin_get_property), (gst_decode_bin_change_state), + (gst_decode_bin_get_event_masks), (gst_decode_bin_send_event), + (gst_decode_bin_get_formats), (gst_decode_bin_convert), + (gst_decode_bin_get_query_types), (gst_decode_bin_query), + (plugin_init): + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gen_default_output), (rebuild_pipeline), + (collect_sink_pads), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (setup_source), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gst_play_bin_factory_filter), + (compare_ranks), (gst_play_bin_collect_factories), + (gst_play_bin_change_state), (gst_play_bin_add_element), + (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): + * gst/playback/test.c: (main): + Added some playback helper elements and some test apps, very alpha + still. + +2004-07-04 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): + only restart audio when we indeed have an xrun to fix repeated + xruns. Fix suggested by Giuliano Pochini. + +2004-07-03 David Schleef + + * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper): Disable + call to gst_debug_log() if debugging is disabled (bug #145118) + +2004-07-03 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): + use our own functions for restarting the alsa device. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + I should apply patches myself - use MIN for the third argument, not + the second, this fixes seeking + +2004-07-02 David Schleef + + * ext/flac/gstflacdec.c: (gst_flacdec_class_init), + (gst_flacdec_write): Actually, GST_PAD_CAPS() has nothing to + do with the logic. + +2004-07-02 David Schleef + + * ext/flac/gstflacdec.c: (gst_flacdec_write): Set duration on + output buffers. Fix logic mistake. (bug #144866) + +2004-07-02 David Schleef + + * gst-libs/gst/xoverlay/Makefile.am: xoverlay no longer depends + on X. (bug #144753) + +2004-07-02 David Schleef + + * gst/wavenc/gstwavenc.c: (gst_wavenc_setup), + (gst_wavenc_stop_file): Switch to GST_WRITE_UINT32_LE macros + (bug #144624) + * sys/oss/gstosselement.c: (gst_osselement_probe_caps), + (gst_osselement_rate_probe_check): Add another workaround for + buggy drivers (bug #145336) + +2004-07-02 David Schleef + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_handle_client_write): + Most systems don't have MSG_NOSIGNAL. + +2004-07-02 Thomas Vander Stichele + + * Makefile.am: + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + (hopefully) fix both install and dist and make error message useful. + needs testing across automakes. + +2004-07-02 Benjamin Otte + + * ext/ogg/gstogg.c: (plugin_init): + we require bytestream now + * ext/ogg/gstoggdemux.c: + huge diff to implement chain setup in a fast and generic way. This + improves tag reading and startup of huge files (read: Theora videos) + quite a bit. It probably contains bugs, too, so please test. + Seeking is not improved to the fast method. + +2004-06-29 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: + Fix memleak in oggdemux when running unconnected pads. + doc update in mux, start working on keyframe mode. + +2004-06-29 Benjamin Otte + + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + advertise correct template caps - we indeed do non-native endianness + and 8bit audio has no endianness + * sys/ximage/ximagesink.c: (gst_ximagesink_getcaps): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_getcaps): + avoid (wrong) duplications in getcaps function and return + template caps + +2004-06-29 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_init_send), (gst_multifdsink_close): + Fix wrong GList iteration that could crash the server when + more then 2 clients disconnect at the same time. Read all the + pending commands in one batch to recover from command storms under + very heavy load. + +2004-06-28 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_class_init), (gst_videomixer_init), + (gst_videomixer_request_new_pad), (gst_videomixer_blend_ayuv_i420), + (pad_zorder_compare), (gst_videomixer_sort_pads), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), + (gst_videomixer_update_queues), (gst_videomixer_loop), + (plugin_init): + Avoid divide by zero, choose masterpad as the pad with the highest + framerate. + +2004-06-27 Julien Moutte + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the + function directly. We might want to call it from somewhere else one day. + +2004-06-27 Julien Moutte + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of + window decorations. + +2004-06-27 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), + (gst_dvdec_video_getcaps), (gst_dvdec_video_link), + (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state), + (gst_dvdec_set_property), (gst_dvdec_get_property): + * ext/dv/gstdvdec.h: + Implement drop_factor property to lower the framerate with + a factor. + +2004-06-27 Thomas Vander Stichele + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + unbreak Company's fix that didn't install the -enum.h files + +2004-06-27 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_push), (gst_dvdec_loop), + (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Fix timestamp, duration and offset of the buffers. + +2004-06-27 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_init_send), (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_select), (gst_tcpserversink_close): + More multifdsink fixes, more recovery policy fixes. + Removed stupid g_print + +2004-06-26 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_get_type), (gst_multifdsink_base_init), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_debug_fdset), (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_chain), (gst_multifdsink_set_property), + (gst_multifdsink_get_property), (gst_multifdsink_init_send), + (gst_multifdsink_close), (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpplugin.c: (plugin_init): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_get_type), + (gst_tcpserversink_class_init), (gst_tcpserversink_init), + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_select), + (gst_tcpserversink_set_property), (gst_tcpserversink_get_property), + (gst_tcpserversink_init_send), (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Added multifdsink, made tcpserversink a subclass of fdsink, removed + one of the locks, added recovery policy to multifdsink. + +2004-06-26 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain): + fix decision for when getting frames with same timestamp + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + add latency offset property + +2004-06-26 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain), + (plugin_init): + fix debugging. add category. + +2004-06-25 Thomas Vander Stichele + + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + fix wrong offsets + +2004-06-25 Thomas Vander Stichele + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_get_time), (gst_alsa_src_loop), + (gst_alsa_src_change_state): + return a time that is in sync with the element's processing + +2004-06-25 Wim Taymans + + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_client_remove), + (gst_tcpserversink_handle_client_read), + (gst_tcpserversink_client_queue_data), + (gst_tcpserversink_client_queue_caps), + (gst_tcpserversink_client_queue_buffer), + (gst_tcpserversink_handle_client_write), + (gst_tcpserversink_queue_buffer), + (gst_tcpserversink_handle_clients), (gst_tcpserversink_thread), + (gst_tcpserversink_chain), (gst_tcpserversink_set_property), + (gst_tcpserversink_get_property), (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Serversink rewrite. Really do non blocking writes to clients and + maintain an internal queue to handle slower clients while not + disturbing fast clients. + +2004-06-25 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + better debug, don't override OFFSET and OFFSET_END + +2004-06-25 Iain + + * gst-libs/gst/media-info/media-info-priv.c (gmi_set_mime): Add + name=source for the wavparse pipeline. + +2004-06-24 Johan Dahlin + + * ext/theora/theoraenc.c (theora_enc_chain): Call + gst_pad_try_set_caps instead of gst_pad_set_explicit_caps so the + streamheader caps are set correctly. + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (raw_caps_factory), + (gst_vorbisenc_setup), (gst_vorbisenc_set_property): + respect minimum bitrate; same could be done for max bitrate + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (raw_caps_factory), + (gst_vorbisenc_setup): + fix sample rate range + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_class_init), + (gst_oggvorbisenc_setup): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init), + (gst_vorbisenc_setup): + resolve ambiguities in code and description + +2004-06-24 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_start), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_update_avail), (gst_alsa_src_loop): + Use alsa trigger_tstamp to get the timestamp of the first + sample in the buffer for more precise sync. Some cleanups. + +2004-06-24 Wim Taymans + + * gst/audiorate/gstaudiorate.c: (gst_audiorate_link), + (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property): + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_chain): + Added some logging, fixed an overflow bug in videorate. + +2004-06-24 Benjamin Otte + + * ext/kio/Makefile.am: + fix for builddir != srcdir and distcheck + +2004-06-24 Benjamin Otte + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + * gst/tcp/Makefile.am: + * sys/dxr3/Makefile.am: + don't include -enumtypes.[ch] or -marshal.[ch] files in the disted + tarball. + Also add all *.list files that were missing. + * Makefile.am: + add a distcheck hook to ensure the above doesn't happen again. + +2004-06-23 David I. Lehn + + * ext/Makefile.am: s/DTS_DIR=dvdread/DTS_DIR=dts/ + +2004-06-23 Colin Walters + + * m4/Makefile.am: Distribute gst-fionread.m4. + +2004-06-23 Thomas Vander Stichele + + * configure.ac: back to dev + +2004-06-23 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop), (gst_alsa_sink_get_time): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_get_time), (gst_alsa_src_update_avail), + (gst_alsa_src_loop): + Add clock to alsasrc. Take new capture timestamp when + restarting after an overrun. Split up some functions between + alsasrc and alsasink. + +=== release 0.8.2 === + +2004-06-23 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), + (gst_alsa_change_state), (gst_alsa_update_avail), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + merge back changes from release + +2004-06-23 Wim Taymans + + * gst/audiorate/gstaudiorate.c: (gst_audiorate_class_init), + (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property): + Implement sample dropping and notify + +2004-06-22 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_buffer_from_packet), + (theora_push_packet), (theora_enc_chain): + Some cleanups, make sure the timestamps are correct. + +2004-06-22 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_get_time), (gst_alsa_clock_update), + (gst_alsa_change_state), (gst_alsa_update_avail), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + Cleanups, take queued samples into account when reporting + the time. + +2004-06-22 Wim Taymans + + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_init): + Initialize the property as well. + +2004-06-22 Wim Taymans + + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_set_property), (gst_videorate_get_property): + Add property to make videorate silent. + Add property to prefer new frames over old ones. + +2004-06-22 Zaheer Abbas Merali + + * sys/osxvideo/Makefile.am: + Workaround so that the osxvideo .so file gets linked with the + Cocoa, OpenGL and QuickTime frameworks + +2004-06-22 Zaheer Abbas Merali + + * sys/osxaudio/Makefile.am: + Workaround so that the osxaudio .so file gets linked with the + CoreAudio framework + +2004-06-22 Zaheer Abbas Merali + + * configure.ac: + Whoops, my fault...fixed build issues + +2004-06-22 Zaheer Abbas Merali + + * configure.ac: + Add objective-c support if running in Darwin/Mac OS X + * sys/Makefile.am: + * sys/osxvideo: + * sys/osxvideo/Makefile.am: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + Add osxvideosink, a cocoa-based osx video sink + + +2004-06-19 Jan Schmidt + * ext/dvdnav/gst-dvd: + Grab the gconf key from the right spot + * gst/debug/gstnavseek.c: (gst_navseek_init), + (gst_navseek_segseek), (gst_navseek_handle_src_event), + (gst_navseek_chain): + * gst/debug/gstnavseek.h: + Add 's', 'e' and 'l' keypresses to navseek to define the start,end + and loop parameters of a segment seek. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), + (gst_videotestsrc_get_event_masks), + (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): + * gst/videotestsrc/gstvideotestsrc.h: + Add seeking support to videotestsrc + Initialise the timestamp_offset variable. + +2004-06-18 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + Fix negotiation and set correct end offset. + +2004-06-18 Thomas Vander Stichele + + * configure.ac: branch and prerelease + +2004-06-17 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init), + (gst_tcpclientsrc_getcaps), (gst_tcpclientsrc_get), + (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpclientsrc.h: + read caps when connecting to server for GDP so we set them correctly + +2004-06-17 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain): + notify drops and duplicates + * gst/videoscale/videoscale.c: (videoscale_get_structure): + no good reason to limit ourselves to 100x100 + +2004-06-17 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_open), (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame), + (gst_v4lsrc_try_capture): + * sys/v4l/v4lsrc_calls.h: + change try_palette to more general try_capture + add autoprobe option so we can turn off autoprobing + various fixes + +2004-06-17 Thomas Vander Stichele + + * configure.ac: + add videorate + * sys/ximage/ximagesink.c: (gst_ximagesink_finalize), + (gst_ximagesink_class_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_finalize), + (gst_xvimagesink_class_init): + run them as finalize, not dispose, since dispose can be invoked + multiple times + +2004-06-17 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), + (gst_alsa_get_time), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_loop), + (gst_alsa_src_change_state): + * ext/alsa/gstalsasrc.h: + Make the xrun code timestamp and offset the buffers correctly. + moved the clock to the base class, use alsa methods to get time. + Do correct timestamping on outgoing buffers. + +2004-06-17 Wim Taymans + + * gst/audiorate/Makefile.am: + * gst/audiorate/gstaudiorate.c: (gst_audiorate_get_type), + (gst_audiorate_base_init), (gst_audiorate_class_init), + (gst_audiorate_link), (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property), + (gst_audiorate_change_state), (plugin_init): + Added an audiorate converter that fills in gaps. + +2004-06-17 Johan Dahlin + + * ext/tcp/*: Revert Zaheer changes, to make things actually work again. + +2004-06-16 Wim Taymans + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), + (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + Added a copy mode to v4lsrc where it will output a copied version + of its internal hardware buffer. + Fix the wrong FLAG_SET usage. The flags are integers, not bits, you + can't | them. + +2004-06-16 Wim Taymans + + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Timestamp fixes. + +2004-06-16 Wim Taymans + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), + (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + Added a sync mode enum property to control v4lsrc timestamp method + Removed the use-fixed-fps property and moved functionality in + the enum. + Don't error on an error value from v4l-conf, it might not always + be a real error. + +2004-06-16 Wim Taymans + + * gst/videorate/Makefile.am: + * gst/videorate/gstvideorate.c: (gst_videorate_get_type), + (gst_videorate_base_init), (gst_videorate_class_init), + (gst_videorate_getcaps), (gst_videorate_link), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_set_property), (gst_videorate_get_property), + (gst_videorate_change_state), (plugin_init): + Added a video timestamp corrector. + +2004-06-15 Zaheer Abbas Merali + + fixed a potential leak with previous commit + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + +2004-06-15 Zaheer Abbas Merali + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + Added missing refcount, fixes bug #144425 + Cheers Tim for finding the bug + +2004-06-15 Thomas Vander Stichele + + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4lcolorbalance.c: + * sys/v4l/gstv4lcolorbalance.h: + * sys/v4l/gstv4lelement.c: + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): + * sys/v4l/gstv4lmjpegsink.h: + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lmjpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), + (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps), (gst_v4lsrc_get): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/gstv4ltuner.c: + * sys/v4l/gstv4ltuner.h: + * sys/v4l/gstv4lxoverlay.c: + * sys/v4l/gstv4lxoverlay.h: + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), + (gst_v4l_set_window), (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_sync_frame), + (gst_v4lmjpegsink_set_buffer), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start), (gst_v4lmjpegsink_get_buffer), + (gst_v4lmjpegsink_play_frame), (gst_v4lmjpegsink_wait_frame), + (gst_v4lmjpegsink_playback_stop), + (gst_v4lmjpegsink_playback_deinit): + * sys/v4l/v4lmjpegsink_calls.h: + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), + (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_buffer), + (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), + (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_capture_start), + (gst_v4lmjpegsrc_grab_frame), (gst_v4lmjpegsrc_requeue_frame), + (gst_v4lmjpegsrc_capture_stop), (gst_v4lmjpegsrc_capture_deinit): + * sys/v4l/v4lmjpegsrc_calls.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_set_capture), + (gst_v4lsrc_capture_init), (gst_v4lsrc_capture_start), + (gst_v4lsrc_grab_frame), (gst_v4lsrc_requeue_frame), + (gst_v4lsrc_capture_stop), (gst_v4lsrc_capture_deinit), + (gst_v4lsrc_try_palette): + * sys/v4l/v4lsrc_calls.h: + bunch of paranoia cleanups + +2004-06-14 David Schleef + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_init), + (cdparanoia_get), (cdparanoia_open), (cdparanoia_change_state): + Send discont events and change timestamps appropriately when + we get a seek event. (bug #144240) + * ext/cdparanoia/gstcdparanoia.h: + +2004-06-14 Benjamin Otte + + * ext/alsa/gstalsa.c: Use snd_pcm_hw_params_set_rate _near instead of + snd_pcm_hw_params_set_rate since the latter fails for no good + reason on some setups. + +2004-06-14 David Schleef + + * gst/volume/demo.c: (value_changed_callback): exp10() is not + standard. Thank you for playing. + +2004-06-14 Wim Taymans + + * gst/ffmpegcolorspace/imgconvert.c: (img_convert): + Patch 1.3 broke the ordering of the colorspace info and + made the plugin basically work by coincidence, reordered + the info. + +2004-06-14 Thomas Vander Stichele + + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + sync caps. Make sure mad can only output a list of rates, not + a full range. In the future, have three caps lists for each of the + mpeg versions. Change mpegversion to a double as well. + +2004-06-14 Thomas Vander Stichele + + * gst/volume/.cvsignore: + * gst/volume/Makefile.am: + * gst/volume/demo.c: (value_changed_callback), (idler), + (setup_gui), (main): + added small demo app + +2004-06-13 Jan Schmidt + * ext/esd/esdsink.c: (gst_esdsink_change_state): + * ext/esd/esdsink.h: + Close the esd connection on pause, because esd will just wait - + blocking all other esd clients indefinitely. + +2004-06-12 Christophe Fergeau + + * gst/tags/gstvorbistag.c: replaced a g_warning which I added in my + previous commit with GST_DEBUG + +2004-06-12 Thomas Vander Stichele + + * configure.ac: + add a header check for a dvdread header in dvdnav. Fixes #133002 + +2004-06-12 Zaheer Abbas Merali + + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init), + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_init_send): + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): + * gst/tcp/gsttcpserversrc.h: + Modified the tcp plugins so they are portable (IPv4,IPv6, any future + version of IP) + +2004-06-12 Zaheer Abbas Merali + + * configure.ac: + Added ogg library so that OSX detects libtheora properly + +2004-06-11 Wim Taymans + + * ext/theora/theoradec.c: (theora_dec_chain), + (theora_dec_change_state): + Don't try to decode frames before we received a keyframe. + +2004-06-11 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), + (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): + Added property to set the maximum delay of a page. + +2004-06-10 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), + (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): + Added max-delay property to control the maximum amount + of data to put in one page. + +2004-06-10 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (gst_theora_enc_init), (theora_enc_sink_link), + (theora_buffer_from_packet), (theora_enc_set_property), + (theora_enc_get_property): + Set duration on encoded buffer, added some more properties + +2004-06-10 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + * ext/theora/theoraenc.c: (theora_enc_chain): + Fix refcounting bugs + +2004-06-10 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), + (gst_asf_demux_loop), (gst_asf_demux_process_file), + (gst_asf_demux_process_data), (gst_asf_demux_handle_data), + (gst_asf_demux_process_object), (gst_asf_demux_get_stream), + (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event), + (gst_asf_demux_handle_src_event), (gst_asf_demux_handle_src_query), + (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + You know Chimaira? "I - HATE - EVERYTHING". Yeah, that's what this + feels like. I think we should set a new requirement for demuxers + from now on to implement sane loop functions, data loops, query + and seek functions before first commit into CVS. And this commit + fixes all of the above. + +2004-06-10 Christophe Fergeau + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): make sure parsed + vorbis comments are properly encoded in UTF-8 before adding them + to a GstTagList + +2004-06-09 Benjamin Otte + + * ext/alsa/gstalsa.c: (add_channels): + handle min <= max correctly + * ext/alsa/gstalsa.c: (gst_alsa_fixate_to_mimetype), + (gst_alsa_fixate_field_nearest_int), (gst_alsa_fixate): + add fixation functions so we fixate correctly. No preferring of alaw + anymore because it's the first structure. + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsa.c: (gst_alsa_sw_params_dump), + (gst_alsa_hw_params_dump): + add functions to ease debugging in alsalib + * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), + (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), + (gst_alsa_start_audio): + only specify hw params if we really setup a format (fixes #134007 - + or at least works around it) + +2004-06-09 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_buffer_from_page), + (gst_ogg_mux_push_page), (gst_ogg_mux_get_headers), + (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), + (gst_ogg_mux_loop): + Use stream caps to setup the initial pages in the ogg stream. + Correctly set the streamheader caps on the srcpad. + +2004-06-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), + (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps): + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): + add querying of fps lists for webcams. Negotiating to a framerate + now works. + +2004-06-08 Thomas Vander Stichele + + * ext/theora/theoraenc.c: (theora_buffer_from_packet), + (theora_push_buffer), (theora_push_packet), + (theora_set_header_on_caps), (theora_enc_chain): + mark buffers and put on streamheader, raw theora streaming + now works too, whee + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), + (gst_tcp_gdp_read_caps): + do a looping read for caps and GDP headers too + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get): + return EOS instead of NULL in _get + +2004-06-08 Wim Taymans + + * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), + (gst_tcp_gdp_read_caps), (gst_tcp_gdp_write_header), + (gst_tcp_gdp_write_caps): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), + (gst_tcpserversrc_gdp_read_header), (gst_tcpserversrc_get): + Memory leak fixes + +2004-06-08 Thomas Vander Stichele + + * ext/vorbis/Makefile.am: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_base_init), + (gst_vorbis_parse_class_init), (gst_vorbis_parse_init), + (vorbis_parse_set_header_on_caps), (vorbis_parse_chain), + (vorbis_parse_change_state): + * ext/vorbis/vorbisparse.h: + adding a vorbisparse element that marks the buffers, streaming + raw vorbis using GDP now works, whee + +2004-06-08 Wim Taymans + + * ext/jpeg/Makefile.am: + * ext/jpeg/README: + * ext/jpeg/gstjpeg.c: (plugin_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_get_type), + (gst_smokedec_base_init), (gst_smokedec_class_init), + (gst_smokedec_init), (gst_smokedec_link), (gst_smokedec_chain): + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_get_type), + (gst_smokeenc_base_init), (gst_smokeenc_class_init), + (gst_smokeenc_init), (gst_smokeenc_getcaps), (gst_smokeenc_link), + (gst_smokeenc_resync), (gst_smokeenc_chain), + (gst_smokeenc_set_property), (gst_smokeenc_get_property): + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.c: (smokecodec_init_destination), + (smokecodec_flush_destination), (smokecodec_term_destination), + (smokecodec_init_source), (smokecodec_fill_input_buffer), + (smokecodec_skip_input_data), (smokecodec_resync_to_restart), + (smokecodec_term_source), (smokecodec_encode_new), + (smokecodec_decode_new), (smokecodec_info_free), + (smokecodec_set_quality), (smokecodec_get_quality), + (smokecodec_set_threshold), (smokecodec_get_threshold), + (smokecodec_set_bitrate), (smokecodec_get_bitrate), + (find_best_size), (abs_diff), (put), (smokecodec_encode), + (smokecodec_parse_header), (smokecodec_decode): + * ext/jpeg/smokecodec.h: + Added a new simple jpeg based codec + +2004-06-08 Wim Taymans + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_loop): + Fix memory leak + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_client_remove), + (gst_tcpserversink_handle_client_read), (gst_tcp_buffer_write), + (gst_tcpserversink_handle_client_write), (gst_tcpserversink_chain), + (gst_tcpserversink_init_send), (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + take streamheader into account + +2004-06-08 Thomas Vander Stichele + + * gst/level/Makefile.am: + * gst/level/gstlevel.c: (gst_level_class_init): + clean up marshal generation + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), + (gst_tcpclientsink_class_init), (gst_tcpclientsink_init), + (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init), (gst_tcpclientsrc_set_property), + (gst_tcpclientsrc_get_property): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_client_read), + (gst_tcpserversink_handle_client_write), + (gst_tcpserversink_set_property), (gst_tcpserversink_get_property): + * gst/tcp/gsttcpserversink.h: + add signals client-added and client-removed + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_set_property), + (gst_tcpserversrc_get_property): + uniformized, change default protocol to NONE + * gst/tcp/gsttcp-marshal.list: added +2004-06-07 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + handle discont events if they happen before caps nego + +2004-06-07 Wim Taymans + + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), + (gst_multipart_demux_plugin_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_init), (gst_multipart_mux_loop), + (gst_multipart_mux_change_state): + Small updates, fix a memleak + +2004-06-07 Stephane Loeuillet + + * configure.ac: OSS portability + * ext/arts/gst_arts.c: idem + * sys/oss/gstosselement.c: idem + * sys/oss/gstossmixer.c: idem + * sys/oss/gstosssink.c: idem + * sys/oss/gstosssrc.c: idem + * sys/oss/oss_probe.c: idem + - check for soundcard.h in different places for some BSD + +2004-06-07 Jan Schmidt + + * AUTHORS: + Add me to the authors file + * configure.ac: + Increase the libdv requirement to >= version 0.100 + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), + (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Add support for the new_media flag when sending DISCONT events + Make the querying work when video pad is not linked + +2004-06-07 Tim-Philipp Müller + + reviewed by Benjamin Otte + + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init): + create a NULL-initialized array of pads, so we don't think they + exist already. (fixes #143130) + +2004-06-07 Benjamin Otte + + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init), + (mixmatrix_resize), (gst_mixmatrix_set_all_caps), + (gst_mixmatrix_request_new_pad), (gst_mixmatrix_loop): + don't use // coments + +2004-06-07 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_samples_to_timestamp): + cast to GstClockTime to get higher granularity + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + use gst_element_set_time_delay to get the exact time + * ext/mad/gstmad.c: (gst_mad_chain): + use the negotiated rate instead of the current frame's rate which + might be wrong because of bit errors. This avoids emitting totally + bogus timestamps and screwing sync. + (fixes #143454) + +2004-06-07 Tim-Philipp Müller + + reviewed by Benjamin Otte + + * gst/adder/gstadder.c: (gst_adder_loop): + properly error out when no negotiation has happened yet. (fixes + #143032) + +2004-06-06 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + forward correctly transformed offset in discont events. Based on + patch by Arwed v. Merkatz. (fixes #142851) + +2004-06-06 David Schleef + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: that's + G_HAVE_GNUC_VARARGS, not G_HAVE_GNU_VARARGS. Should fix compile + problems on several systems. + +2004-06-06 Benjamin Otte + + * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init): + use explicit caps on the srcpad + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + properly error out if caps couldn't be set (fixes #142764) + +2004-06-06 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), + (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), + (gst_alsa_start_audio): + - don't call set_periods_integer anymore, it breaks the + configuration randomly + - call snd_pcm_hw_params_set_access directly instead of using masks + - don't fail if the sw_params can't be set, just use the default + params and hope it works. Alsalib has weird issues when you touch + sw_params and does no proper error reporting about what failed. + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_close_audio): + make our alsa debugging go via gst debugging and not conditionally + defined + * ext/alsa/gstalsa.h: + add ALSA_DEBUG_FLUSH macro + * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper), + (plugin_init): + wrap alsa errors to be printed via the gst debugging system and not + spammed to stderr + +2004-06-04 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), + (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (qtdemux_dump_mvhd), + (qtdemux_parse_trak): + * gst/qtdemux/qtdemux.h: + Bitch. Also known as seeking, querying & co. + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + * sys/oss/gstosssink.h: + Resyncing is for weenies, this hack is no longer needed and was + broken anyway (since it - unintendedly - always leaves resync to + TRUE). + +2004-06-05 Andrew Turner + + * gst/tcp/gsttcp.c: portability (Solaris 10/FreeBSD) + * gst/tcp/gsttcpclientsrc.h: idem + - define MSG_NOSIGNAL if not done + - include unistd.h for off_t + (fixes #143749) + +2004-06-05 Benjamin Otte + + * configure.ac: + * ext/kio/Makefile.am: + check for qt's moc preprocessor explicitly and use it + +2004-06-03 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: (gst_tcp_socket_write): + don't get a signal for EPIPE on socket writes + (somebody check if this works on other platforms) + +2004-06-02 Thomas Vander Stichele + + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + check error condition on available samples correctly + +2004-06-02 Thomas Vander Stichele + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_time): + avoid a segfault + * gst/tcp/gsttcp.c: (gst_tcp_socket_write), (gst_tcp_socket_read), + (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), + (gst_tcpserversrc_gdp_read_header): + use ssize_t over size_t since the former is signed and thus the + check for error codes can work + +2004-06-02 Wim Taymans + + reviewed by: Johan + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_loop): + Oops + +2004-06-02 Wim Taymans + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_init), (gst_multipart_mux_loop), + (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), + (gst_multipart_mux_change_state): + Added configurable boundary specifier, added the value as a + caps field as well. + +2004-06-02 Zaheer Abbas Merali + + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversrc.c: + - portability fix, to compile on OSX + (fixes #143146) + + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + - compilation warnings on OSX + (fixes #143153) + +2004-06-02 Stephane Loeuillet + + * ext/vorbis/vorbisdec.c : sign warning fixes + + * gst-libs/gst/mixer/mixertrack.c : + do no use defines which are glib 2.4 specific + +2004-06-01 Christophe Fergeau + + * ext/flac/gstflactag.c: strip ending framing bit from vorbiscomment + buffer since libflac doesn't expect it (reports a sync error when + it encounters that) + + +2004-06-01 Owen Fraser-Green + + * gst-libs/gst/mixer/mixertrack.h: Changed struct syntax + * gst-libs/gst/mixer/mixertrack.c: + (gst_mixer_track_get_property), (get_mixer_track_init), + (get_mixer_track_get_property): Added property accessors + * gst-libs/gst/mixer/mixeroptions.h: Changed struct syntax + * gst-libs/gst/mixer/mixeroptions.c: + (gst_mixer_options_get_values): Added + * gst-libs/gst/mixer/mixer.h: Changed GstMixerClass syntax + * gst-libs/gst/mixer/mixer.c: Fixed comment + + +2004-06-01 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio): + improve error messages on open + + +2004-06-01 Thomas Vander Stichele + + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + check if v4l-conf is in path + +2004-06-01 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): + change assert to a more readable error message + +2004-05-31 Stephane Loeuillet + + * gst-libs/gst/tuner/tunerchannel.h: + - add a freq_multiplicator field to make the conversion + between internal frequency unit and Hz + * sys/v4l/gstv4lelement.c: + * sys/v4l2/gstv4l2element.c: + - change default video device to /dev/video0 + * sys/v4l/v4l_calls.c: + * sys/v4l2/v4l2_calls.c: + - we only expose frequency to the user in Hz instead of + bastard v4lX unit (either 62.5kHz or 62.5Hz) + +2004-05-31 Jan Schmidt + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Initialise b_o_s and e_o_s variables + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add some unusual fourcc's from mplayer avi's + * gst/multipart/multipartmux.c: (gst_multipart_mux_plugin_init): + Make the muxer have rank GST_RANK_NONE, so it doesn't mess up + autoplugging. + +2004-05-28 Wim Taymans + + * configure.ac: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_get_type), (gst_alpha_base_init), + (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), + (gst_alpha_get_property), (gst_alpha_sink_link), (gst_alpha_add), + (gst_alpha_chroma_key), (gst_alpha_chain), + (gst_alpha_change_state), (plugin_init): + A plugin to add an alpha channel to I420 video. Can optionally do + chroma keying. + * gst/multipart/Makefile.am: + * gst/multipart/multipart.c: (plugin_init): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_demux_class_init), (gst_multipart_demux_init), + (gst_multipart_demux_finalize), (gst_multipart_demux_handle_event), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), + (gst_multipart_demux_change_state), + (gst_multipart_demux_plugin_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_get_type), + (gst_multipart_mux_base_init), (gst_multipart_mux_class_init), + (gst_multipart_mux_get_sink_event_masks), (gst_multipart_mux_init), + (gst_multipart_mux_sinkconnect), (gst_multipart_mux_pad_link), + (gst_multipart_mux_pad_unlink), + (gst_multipart_mux_request_new_pad), + (gst_multipart_mux_handle_src_event), + (gst_multipart_mux_next_buffer), (gst_multipart_mux_compare_pads), + (gst_multipart_mux_queue_pads), (gst_multipart_mux_loop), + (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), + (gst_multipart_mux_change_state), (gst_multipart_mux_plugin_init): + A Multipart demuxer/muxer. Not sure if it violates specs. Used to + send multipart jpeg images to a browser. + * gst/videobox/Makefile.am: + * gst/videobox/README: + * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), + (gst_video_box_get_type), (gst_video_box_base_init), + (gst_video_box_class_init), (gst_video_box_init), + (gst_video_box_set_property), (gst_video_box_get_property), + (gst_video_box_sink_link), (gst_video_box_i420), + (gst_video_box_ayuv), (gst_video_box_chain), + (gst_video_box_change_state), (plugin_init): + Crops or adds borders around an image. can do alpha channel + borders as well. + * gst/videomixer/Makefile.am: + * gst/videomixer/README: + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_base_init), (gst_videomixer_pad_class_init), + (gst_videomixer_pad_get_sink_event_masks), + (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_link), + (gst_videomixer_pad_unlink), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_base_init), (gst_videomixer_class_init), + (gst_videomixer_init), (gst_videomixer_request_new_pad), + (gst_videomixer_handle_src_event), + (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), + (gst_videomixer_fill_color), (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), + (gst_videomixer_loop), (gst_videomixer_get_property), + (gst_videomixer_set_property), (gst_videomixer_change_state), + (plugin_init): + Generic video mixer plugin, can handle multiple inputs all with + different framerates and video sizes. Is fully alpha channel + aware. + +2004-05-27 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + Select first track as master track. Not sure how else to handle + that... + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer): + Discard discont events. Should fix #142962. + +2004-05-26 Ronald Bultje + + * ext/alsa/Makefile.am: + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init), + (gst_alsa_mixer_build_list), (gst_alsa_mixer_get_volume), + (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), + (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), + (gst_alsa_mixer_get_option): + * ext/alsa/gstalsamixer.h: + * ext/alsa/gstalsamixeroptions.c: + (gst_alsa_mixer_options_get_type), + (gst_alsa_mixer_options_class_init), (gst_alsa_mixer_options_init), + (gst_alsa_mixer_options_new): + * ext/alsa/gstalsamixeroptions.h: + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Add enumerations (as GstMixerOptions). Make correct distinction + between input/output tracks. Add capture/playback private flag. + Use flag to decide on whether to set capture or playback volumes + or switches. Use playback and record switches. + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer-marshal.list: + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init), + (gst_mixer_set_option), (gst_mixer_get_option), + (gst_mixer_mute_toggled), (gst_mixer_record_toggled), + (gst_mixer_volume_changed), (gst_mixer_option_changed): + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/mixer/mixeroptions.c: (gst_mixer_options_get_type), + (gst_mixer_options_class_init), (gst_mixer_options_init), + (gst_mixer_options_dispose): + * gst-libs/gst/mixer/mixeroptions.h: + Add GstMixerOptions. + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Rename Audio Mixer to OSS Mixer (similar to Alsa Mixer). Fix + broken device detection on computers with multiple OSS sound + cards. + +2004-05-26 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + fixate nicely even when the peer is not negotiating + +2004-05-25 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_parse_caps): + make sure we don't allow depth > width + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + fixate endianness to G_BYTE_ORDER as default + * gst/audioscale/gstaudioscale.c: + we don't handle another endianness as host-endianness + +2004-05-25 David Schleef + + * gst/ffmpegcolorspace/mem.c: malloc() is in stdlib.h, not malloc.h + +2004-05-24 Benjamin Otte + + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_sinkconnect), + (gst_oggvorbisenc_setup): + properly fail when we can't setup the vorbis encoder due to + unsupported settings + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_sinkconnect), + (gst_vorbisenc_setup): + same + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + fix case where warnings occured when one pad was unlinked while the + other's link function was called + +2004-05-24 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + use GST_ENABLE_NEW + +2004-05-24 Benjamin Otte + + * gst-libs/gst/resample/private.h: + don't use optimizations that are #if 0'ed + +2004-05-24 Wim Taymans + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + Fix potential division by zero error and hopefully get + the position query right to get correct timestamps on avi + audio. + +2004-05-24 Wim Taymans + + * gst/videoscale/videoscale.c: (gst_videoscale_scale_nearest), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + Fix the scaling algorithm and avoid a buffer overflow. + removed the while loop in the scaling function as it + was used for point sampling only. + +2004-05-24 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), + (gst_id3_tag_class_init), (gst_id3_tag_init), + (gst_id3_tag_set_property), (gst_id3_tag_get_tag_to_render), + (gst_id3_tag_handle_event), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_send_tag_event): + lots of fixes to make id3mux work and id3demux work correctly + +2004-05-24 Stephane Loeuillet + + * ext/Makefile.am: + add rules to build shout2send (was removed by accident + when this module was no more marked experimental/broken) + +2004-05-24 Zaheer Abbas Merali + + * ext/shout2/gstshout2.c: + * ext/shout2/gstshout2.h: + adding a "connection problem" signal to shout2send + (fixes #142954) + +2004-05-21 Thomas Vander Stichele + + * ext/kio/kioreceiver.cpp: + * ext/kio/kioreceiver.h: + fix sign comparison issues + +2004-05-21 Stephane Loeuillet + + * gst/cdxaparse/gstcdxaparse.c: + * gst/cdxaparse/gstcdxaparse.h: + some renaming + add some checks/sanity + prepare for seek addition + + * sys/sunaudio/gstsunaudio.c: + remove exported dupe init function + +2004-05-21 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_get_formats), + (gst_dvdec_src_convert), (gst_dvdec_sink_convert): + Fix format conversion and position querying. + * gst/debug/progressreport.c: (gst_progressreport_report): + Don't output a bogus total value that we didn't query. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + Always set XV_AUTOPAINT_COLORKEY to true. Fixes xvimagesink showing + only a blank window after xine has been used. + +2004-05-21 Thomas Vander Stichele + + * m4/as-arts.m4: + sync with upstream version to fix test on FC2 + readd with -ko to preserve Id header + +2004-05-20 Stephane Loeuillet + + * configure.ac: + test for FIONREAD ioctl in sys/filio.h for Solaris compat. + * gst/tcp/gsttcpclientsrc.c: idem + * gst/tcp/gsttcpserversink.c: idem + * gst/tcp/gsttcpserversrc.c: idem + * m4/gst-fionread.m4: idem + + * sys/sunaudio/gstsunaudio.c: change category to Sink/Audio + + * configure.ac: enable speex plugin for speex 1.1.5+ + * ext/speex/gstspeexenc.c: fix cast warning + + * ext/esd/README: fix typo + +2004-05-20 David Schleef + + * configure.ac: Minor cosmetic change to convince the buildbot to + reautogen. + * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_class_init), + (gst_sunaudiosink_init), (gst_sunaudiosink_getcaps), + (gst_sunaudiosink_pad_link), (gst_sunaudiosink_chain), + (gst_sunaudiosink_setparams), (gst_sunaudiosink_open), + (gst_sunaudiosink_close), (gst_sunaudiosink_change_state), + (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property): + More hacking. Plays audio now. + +2004-05-20 David Schleef + + * configure.ac: + * sys/Makefile.am: + +2004-05-20 David Schleef + + * sys/osxaudio/Makefile.am: New OS X audio plugin by Zaheer Abbas Merali + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxaudiosrc.h: + +2004-05-20 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_set_header_on_caps), + (gst_vorbisenc_chain): + put the codec headers on the caps as streamheader as well as + pushing them out + +2004-05-20 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), + (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_push_buffer), + (gst_vorbisenc_push_packet), (gst_vorbisenc_chain): + split up push_packet into two functions + +2004-05-20 Thomas Vander Stichele + + * gst/tcp/.cvsignore: + ignore enums + * gst/tcp/Makefile.am: + * gst/tcp/README: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpplugin.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: + * gst/tcp/gsttcpserversrc.h: + add new tcp elements + +2004-05-19 Wim Taymans + + * gst/law/mulaw-conversion.c: (mulaw_encode): + Fix overflow bug in ulaw encoding. + +2004-05-19 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_handle_event): + don't unref the event twice + +2004-05-19 Benjamin Otte + + * configure.ac: + remove -Wno-sign-compare + +2004-05-19 Benjamin Otte + + * configure.ac: + remove -DG_DISABLE_DEPRECATED. It's not usable without workarounds + if you want to work against glib 2.2 and 2.4 + +2004-05-19 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpsink.h: + * gst/tcp/gsttcpsrc.h: + gsttcp -> gsttcpplugin + CVS surgery in preparation for tcp merge + +2004-05-19 Benjamin Otte + + * gst/debug/tests.c: (md5_get_value): + fix segfault on gst-inspect + +2004-05-19 Benjamin Otte + + * gst/debug/testplugin.c: + * gst/debug/tests.c: + * gst/debug/tests.h: + add new extensible and configurable testing element. Current tests + include buffer count, stream length, timestamp/duration matching and + md5. + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + add infrastructure for new element + +2004-05-19 Johan Dahlin + + * ext/dv/gstdvdec.c (gst_dvdec_quality_get_type): Add proper + ending of the array. Fixes gst-inspect segfault on ppc. + +2004-05-19 Stephane Loeuillet + + * ext/dirac/gstdiracdec.cc : change category to Codec/Decoder/Video + + * m4/a52.m4 : don't fix a test that should fail with current a52dec lib + +2004-05-18 David Schleef + + * gst/ffmpegcolorspace/imgconvert.c: (img_convert): Fixes for + warnings (bugs, actually) noticed by gcc but not forte. + +2004-05-18 David Schleef + + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: New sunaudiosink + +2004-05-18 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header): Patch from dcm@acm.org (David Moore) + to allow qtdemux to use non-seekable streams. (bug #142272) + +2004-05-18 David Schleef + + * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16), + (gst_resample_sinc_ft_float): Remove use of static temporary + buffer. This code was obviously not supposed to last long, but + it's stuck in our ABI, so it required a little hack to make it + ABI-compatible. Fixes #142585. + * gst-libs/gst/resample/resample.h: same. + +2004-05-18 David Schleef + + * configure.ac: Add sunaudio + * examples/Makefile.am: make gstplay depend on gconf + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Remove c99-isms + * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette), + (convert_table_lookup), (img_convert): remove c99-isms + * gst/ffmpegcolorspace/imgconvert_template.h: make a constant + unsigned, to fix a warning on Solaris + * gst/mpeg1sys/systems.c: bcopy->memcpy + * gst/rtjpeg/RTjpeg.c: (RTjpeg_yuvrgb8): bcopy->memcpy + * sys/Makefile.am: Add sunaudio + +2004-05-18 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_init), + (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_push_page), + (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads), + (gst_ogg_mux_loop): + Fix an ugly memleak where the muxer didn't flush enough ogg + pages. This also resulted in badly muxed ogg files. + +2004-05-18 Stephane Loeuillet + + * gst/asfdemux/asfheaders.c : + * gst/asfdemux/asfheaders.h : + * gst/asfdemux/gstasfdemux.c : + - fix ASF_OBJ_PADDING guid + - add 3 new object guids (language list, metadata, + extended stream properties) + - add a function to parse extended header objects + +2004-05-18 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + remove leftover debugging g_print + +2004-05-17 Ronald Bultje + + * ext/mad/gstmad.c: (gst_mad_handle_event): + Fix for when the first format in a discont event is not a + byte-based one. Should fix #137710. + +2004-05-18 Stephane Loeuillet + + * m4/a52.m4 : fix compilation with -Wall -Werror + * m4/libfame.m4 : idem + * m4/libmikmod.m4 : idem + +2004-05-17 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + signal the new tags before giving up the reference + +2004-05-17 Benjamin Otte + + * ext/shout2/gstshout2.c: + use application/ogg instead of application/x-ogg (patch by Patrick + Guimond, fixes #142432) + * sys/oss/gstosselement.c: (gst_osselement_reset), + (gst_osselement_sync_parms): + don't set fragment size unless specified (fixes #142493) + +2004-05-17 Stephane Loeuillet + + * configure.ac : fix compilation of v4l2src with "-Wall -Werror" + fixes #142664 + +2004-05-17 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + compute offsets correctly for internal buffers so timestamps are set + correctly when we can't seek. Also handle cases where there are no + offsets. (based on a patch by David Moore, fixes #142507) + +2004-05-17 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + use correct variable when determining amount of data to skip so we + don't skip into the void and segfault + +2004-05-16 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Hi, I'm a memleak + +2004-05-16 Stephane Loeuillet + + * gst/asfdemux/gstasfdemux.c: + - fix a mem leak and always propagate tags + - add WMV3 to known video codecs (but no decoder yet) + - replace "surplus data" at end of audio header for what + it is : codec specific data + - fix a typo + +2004-05-16 Arwed v. Merkatz + + reviewed by: Ronald Bultje + + * gst-libs/gst/audio/audioclock.c: + Fix wrong return type (#142205). + +2004-05-16 Ronald Bultje + + * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_init): + Ignore CRCs by default (fixes #142566). + +2004-05-16 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open), + (gst_alsa_mixer_close), (gst_alsa_mixer_supported), + (gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list), + (gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record): + Fix for cases where we fail to attach to a mixer. + +2004-05-16 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Don't touch events after not owning them anymore. + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_fmt), (gst_wavparse_other), + (gst_wavparse_handle_seek), (gst_wavparse_loop), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + * gst/wavparse/gstwavparse.h: + Add seeking, fix querying. + +2004-05-16 Stephane Loeuillet + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + - process comments even if they don't end with \0\0 + g_convert would ignore them if present and works well without them + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_caps), (gst_alsa_get_caps): + simplify caps + +2004-05-16 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + don't write to memory we might not write to - g_convert does that + for us anyway (fixes #142613) + (gst_asf_demux_audio_caps): + comment out gst_util_dump_mem + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + compute correct expected timestamps after seek (broken since + last commit) + * ext/gdk_pixbuf/pixbufscale.c: (pixbufscale_init): + rename element and debugging category to gdkpixbufscale + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + add error checking to snd_pcm_delay and remove duplicate call to + snd_pcm_delay that caused issues (see inline code comments) + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + make more readable and fix return value when snd_pcm_delay fails + (fixes #142586) + +2004-05-15 Jan Schmidt + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type), + (gst_pixbufscale_get_type), (gst_pixbufscale_base_init), + (gst_pixbufscale_class_init), (gst_pixbufscale_getcaps), + (gst_pixbufscale_link), (gst_pixbufscale_init), + (gst_pixbufscale_handle_src_event), (pixbufscale_scale), + (gst_pixbufscale_chain), (gst_pixbufscale_set_property), + (gst_pixbufscale_get_property), (pixbufscale_init): + * ext/gdk_pixbuf/pixbufscale.h: + Add these files I forgot earlier + +2004-05-15 Jan Schmidt + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + Add new pixbufscale element to scale RGB video + using gdk_pixbuf, because gdk_pixbuf does BILINEAR + and HYPER interpolation correctly. + * ext/theora/theoraenc.c: (theora_enc_chain), + Discard buffer and return if explicit caps could not be set + (theora_enc_get_property): + Make _get return kbps for the bitrate consistent with + the _set function. + + +2004-05-14 Benjamin Otte + + * ext/libvisual/visual.c: (gst_visual_chain): + add missing visual_audio_analyze + +2004-05-14 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_chain): Fix crash when ESD + is killed while we're playing. + * gst/qtdemux/qtdemux.c: (qtdemux_parse): call + gst_element_no_more_pads(). + +2004-05-14 Stephane Loeuillet + + * gst-libs/gst/riff/riff-read.c : + - fix INFO tag extraction in RIFF/AVI files + because gst_event_unref (event) also freed taglist + - avoid a mem leak + +2004-05-13 Stephane Loeuillet + + * ext/mad/gstid3tag.c : move from "Codec/(Dem/M)uxer" to "Codec/(Dem/M)uxer/Audio" + * gst/wavenc/gstwavenc.c : move from "Codec/Encoder/Audio" to "Codec/Muxer/Audio" + + * gst/auparse/gstauparse.c : + - add code (commented for now) to support audio/x-adpcm on src pad + (we have no decoder for those layout yet) + + * gst/cdxaparse/gstcdxaparse.c : + * gst/cdxaparse/gstcdxaparse.h : + - partial rewrite using RiffRead (ripped iain's wavparse code) + + * gst/rtp/gstrtpL16enc.c : typo + * gst/rtp/gstrtpgsmenc.c : typo + +2004-05-13 Benjamin Otte + + * configure.ac: + check for exact version of libvisual, it's not supposed to be + API/ABI stable yet + +2004-05-13 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): + signal no-more-pads + +2004-05-13 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_src_convert) + Report which format was used for GST_FORMAT_DEFAULT + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + * gst/debug/progressreport.c: (gst_progressreport_base_init), + (gst_progressreport_class_init), (gst_progressreport_init), + (gst_progressreport_report), (gst_progressreport_set_property), + (gst_progressreport_get_property), (gst_progressreport_chain), + (gst_progressreport_plugin_init): + Add progressreport element for testing. + +2004-05-13 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_change_state): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), + (gst_v4lsrc_grab_frame): + add more debugging + send a discont at start + +2004-05-12 Colin Walters + + * gst/asfdemux/gstasfdemux.c (gst_asf_demux_process_segment): Avoid + inflooping if we can't find a chunk. Or in other words, don't blow + chunks if we don't have a chunk to blow. + +2004-05-13 Jan Schmidt + * ext/audiofile/gstafsrc.c: (gst_afsrc_get): + Remove old debug output + * ext/dv/gstdvdec.c: (gst_dvdec_quality_get_type), + (gst_dvdec_class_init), (gst_dvdec_loop), (gst_dvdec_change_state), + (gst_dvdec_set_property), (gst_dvdec_get_property): + Change the quality setting to an enum, so it works from gst-launch + Don't renegotiate a non-linked pad. Allows audio only decoding. + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_getcaps), + (gst_deinterlace_link), (gst_deinterlace_init): + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link): + Some caps negotiation fixes + +2004-05-12 Stephane Loeuillet + + * ext/tarkin/gsttarkin.c : + - Change RANK from NONE to PRIMARY + * ext/gdk_pixbuf/gstgdkpixbuf.c : + - Change RANK from NONE to MARGINAL + * ext/divx/gstdivxenc.c : + - Change RANK from PRIMARY to NONE (encoder/spider issue) + +2004-05-12 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), + (gst_vorbisenc_push_packet): + copy a function that was added between 1.0 and 1.0.1 until we + depend on worthwhile features of post-1.0 + +2004-05-12 Benjamin Otte + + * configure.ac: + enable shout2 by default + * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), + (gst_shout2send_base_init), (gst_shout2send_init), + (gst_shout2send_connect), (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + make this work again. Based on a patch by Zaheer Abbas Merali (fixes + #142262) + * ext/theora/theora.c: (plugin_init): + don't set rank on encoders + +2004-05-11 Jeremy Simon + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Use codec_data property instead of flag1 and flag2 for wma + +2004-05-11 Stephane Loeuillet + + * gst/cdxaparse/gstcdxaparse.c : + - Add mpegversion to CAPS to make it link + - Rank is as GST_RANK_SECONDARY instead of NONE + * gst/auparse/gstauparse.c : + - Document all audio encoding we can encounter from Solaris 9 + headers and libsndfile information. + - Increase max. rate from 48000 to 192000 (to match other elements) + - Don't try to play junk data between header and samples + +2004-05-11 Benjamin Otte + + * ext/libvisual/visual.c: (gst_visual_getcaps): + use the right caps depending on endianness (I hope) + * ext/ogg/gstoggmux.c: (gst_ogg_mux_plugin_init): + use GST_RANK_NONE for all non-decoding elements or spider gets + mighty confused + +2004-05-11 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + Fix some odd cases and fix BE metadata parsing of unicode16 text. + +2004-05-11 Benjamin Otte + + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), + (gst_switch_loop), (gst_switch_get_type): + whoever that was: DO NOT IMPORT PRIVATE SYMBOLS THAT ARE NOT IN + HEADERS. Had to be said. + +2004-05-10 David Schleef + + * configure.ac: Add prototype Dirac support. + * ext/Makefile.am: + * ext/dirac/Makefile.am: + * ext/dirac/gstdirac.cc: + * ext/dirac/gstdiracdec.cc: + +2004-05-10 Ronald Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_class_init), + (gst_auparse_init), (gst_auparse_chain), + (gst_auparse_change_state): + Hack around spider. Remove me some day please. + +2004-05-10 Ronald Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Fix for some uninitialized variables in previous patch, also + makes it work. Fixes #142286 while we're at it. + +2004-05-11 Stephane Loeuillet + + * gst/auparse/gstauparse.c: + fixes a-law, adds mu-law, linear pcm (8,16,24,32), ieee (32, 64) + only unsupported formats are ADPCM/CCITT G.72x + reviewed by Ronald + * gst-libs/gst/audio/audio.h: adds 24bit depth to PCM (x-raw-int) + +2004-05-10 Wim Taymans + + * ext/vorbis/Makefile.am: + * ext/vorbis/README: + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_formats), + (oggvorbisenc_get_type), (vorbis_caps_factory), (raw_caps_factory), + (gst_oggvorbisenc_base_init), (gst_oggvorbisenc_class_init), + (gst_oggvorbisenc_sinkconnect), (gst_oggvorbisenc_convert_src), + (gst_oggvorbisenc_convert_sink), + (gst_oggvorbisenc_get_query_types), (gst_oggvorbisenc_src_query), + (gst_oggvorbisenc_init), (gst_oggvorbisenc_get_tag_value), + (gst_oggvorbisenc_metadata_set1), (gst_oggvorbisenc_set_metadata), + (get_constraints_string), (update_start_message), + (gst_oggvorbisenc_setup), (gst_oggvorbisenc_write_page), + (gst_oggvorbisenc_chain), (gst_oggvorbisenc_get_property), + (gst_oggvorbisenc_set_property), (gst_oggvorbisenc_change_state): + * ext/vorbis/oggvorbisenc.h: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisenc.c: (vorbis_caps_factory), + (raw_caps_factory), (gst_vorbisenc_class_init), + (gst_vorbisenc_init), (gst_vorbisenc_setup), + (gst_vorbisenc_push_packet), (gst_vorbisenc_chain), + (gst_vorbisenc_get_property), (gst_vorbisenc_set_property): + * ext/vorbis/vorbisenc.h: + Added a raw vorbis encoder to be used with the oggmuxer. + We still need the old encoder for some gnome applications, + read the README to find out how that works. + The raw encoder is called "rawvorbisenc" until 0.9. + +2004-05-10 Wim Taymans + + * ext/ogg/gstogg.c: (plugin_init): + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init), + (gst_ogg_print): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), + (gst_ogg_mux_base_init), (gst_ogg_mux_class_init), + (gst_ogg_mux_get_sink_event_masks), (gst_ogg_mux_init), + (gst_ogg_mux_sinkconnect), (gst_ogg_mux_pad_link), + (gst_ogg_mux_pad_unlink), (gst_ogg_mux_request_new_pad), + (gst_ogg_mux_handle_src_event), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_push_page), (gst_ogg_mux_compare_pads), + (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property), + (gst_ogg_mux_change_state), (gst_ogg_mux_plugin_init): + Added an ogg muxer. + Small typo fixes in the demuxer. + +2004-05-10 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), + (theora_enc_change_state), (theora_enc_set_property), + (theora_enc_get_property): + Mark the last packet with an EOS flag which is not really needed + in gstreamer. + Do some better video framerate initialisation. + Update the buffer timestamp. + +2004-05-10 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_change_state): + Return the result of the parent state change call + +2004-05-10 Stephane Loeuillet + + * gst/law/alaw.c : alawdec should be registered with type ALAWDEC, not ALAWENC + * gst/law/alaw-decode.c : put audio/x-alaw on pads, instead of audio/x-mulaw + * gst/law/alaw-encode.c : (idem) + * ext/a52dec/gsta52dec.c : mark audio/a52, audio/ac3 as deprecated in a comment + * gst/ac3parse/gstac3parse.c : audio/ac3 => audio/x-ac3 + * gst/realmedia/rmdemux.c : audio/a52 => audio/x-ac3 + +2004-05-09 Benjamin Otte + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + don't use a fixed buffer size when writing variable length data to + it. Fixes memory corruption and makes alsasrc work + +2004-05-09 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: + (_gst_boolean_allow_overwrite_accumulator), + (gst_gnomevfssink_class_init), (gst_gnomevfssink_open_file): + Run glib's default signal handler (??) in RUN_CLEANUP rather than + RUN_LAST, and don't use that to set the accumulator value because + then it's always FALSE. + +2004-05-09 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_audio_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + Fix for unaligned RIFF files (i.e. where all the chunks together + in a LIST chunk are not of the same size as the size given in + the LIST chunk header). Fixes several odd WAVE files. Also fix + ADPCM (block_align property) in audio, so that wavparse based + on this works now as it used to stand-alone. + +2004-05-09 Edward Hervey + + reviewed by Benjamin Otte + + * ext/a52dec/gsta52dec.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): + * ext/faac/gstfaac.c: (gst_faac_base_init): + * ext/faad/gstfaad.c: (gst_faad_base_init): + * ext/ivorbis/vorbisfile.c: + * ext/lame/gstlame.c: + * ext/libfame/gstlibfame.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/sidplay/gstsiddec.cc: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + correct klasses. Mostly s,Codec/(Audio|Video),\1/Codec, + (fixes #142193) + +2004-05-08 Ronald Bultje + + * ext/alsa/gstalsa.c: (device_list), + (gst_alsa_class_probe_devices): + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open): + Fix alsa oddness in mixer after the combination of using mixer + in source/sink elements and using hw:x,y instead of just hw:x. + +2004-05-09 Benjamin Otte + + * gst/wavparse/gstwavparse.c: (gst_wavparse_destroy_sourcepad), + (gst_wavparse_create_sourcepad): + make PAUSED=>READY=>PAUSED=READY work by not destroying NULL + sourcepads + +2004-05-09 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + allow discont events before caps nego + +2004-05-08 Benjamin Otte + + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + don't leak events + +2004-05-08 Benjamin Otte + + * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), + (gst_level_change_state), (gst_level_init): + * gst/level/gstlevel.h: + figure out if we're initialized directly instead of keeping a + variable that's wrong in 90% of cases + don't initialize pads and then leak them and use a new unitialized + pad. (fixes #142084) + these were bugs so n00bish I didn't find them for an hour :/ + +2004-05-08 Iain + + * gst/wavparse/gstwavparse.[ch]: Rewrote to use RiffRead instead. + * gst-libs/gst/riff/riff-read.c (gst_riff_read_peek_head): Unstatic it + (gst_riff_read_element_data): Ditto, and added a got_bytes argument to + return the length that was read. + (gst_riff_read_strf_auds): Allow fmt tags as well. + +2004-05-07 David Schleef + + * ext/faad/gstfaad.c: (gst_faad_sinkconnect): HACK to correct + signed char assumption in faad.h. + +2004-05-07 Ronald Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): + Missing break, detected by Daniel Gazard . + +2004-05-07 Colin Walters + + * gst/volume/gstvolume.c (gst_volume_dispose): Unref dpman. + * ext/flac/gstflacdec.c (gst_flacdec_dispose): Add dispose + function. + * gst/audioscale/gstaudioscale.c (gst_audioscale_dispose): + Add dispose function. + +2004-05-08 Jan Schmidt + * ext/dv/gstdvdec.c: (gst_dvdec_video_link): + Fix caps nego and pad templates. RGB mode caps should + work now. + * ext/dvdnav/gst-dvd: + Move mpeg2dec inside the thread because otherwise the + queue rejects cap changes mid-stream + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), + (gst_mpeg2dec_flush_decoder): + For mpeg2dec > 0.4.0, call the flush function instead of + manually extracting all in-flight frames. + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_factory), + (gst_dv1394src_init), (gst_dv1394src_iso_receive): + Change mime type video/dv go video/x-dv to match the + rest of gst-plugins + +2004-05-07 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_type), + (gst_alsa_sink_class_init): + * ext/alsa/gstalsasink.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_type), + (gst_alsa_src_class_init): + * ext/alsa/gstalsasrc.h: + Make alsasink/src a subclass of alsamixer so that mixer stuff + shows up in gst-rec. Needs some finetuning. + +2004-05-05 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_chain): + simplify + * ext/mad/gstmad.c: (gst_mad_handle_event): + fix event leak + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + be able to detect mp3 files < 4096 bytes + +2004-05-06 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Also encode the first frame, cleanup some code. + +2004-05-06 Wim Taymans + + * ext/mpeg2enc/gstmpeg2enc.cc: + Forward events first before deciding that negotiation was + not performed. + +2004-05-06 Wim Taymans + + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + First process the events before deciding that negotiation + was not performed. + +2004-05-06 Wim Taymans + + * ext/theora/Makefile.am: + * ext/theora/theora.c: (plugin_init): + * ext/theora/theoradec.c: (theora_dec_change_state): + * ext/theora/theoraenc.c: (gst_theora_enc_base_init), + (gst_theora_enc_class_init), (gst_theora_enc_init), + (theora_enc_sink_link), (theora_enc_event), (theora_push_packet), + (theora_enc_chain), (theora_enc_change_state), + (theora_enc_set_property), (theora_enc_get_property): + Added a theora encoder, grouped the encoder and decoder into the + same plugin. + +2004-05-05 Thomas Vander Stichele + + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_chain): + fix DURATION on outgoing buffers + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): + debug using time formats + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_sink_link): + windows with width/height 0 generate X errors, so don't allow them + +2004-05-05 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: (src_templ), + (gst_mpeg2dec_base_init), (gst_mpeg2dec_init), + (gst_mpeg2dec_negotiate_format): + * ext/mpeg2dec/gstmpeg2dec.h: + removed the static pad template so that we can add the + more accurate framerate value to the caps. + + +2004-05-04 Benjamin Otte + + * configure.ac: + check for kdemacros.h, too (should fix #141821) + * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): + don't crash if no header was sent, but nicely error out (fixes part + of #141554) + +2004-05-04 Wim Taymans + + * ext/mpeg2enc/gstmpeg2enc.cc: (gst_mpeg2enc_dispose): call the + parent dispose function to avoid segfault on destroy. + +2004-05-04 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (plugin_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_sink_link): + clean up debugging caps + also recreate xvimage when format has changed + +2004-05-04 Benjamin Otte + + * ext/libvisual/Makefile.am: + * ext/libvisual/visual.c: (gst_visual_class_init), + (gst_visual_init), (gst_visual_dispose), (gst_visual_getcaps), + (gst_visual_srclink), (gst_visual_chain), + (gst_visual_change_state), (plugin_init): + use a GstAdapter to correctly adapt buffer sizes - allows using a + framerate + +2004-05-03 Thomas Vander Stichele + + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps), (gst_v4lsrc_getcaps), + (gst_v4lsrc_buffer_free): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_grab_frame), + (gst_v4lsrc_requeue_frame): + move some debugging categories around + query for fps index and set accordingly if found + +2004-05-03 Stephane Loeuillet + + * ext/lame/gstlame.c: + correct defaults that lame_init puts out of range + +2004-05-03 Thomas Vander Stichele + + * ext/divx/gstdivxenc.c: (gst_divxenc_get_type), + (gst_divxenc_class_init): + fix range since -1 is the default + * gst/mpeg1sys/gstmpeg1systemencode.c: + (gst_mpeg1_system_encode_get_type), (gst_system_encode_multiplex): + * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_get_type), + (gst_rtjpegdec_chain): + * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_get_type), + (gst_rtjpegenc_chain): + * sys/qcam/gstqcamsrc.c: (gst_autoexp_mode_get_type), + (gst_qcamsrc_get_type), (gst_qcamsrc_change_state): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_get_type): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get_type): + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4l_calls.c: (gst_v4l_open): + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init): + * sys/vcd/vcdsrc.c: (vcdsrc_get_type), (vcdsrc_get): + remove gst_info calls + +2004-05-03 Thomas Vander Stichele + + * Makefile.am: + * po/af.po: + * po/az.po: + * po/en_GB.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + Updated translations + +2004-05-03 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + refactor/comment code + +2004-05-02 Ronald Bultje + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_type), + (gst_asf_demux_base_init), (gst_asf_demux_process_comment), + (gst_asf_demux_setup_pad): + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstasfmux.c: + * gst/asfdemux/gstasfmux.h: + Add tagging support to demuxer, split out registration in its own + file instead of in demux (hacky), and prevent having some tables + in our memory multiple times (in asfheaders.h). + +2004-05-01 Ronald Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata): + * gst/matroska/matroska-ids.h: + Basic tag reading support. + +2004-04-30 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + Really detect ac-3 audio. + * gst/typefind/gsttypefindfunctions.c: (matroska_type_find): + really detect matroska files (off-by-1). + +2004-04-30 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_type_get), + (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), + (qtdemux_dump_unknown), (qtdemux_parse_tree), (qtdemux_parse_udta), + (qtdemux_tag_add), (get_size), (gst_qtdemux_handle_esds): More qtdemux + hackage -- parse a lot more atoms, extract a few tags. One might even + mistake this for tag support. Maybe it is. + * gst/qtdemux/qtdemux.h: + +2004-04-30 Colin Walters + + * ext/alsa/gstalsasink.c (gst_alsa_sink_mmap): Plug a memleak. + +2004-04-30 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_getcaps): + remove broken nego fix + +2004-04-30 Benjamin Otte + + * configure.ac: + * ext/Makefile.am: + * ext/libvisual/Makefile.am: + * ext/libvisual/visual.c: + add initial support for libvisual (http://libvisual.sourceforge.net) + libvisual is still quite alpha, so expect crashes in there :) + +2004-04-29 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), + (qtdemux_parse_trak), (get_size), (gst_qtdemux_handle_esds): Hacked + up qtdemux to make it spit out codec_data. Do _not_ look at this + code; you will no longer respect me. + +2004-04-29 Stephane Loeuillet + + * ext/alsa/gstalsa.c : (gst_alsa_class_probe_devices) + * ext/alsa/gstalsa.h : + change alsa pcm device discovery to find more than 1 device + per card. code review by Ronald. + +2004-04-29 David Schleef + + * sys/oss/gstosselement.c: (gst_osselement_rate_probe_check): + Add a check for a driver bug on FreeBSD. (bug #140565) + +2004-04-29 Thomas Vander Stichele + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_get_type): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_getcaps): + move format setting to inner loop + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_getcaps): + use GST_PAD_CAPS if available so that we use already negotiated + caps + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_moov), (qtdemux_parse): + extra debugging + * sys/qcam/qcam-Linux.c: (qc_lock_wait), (qc_unlock): + * sys/qcam/qcam-os.c: (qc_lock_wait), (qc_unlock): + move hardcoded path to DEFINE + +2004-04-28 David Schleef + + * gst/speed/gstspeed.c: (speed_parse_caps): Fix caps parsing. + (bug #140064) + +2004-04-28 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + Don't probe for playback device if we're a source element. Fixes + #139658. + +2004-04-29 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_chain): + rewrite buffer offset + +2004-04-28 Ronald Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/dts/Makefile.am: + * ext/dts/gstdtsdec.c: (gst_dtsdec_get_type), + (gst_dtsdec_base_init), (gst_dtsdec_class_init), (gst_dtsdec_init), + (gst_dtsdec_channels), (gst_dtsdec_renegotiate), + (gst_dtsdec_handle_event), (gst_dtsdec_update_streaminfo), + (gst_dtsdec_loop), (gst_dtsdec_change_state), + (gst_dtsdec_set_property), (gst_dtsdec_get_property), + (plugin_init): + * ext/dts/gstdtsdec.h: + New DTS decoder. + * ext/faad/gstfaad.c: (gst_faad_sinkconnect), + (gst_faad_srcconnect): + Add ESDS atom handling (.m4a). + +2004-04-27 Ronald Bultje + + * ext/divx/gstdivxdec.c: (plugin_init): + Remove comment that makes no sense. + * ext/mad/gstid3tag.c: (gst_id3_tag_set_property): + Fix for obvious typo that resulted in warnings during gst-register. + * ext/xvid/gstxviddec.c: (gst_xviddec_src_link), + (gst_xviddec_sink_link): + Fix caps negotiation a bit better. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + We call this 'codec_data', not 'esds'. + +2004-04-27 Benjamin Otte + + * gst/monoscope/gstmonoscope.c: + make sure we only provide 256x128 + * gst/monoscope/monoscope.c: (monoscope_init): + assert size of 256x128 + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_fixate), + (gst_v4lsrc_getcaps), (gst_v4lsrc_buffer_free): + fixate to max width and height of device + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * sys/v4l/gstv4l.c: + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4l_calls.c: + * sys/v4l/v4lsrc_calls.c: + fix for qc-usb driver which fakes having more than one buffer + by handing the same buffer twice, which confused GStreamer's/v4lsrc + buffer_free override + add debugging + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_class_init), (gst_videotestsrc_change_state), + (gst_videotestsrc_init), (gst_videotestsrc_get), + (gst_videotestsrc_set_property), (gst_videotestsrc_get_property): + * gst/videotestsrc/gstvideotestsrc.h: + add num-buffers property + + 2004-04-26 Benjamin Otte + + * ext/mad/gstid3tag.c: (plugin_init): + set id3mux rank to NONE so it doesn't confuse spider + require audio/mpeg,mpegversion=1 in id3mux + +2004-04-26 Benjamin Otte + + * configure.ac: + detect faad correctly as non-working if it's indeed non-working + +2004-04-26 Thomas Vander Stichele + + * Makefile.am: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_class_init), (gst_jpegenc_getcaps): + fix _getcaps so it only negotiates to its supported format + +2004-04-25 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + fix memleak + +2004-04-23 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): + audio/x-raw-int with height rules! not. Now it's depth. + +2004-04-22 Ronald Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), + (gst_wavparse_loop): + Missing variable initialization. Add handling of DVI ADPCM. Fix + mis-parsing of LIST chunks. This works around a bug where we mis- + parse non-aligning LIST chunks (so LIST chunks where the contents + don't align with the actual LIST size). The correct fix is to use + rifflib, I'm not going to fix wavparse - too much work. All this + fixes #104878. + +2004-04-22 Zaheer Abbas Merali + + reviewed by Benjamin Otte + + * ext/shout/gstshout.c: (gst_icecastsend_change_state): + fix shoutcast not working (fixes #140844) + +2004-04-22 Benjamin Otte + + * ext/hermes/gsthermescolorspace.c: + (gst_hermes_colorspace_caps_remove_format_info): + * gst/colorspace/gstcolorspace.c: + (gst_colorspace_caps_remove_format_info): + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_caps_remove_format_info): + s/gst_caps_simplify/gst_caps_do_simplify/ + +2004-04-22 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + mpegversion is an int + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init): + don't try to create pad templates with NULL caps, use any caps + instead. + +2004-04-20 David Schleef + + * ext/sdl/Makefile.am: Link against libgstinterfaces, not + libgstxoverlay. jmmv@menta.net (Julio M. Merino Vidal) + (bug #140384) + +2004-04-20 Daniel Gazard + + reviewed by David Schleef + + * ext/mad/gstid3tag.c: Add stdlib.h + * gst/rtp/gstrtpgsmenc.c: same + * gst/tags/gstid3tag.c: same + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Fix GST_DISABLE_LOADSAVE + * gst/tcp/gsttcpsink.c: (gst_tcpsink_sink_link): Adjust + GST_DISABLE_LOADSAVE use. + * gst/udp/gstudpsink.c: (gst_udpsink_sink_link): Likewise. + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): Likewise. + * ext/gnomevfs/gstgnomevfssrc.c: Include (needed by + atol(3)). + * sys/oss/gstosselement.h: Include (needed for dev_t). + * gst/tags/gstvorbistag.c: Include (needed by + strtoul(3)). + * gst/rtp/gstrtpL16enc.c: Include (needed by random(3)). + * ext/mad/Makefile.am: (libgstmad_la_CFLAGS): Add $(MAD_CFLAGS) + $(ID3_CFLAGS). + * ext/libfame/Makefile.am: (libgstlibfame_la_CFLAGS): Add + $(LIBFAME_CFLAGS). + +2004-04-20 David Schleef + + * gst/realmedia/rmdemux.c: This was supposed to part of the + last checkin. Same idea. + +2004-04-20 Daniel Gazard + + reviewed by David Schleef + + * configure.ac: bump required gstreamer version to 0.8.1.1 + because of following changes [--ds] + + * gst-libs/gst/riff/riff-read.c: Include gst/gstutils.h. + (gst_riff_peek_head, gst_riff_peek_list, gst_riff_read_list) + (gst_riff_read_header): Use GST_READ_UINT* + macros to access possibly unaligned memory. + + * gst/typefind/gsttypefindfunctions.c: Include gst/gstutils.h. + (mp3_type_find): Use GST_READ_UINT* + macros to access possibly unaligned memory. + (mp3_type_find, mpeg1_parse_header, qt_type_find) + (speex_type_find): Likewise + + * gst/tags/gstvorbistag.c: (ADVANCE): Likewise + + * gst/qtdemux/qtdemux.c: Include stdlib.h (needed by realloc). + (QTDEMUX_GUINT32_GET, QTDEMUX_GUINT16_GET, QTDEMUX_FP32_GET) + (QTDEMUX_FP16_GET, QTDEMUX_FOURCC_GET) + (gst_qtdemux_loop_header, gst_qtdemux_loop_header) + (qtdemux_node_dump_foreach, qtdemux_tree_get_child_by_type) + (qtdemux_tree_get_sibling_by_type): Use GST_READ_UINT* + macros to access possibly unaligned memory. + + * gst/mpegstream/gstmpegpacketize.c: (parse_generic, parse_chunk): + Likewise. + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead) + (gst_mpeg_demux_parse_packet, gst_mpeg_demux_parse_pes): Likewise. + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Likewise. + + * gst/mpeg2sub/gstmpeg2subt.c: (GST_BUFFER_DATA) + (gst_mpeg2subt_chain_subtitle): Likewise. + + * gst/mpeg1videoparse/gstmp1videoparse.c: (mp1videoparse_parse_seq) + (gst_mp1videoparse_time_code, gst_mp1videoparse_real_chain): + Likewise. + + * gst/mpeg1sys/buffer.c: (mpeg1mux_buffer_update_audio_info): + Likewise. + + * gst/cdxaparse/gstcdxaparse.c: (gst_bytestream_peek_bytes): + Likewise. + + * gst/asfdemux/gstasfdemux.c: (_read_var_length, _read_uint): + Likewise. + +2004-04-20 Thomas Vander Stichele + + * configure.ac: + update required version of GStreamer because of GST_TIME_FORMAT + +2004-04-20 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_init): + remove leftover g_print + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + don't try setting only a subset of the caps. We don't want to kill + autoplugging on purpose + +2004-04-20 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (plugin_init): + * sys/xvimage/xvimagesink.c: (plugin_init): + add debugging categories + +2004-04-20 Thomas Vander Stichele + + * po/en_GB.po: + * po/LINGUAS: + Adding en_GB translation (Gareth Owen) + +2004-04-20 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (qtdemux_parse), (qtdemux_type_get), (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_stsd), (qtdemux_dump_unknown), + (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): + A number of new features and hacks to extract the esds atom and + put it into the caps. (bug #137724) + +2004-04-19 David Schleef + + * gconf/Makefile.am: Fix for non-GNU make + * gst-libs/gst/Makefile.am: Change directory order to handle + GstPlay linking with gstinterfaces + * gst-libs/gst/audio/make_filter: make use of tr portable + * gst-libs/gst/play/Makefile.am: Add intended \ + * gst-libs/gst/xwindowlistener/xwindowlistener.c: + (gst_xwin_set_clips): Switch to ISO variadic macro. Use a + function prototype instead of void *. + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Switch to ISO variadic + macro. + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): wrap NULL in GST_ELEMENT_ERROR call + * gst/videofilter/make_filter: make use of tr portable + * pkgconfig/Makefile.am: Remove GNU extension in Makefile target + +2004-04-19 Thomas Vander Stichele + + * po/LINGUAS: + * po/uk.po: + Added Ukrainian translation (Maxim V. Dziumanenko) + +2004-04-18 Ronald Bultje + + * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_getcaps), + (gst_gsmdec_link), (gst_gsmdec_chain): + Fix capsnego, simplify chain function slightly. + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Add GSM. + +2004-04-18 Ronald Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_fmt), (gst_wavparse_change_state): + Hack to make wavparse work with spider (always -> sometimes pad). + Fixes #135862 && #140411. + +2004-04-18 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms), + (gst_osselement_rate_probe_check), + (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate): + get rid of \n in debug output + +2004-04-17 Iain + + * gst/wavparse/gstwavparse.c (gst_wavparse_loop): Allow all events, + not just EOS. + +2004-04-17 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), + (gst_id3_tag_class_init), (gst_id3_tag_get_caps), + (gst_id3_tag_add_src_pad), (gst_id3_tag_init), + (gst_id3_tag_set_property), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_src_link), (gst_id3_tag_chain), + (gst_id3_tag_change_state), (plugin_init): + deprecate id3tag element and replace with id3demux/id3mux. + great side effect: this ugly file is now even uglier, yay! + * ext/mad/gstmad.h: + remove non-available function + update for new get_type + +2004-04-17 Benjamin Otte + + * configure.ac: + require mpeg2dec >= 0.4.0 + +2004-04-17 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), + (gst_xvimagesink_set_xwindow_id): + call GST_ELEMENT_ERROR whenever get_xcontext fails. Includes + assorted cleanup fixes. + +2004-04-16 David Schleef + + * sys/ximage/ximagesink.h: Compile fix for FreeBSD. (bug #140268) + * sys/xvimage/xvimagesink.h: same + +2004-04-16 Thomas Vander Stichele + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): + Fix GST_ELEMENT_ERROR with (NULL) + +2004-04-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add div[3456] as fourccs for DivX 3 (fixes #140137). + +2004-04-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_caps), (gst_riff_create_audio_caps), + (gst_riff_create_video_template_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids): + * gst-libs/gst/riff/riff-read.h: + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Add MS RLE support. I added some functions to read out strf chunks + into strf chunks and the data behind it. This is usually color + palettes (as in RLE, but also in 8-bit RGB). Also use those during + caps creation. Lastly, add ADPCM (similar to wavparse - which + should eventually be rifflib based). + * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), + (gst_matroska_demux_init), (gst_matroska_demux_reset): + * gst/matroska/matroska-demux.h: + Remove placeholders for some prehistoric tagging system. Didn't add + support for any tag system really anyway. + * gst/qtdemux/qtdemux.c: + Add support for audio/x-m4a (MPEG-4) through spider. + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + ADPCM support (#135862). Increase max. buffer size because we + cannot split buffers for ADPCM (screws references) and I've seen + files with 2048 byte chunks. 4096 seems safe for now. + +2004-04-15 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.8.1 === + +2004-04-15 Thomas Vander Stichele + + * configure.ac: releasing 0.8.1, "Comforting Sounds" + +2004-04-14 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Fix typo in divxversion (3 instead of 4 for "DIVX" fourcc). + Fixes #140058 + +2004-04-14 Thomas Vander Stichele + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_plugin_init): + lower rank of dvddemux so that it's not used for mpeg playback. + +2004-04-14 Benjamin Otte + + * configure.ac: + save libs correctly when checking mad + +2004-04-14 Thomas Vander Stichele + + * ext/mad/gstid3tag.c: (plugin_init): + lower rank of id3tag as proposed by Benjamin. Fixes #139926. + +2004-04-13 David Schleef + + * common/m4/gst-feature.m4: Call -config scripts with + --plugin-libs if it is supported. + * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect): sequences of + JPEG images are image/jpeg. + * gst/debug/Makefile.am: + * gst/debug/negotiation.c: (gst_negotiation_class_init), + (gst_negotiation_getcaps), (gst_negotiation_pad_link), + (gst_negotiation_update_caps), (gst_negotiation_get_property), + (gst_negotiation_plugin_init): Add a property that acts like + filter caps. + * testsuite/gst-lint: Move license checking to be a standard + test. + +2004-04-13 David Schleef + + * gst/avi/gstavidemux.c: (gst_avi_demux_reset): Fix memleak. + patch from Sebastien Cote (bug #139958) + +2004-04-13 Thomas Vander Stichele + + * examples/gstplay/Makefile.am: + * examples/gstplay/player.c: (main): + make the commandline player example use gconf settings + +2004-04-13 Thomas Vander Stichele + + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), + (gst_cacasink_sinkconnect), (gst_cacasink_init), + (gst_cacasink_chain), (gst_cacasink_open), (gst_cacasink_close): + init/end library during state transition, not object + creation/disposal. get rid of custom dispose handler. + + +2004-04-12 Christian Schaller + + * sys/oss/gstosselement.c: s/lstat/stat/ from freeBSD, since it can + be a symlink + +2004-04-11 Ronald Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_data): + Handle JUNK chunks inside data section. Prevents warnings. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), + (gst_riff_create_video_template_caps): + Add MS video v1. + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_data): + Add support for "rec-list" chunks. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): + Fix another codecname mismatch. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Fix divx caps mismatch and move from video/x-jpeg to image/jpeg + so that MJPEG plays back. + +2004-04-10 Ronald Bultje + + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (gst_mp1videoparse_real_chain), (gst_mp1videoparse_change_state): + * gst/mpeg1videoparse/gstmp1videoparse.h: + Fix for some slight mis-cuts in buffer parsing, and for some + potential overflows or faults-causers. Adds disconts. Also fixes + #139105 while we're at it. + +2004-04-10 Ronald Bultje + + * configure.ac: + * sys/v4l2/gstv4l2element.h: + Workaround for missing struct v4l2_buffer declaration in Suse 9 + and Mandrake 10 linux/videodev2.h header file (#135919). + +2004-04-10 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): + Bail out if no filename was given. + +2004-04-10 Ronald Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), + (gst_v4l2_fourcc_from_structure): + Add Y41B/Y42B YUV formats (see #125732), fix Y41P (was typo'ed to + Y41B somewhere). + +2004-04-09 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssink.c: + (_gst_boolean_allow_overwrite_accumulator), + (gst_gnomevfssink_class_init): + fix erase signal - if any handler returns false the file will not be + overwritten. If no handler is connected, the file will not be + overwritten either. + renamed signal to "allow-overwrite" + * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach): + free string when adding it to ID3 failed + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + unref event when done + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + free caps + * gst/typefind/gsttypefindfunctions.c: + (mpeg_video_stream_type_find): + fix invalid read + +2004-04-08 David Schleef + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_register): Change rank to PRIMARY. + +2004-04-08 David Schleef + + * gst/colorspace/gstcolorspace.c: Don't advertise a conversion + we don't support (bug #139532) + +2004-04-07 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_handle_event), + (gst_mad_check_caps_reset), (gst_mad_chain), + (gst_mad_change_state): + only set explicit caps if they haven't been set before for + this stream. MPEG-audio sample rate/channels aren't allowed + to change in-stream. + Fixes #139382 + +2004-04-06 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_base_init), + (_gst_boolean_did_something_accumulator), + (gst_gnomevfssink_class_init), (gst_gnomevfssink_dispose), + (gst_gnomevfssink_init), (gst_gnomevfssink_set_property), + (gst_gnomevfssink_get_property), (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file), (gst_gnomevfssink_chain), + (gst_gnomevfssink_change_state): + Fix erase signal. Don't erase by default. Remove handoff signal. + Remove erase property. Don't segfault. General cleanup. + +2004-04-07 Benjamin Otte + + * gst-libs/gst/gconf/test-gconf.c: (main): + add missing gst_init + +2004-04-07 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): + free the mutexes, too + +2004-04-07 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): + actually free the URI string + * ext/mad/gstid3tag.c: (gst_id3_tag_src_event): + compute offset correctly when passing discont events + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + don't leak discont events + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): + add some missing breaks so caps aren't copied randomly + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream): + if we realloc memory, we better use it + +2004-04-06 Benjamin Otte + + * ext/mad/gstmad.c: (normal_seek): + fix GST_FORMAT_TIME usage + +2004-04-05 David Schleef + + * ext/kio/kiosrc.cpp: Undefine KDE_DEPRECATED so we can use + a deprecated function (hack!) + +2004-04-05 Benjamin Otte + + * ext/esd/esdmon.c: (gst_esdmon_get): + fix nonterminated vararg and memleak + +2004-04-05 Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_class_init), + (gst_ladspa_init), (gst_ladspa_force_src_caps), + (gst_ladspa_set_property), (gst_ladspa_get_property), + (gst_ladspa_instantiate), (gst_ladspa_activate), + (gst_ladspa_deactivate), (gst_ladspa_loop), (gst_ladspa_chain): + clean up debugging + +2004-04-05 Stefan Kost + + reviewed by Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_class_init): + check for broken LADSPA parameters (fixes #138635) + +2004-04-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps): + advertise buffer-frames correctly on sinkpads + +2004-04-05 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_get_type), (gst_mad_layer_get_type), + (gst_mad_mode_get_type), (gst_mad_emphasis_get_type), + (gst_mad_get_event_masks), (gst_mad_get_query_types), (index_seek), + (normal_seek), (gst_mad_src_event), (gst_mad_handle_event), + (gst_mad_check_caps_reset), (gst_mad_chain): + add more debugging, only reset caps when we're not in error state + +2004-04-05 Thomas Vander Stichele + + * ext/mad/gstmad.c: add debugging category, comment + cleanups + +2004-04-05 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * configure.ac: + fix == in test(1) operator + +2004-04-05 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * configure.ac: + fix --export-symblos-regex to a working regex. + +2004-04-04 Benjamin Otte + + * sys/oss/.cvsignore: + add for oss_probe + +2004-04-03 Tim-Phillip Müller + + reviewed by Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + add missing 'new_media' argument (fixes #138168) + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event): + add vararg terminator (fixes #138169) + +2004-04-02 David Schleef + + * ext/gdk_pixbuf/Makefile.am: Make sure gstgdkanimation.h is + disted (bug #138914) + +2004-04-01 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), + (gst_alsa_close_audio): + handle case better where a soundcard can't pause + * ext/ogg/gstoggdemux.c: + don't crash when we get events but don't have pads yet + +2004-04-01 Thomas Vander Stichele + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps): + throw an error if we couldn't probe any caps. + +2004-04-01 Jan Schmidt + + * ext/dvdnav/gst-dvd: + Add a really simple sample DVD player + +2004-04-01 Jan Schmidt + + * ext/a52dec/gsta52dec.c: (gst_a52dec_get_type), (gst_a52dec_init), + (gst_a52dec_push), (gst_a52dec_handle_event), + (gst_a52dec_update_streaminfo), (gst_a52dec_loop), + (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Use a debug category, Output timestamps correctly + Emit tag info, Handle events, tell liba52dec about cpu + capabilities so it can use MMX etc. + * ext/dv/gstdvdec.c: (gst_dvdec_loop), (gst_dvdec_change_state): + Fix a crasher accessing invalid memory + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), + (dvdnavsrc_update_highlight), (dvdnavsrc_loop), + (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), + (dvdnavsrc_event), (dvdnavsrc_get_formats), (dvdnavsrc_convert), + (dvdnavsrc_query): + Some support for byte-format seeking. + Small fixes for still frames and menu button overlays + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), + (gst_mpeg2dec_alloc_buffer): + Use a debug category. Adjust the report level of several items to + LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' + so it doesn't lose the GstBuffer pointer + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + * gst/debug/gstnavseek.c: (gst_navseek_get_type), + (gst_navseek_base_init), (gst_navseek_class_init), + (gst_navseek_init), (gst_navseek_seek), + (gst_navseek_handle_src_event), (gst_navseek_set_property), + (gst_navseek_get_property), (gst_navseek_chain), + (gst_navseek_plugin_init): + * gst/debug/gstnavseek.h: + Add the navseek debug element for seeking back and forth in a + video stream using arrow keys. + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_get_type), + (gst_mpeg2subt_base_init), (gst_mpeg2subt_class_init), + (gst_mpeg2subt_init), (gst_mpeg2subt_finalize), + (gst_mpeg2subt_getcaps_video), (gst_mpeg2subt_link_video), + (gst_mpeg2subt_handle_video), (gst_mpeg2subt_src_event), + (gst_mpeg2subt_parse_header), (gst_get_nibble), + (gst_setup_palette), (gst_get_rle_code), (gst_draw_rle_line), + (gst_merge_uv_data), (gst_mpeg2subt_merge_title), + (gst_update_still_frame), (gst_mpeg2subt_handle_subtitle), + (gst_mpeg2subt_handle_dvd_event), (gst_mpeg2subt_loop): + * gst/mpeg2sub/gstmpeg2subt.h: + Pretty much a complete rewrite. Now a loopbased element. May still + require work to properly synchronise subtitle buffers. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private), + (gst_dvd_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + Don't attempt to create subbuffers of size 0 + Reduce a couple of error outputs to warnings. + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect), + (gst_y4mencode_chain): + Output the y4m frame header correctly. + +2004-04-01 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): + throw errors instead of allowing SIGFPE + +2004-04-01 Thomas Vander Stichele + + * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_string), + (gst_gconf_render_bin_from_key): + leak plugging and style fixing + +2004-03-31 David Schleef + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_expand_value), + (gst_audioscale_getcaps): Fix getcaps to expand and union lists. + (bug #138225) + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: (gst_break_my_data_plugin_init): + * gst/debug/gstdebug.c: (plugin_init): Merge elements into one + plugin. + * gst/debug/negotiation.c: (gst_gst_negotiation_get_type), + (gst_negotiation_base_init), (gst_negotiation_class_init), + (gst_negotiation_init), (gst_negotiation_getcaps), + (gst_negotiation_pad_link), (gst_negotiation_chain), + (gst_negotiation_set_property), (gst_negotiation_get_property), + (gst_negotiation_plugin_init): New element to talk about random + negotiation things happening in a pipeline. + +2004-03-31 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): + fix integer addition with help of Stefan Kost + +2004-03-31 Thomas Vander Stichele + + * po/nl.po: updated Dutch translation (Elros Cyriatan) + +2004-03-30 David Schleef + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), + (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG + video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) + (bug #137504) + * ext/mpeg2dec/gstmpeg2dec.h: + +2004-03-30 David Schleef + + * ext/gdk_pixbuf/Makefile.am: Remove spurious rules. (bug #136527) + +2004-03-30 David Schleef + + * tools/gst-launch-ext-m.m: Applied patch from gnome@flyn.org (W. + Michael Petullo) to handle .mov + +2004-03-30 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps), + (gst_osselement_rate_check_rate): + probe caps correctly for sound cards that only support one format + +2004-03-30 Benjamin Otte + + * ext/kio/kiosrc.cpp: (process_events): + update handling event processing if inside KDE - untested + +2004-03-29 David Schleef + + * ext/hermes/gsthermescolorspace.c: (plugin_init): decrease rank + by 2 to not interfere with other colorspaces. + * ext/pango/gsttextoverlay.c: (plugin_init): change rank to NONE + * gst/colorspace/gstcolorspace.c: (plugin_init): decrease rank by + one to not interfere with ffmpeg_colorspace. + +2004-03-29 David Schleef + + * ext/alsa/gstalsa.c: (gst_alsa_fixate): Don't fixate fields that + aren't in the caps. + * gst/sine/gstsinesrc.c: change rate caps to [1,MAX] + * gst/videocrop/gstvideocrop.c: (plugin_init): Change rank to NONE. + +2004-03-30 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: + fail on error, don't try to set stuff on NULL caps + +2004-03-30 Benjamin Otte + + * configure.ac: + * ext/Makefile.am: + * ext/kio/Makefile.am: + * ext/kio/kioreceiver.cpp: + * ext/kio/kioreceiver.h: + * ext/kio/kiosrc.cpp: + * ext/kio/kiosrc.h: + add experimental kiosrc plugin + * ext/alsa/gstalsaplugin.c: (plugin_init): + initialize debugging category only when we're sure registering the + plugins worked. + +2004-03-29 Thomas Vander Stichele + + * examples/gstplay/player.c: (main): + * gst-libs/gst/play/play.c: (gst_play_class_init), + (gst_play_set_location), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization): + check return values of element_set_state and return FALSE where + failed + +2004-03-29 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + try harder to check if an event is really a discont + +2004-03-29 Thomas Vander Stichele + + * po/LINGUAS: adding Azerbaijani (Mətin Əmirov) + * po/az.po: + +2004-03-28 Benjamin Otte + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): + get rid of non-standard "..." ranges in case statements. + +2004-03-27 Martin Soto + + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegdemux.h: Complete overhaul. All DVD + specific functionality split to the new dvddemux element. + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstdvddemux.h: New demultiplexer for DVD (VOB) + streams, derived from mpegdemux. + * gst/mpegstream/gstmpegparse.c: Discontinuity handling cleaned + up. SCR based timestamp rewriting can be turned off (will probably + completely disappear soon). + * ext/dvdnav/dvdnavsrc.c: Changes resulting from a few months + hacking. General cleanup. All printf statements replaced by + debugging messages. Almost complete libdvdnav support. + (dvdnavsrc_class_init): Got rid of unnecessary signals (replaced + by events. New properties for audio and subpicture languages. + (dvdnavsrc_update_highlight): Now uses events. + (dvdnavsrc_user_op): Cleaned up. + (dvdnavsrc_get): Renamed to dvdnavsrc_loop (element is now loop + based). Lots of cleanup, and propper support for most libdvdnav + events. + (dvdnavsrc_make_dvd_event): New function. + (dvdnavsrc_make_dvd_nav_packet_event): New function. + (dvdnavsrc_make_clut_change_event): New function. + +2004-03-26 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: (theora_type_find): + fix bug where typefinding would claim it's theora whenever less then + 7 bytes of data were available + +2004-03-25 Ronald Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link), + (gst_alawdec_base_init), (gst_alawdec_class_init), + (gst_alawdec_init), (gst_alawdec_chain): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link), + (gst_alawenc_base_init), (gst_alawenc_class_init), + (gst_alawenc_init), (gst_alawenc_chain): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link), + (gst_mulawdec_base_init), (gst_mulawdec_class_init), + (gst_mulawdec_init), (gst_mulawdec_chain): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link), + (gst_mulawenc_base_init), (gst_mulawenc_class_init), + (gst_mulawenc_init), (gst_mulawenc_chain): + Fix capsnego in all four, remove the unused property functions and + simplify the chain functions slightly. I guess we could use macros + or something similar for those, since the code is so similar, but + I'm currently too lazy... + +2004-03-24 David Schleef + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms), + (gst_osselement_close_audio), (gst_osselement_probe_caps), + (gst_osselement_get_format_structure), + (gst_osselement_rate_probe_check), (gst_osselement_rate_add_range), + (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate), + (gst_osselement_rate_int_compare): Add code to handle rate probing + (bug #120883) + * sys/oss/gstosselement.h: same + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_getcaps): + Use rate probing provided by osselement. + * sys/oss/gstosssrc.c: (gst_osssrc_init), (gst_osssrc_getcaps): same + +2004-03-24 Ronald Bultje + + * ext/xvid/gstxvidenc.c: (gst_xvidenc_set_property), + (gst_xvidenc_get_property): + ulong/int mess-up. + +2004-03-24 David Schleef + + * ext/speex/gstspeexdec.c: (gst_speexdec_base_init), + (gst_speexdec_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), + (gst_speexenc_init): Create the pad template correctly (from + the static pad template, not a NULL pointer.) + +2004-03-25 Benjamin Otte + + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + add element that quasi-randomly changes bytes in the stream. + Intended use is robustness checking of demuxers and decoders in + media tests. + +2004-03-24 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_probe_hw_params): + * ext/alsa/gstalsa.h: + debugging output fixes + +2004-03-24 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_set_property): + don't g_return_if_fail if element is PLAYING, fail silently as every + other element. + * gst/effectv/gstquark.c: (gst_quarktv_chain): + only fix needed for cast lvalue issues in gst-plugins + * gst/volenv/gstvolenv.c: (gst_volenv_init): + add proxy_getcaps + +2004-03-24 Benjamin Otte + + * gst/level/gstlevel.c: (gst_level_init): + add proxying getcaps function, so level doesn't advertise impossible + caps + +2004-03-24 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse), + (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), + (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), + (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), + (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), + (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), + (qtdemux_parse_tree), (qtdemux_parse_trak): Fix debugging + messages. Divide the chunk size by the compression ratio + (needed for MACE audio) + +2004-03-23 Ronald Bultje + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Fix buffer overflow read error. + +2004-03-23 Ronald Bultje + + * ext/alsa/gstalsa.h: + Remove unused entry. + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Add cinepak. + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link), (gst_videodrop_chain): + Fix, sort of. Was horribly broken with new capsnego. Bah... + +2004-03-23 Jeremy Simon + + * gst/typefind/gsttypefindfunctions.c: (ape_type_find), + (plugin_init): + Add a monkeysaudio typefind function + +2004-03-23 Johan Dahlin + + * gst-libs/gst/play/play.c (gst_play_audio_fixate) + (gst_play_video_fixate): Check so the structure has the field + before trying to fixate them, this makes it possible to have + fakesinks for video and audio output without printing errors on + the output console. + +2004-03-22 David Schleef + + * sys/oss/Makefile.am: + * sys/oss/oss_probe.c: (main), (probe_check), (add_range), + (check_rate), (add_rate): Rate probing test app. + +2004-03-21 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (_fixate_caps_to_int), (gst_audio_convert_fixate): + add a fixation function that pretty much does the right thing (fixes + #137556) + +2004-03-20 David I. Lehn + + * configure.ac: GST_PACKAGE default: s/GStreamer/GStreamer Plugins/ + +2004-03-20 Tim-Phillip Müller + + reviewed by: Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + terminate gst_event_new_discontinuous correctly (fixes parts of + #137711) + +2004-03-19 David Schleef + + * gst-libs/gst/Makefile.am: Enable xoverlay unconditionally, + since it doesn't depend on X, and it's part of our ABI. + +2004-03-19 Iain + + * gst/interleave/deinterleave.c (deinterleave_sink_link): Use the + is_int in the structure, not the local variable. + +2004-03-19 David Schleef + + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_change_state), + (gst_rfbsrc_init), (gst_rfbsrc_getcaps), (gst_rfbsrc_fixate), + (gst_rfbsrc_link), (gst_rfbsrc_paint_rect), (gst_rfbsrc_get): + Improvements in caps negotiation. + +2004-03-18 Thomas Vander Stichele + + * po/LINGUAS: + * po/af.po: + adding Afrikaans (Petri Jooste) + +2004-03-18 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): + throw error instead of g_critical (#137588) + +2004-03-18 Thomas Vander Stichele + + * Makefile.am: + * configure.ac: + dist common and m4 correctly + * po/sv.po: + +2004-03-17 David Schleef + + * pkgconfig/gstreamer-media-info.pc.in: Add Version. + (bug #137348) + +2004-03-17 Thomas Vander Stichele + + * po/LINGUAS: + * po/sv.po: + adding Swedish translation (Christian Rose) + +2004-03-17 Thomas Vander Stichele + + * Makefile.am: use release.mak + +2004-03-16 Thomas Vander Stichele + + * common/ChangeLog: + * common/gst-autogen.sh: + add some explanation about the version detection + * configure.ac: + fix X check + +2004-03-16 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.8.0 === + +2004-03-16 Thomas Vander Stichele + + * configure.ac: release 0.8.0, "Pharmaceutical Itch" + +2004-03-16 Thomas Vander Stichele + + * configure.ac: + update libtool version + * gst-libs/gst/media-info/Makefile.am: + actually use libtool version + +2004-03-15 Thomas Vander Stichele + + * configure.ac: fix speex detection to work with 1.0 but not 1.1 + +2004-03-15 Thomas Vander Stichele + + * configure.ac: + * gst-plugins.spec.in: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-gconf-uninstalled.pc.in: + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-libs.pc.in: + * pkgconfig/gstreamer-media-info-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + * pkgconfig/gstreamer-plugins-uninstalled.pc.in: + * pkgconfig/gstreamer-plugins.pc.in: + remove @VERSION@ from some of the pc files since core and plugins + are decoupled. + created gstreamer-plugins.pc as it's a better name, but keeping + -libs around for now to get fixes upstream done first. + +2004-03-15 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_get_framerate), + (gst_play_get_sink_element): First draft of gst_play_get_framerate. + * gst-libs/gst/play/play.h: + +2004-03-15 Thomas Vander Stichele + + * *.c, *.cc: don't mix tabs and spaces + +2004-03-15 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): + use the new ffmpegcolorspace + * gst-plugins.spec.in: + package new colorspace and media-info + * configure.ac: + * pkgconfig/Makefile.am: + fix some more disting issues + * pkgconfig/gstreamer-media-info-uninstalled.pc.in: + * pkgconfig/gstreamer-media-info.pc.in: + generate media-info pc files + +2004-03-15 Johan Dahlin + + * *.h: Revert indenting + +2004-03-15 Thomas Vander Stichele + + * configure.ac: + adding ffmpegcolorspace element + * gst/ffmpegcolorspace/Makefile.am: + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/common.h: + * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): + * gst/ffmpegcolorspace/dsputil.h: + * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_pix_fmt_to_caps), + (gst_ffmpeg_caps_to_pix_fmt): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_caps_remove_format_info), + (gst_ffmpegcolorspace_getcaps), (gst_ffmpegcolorspace_pad_link), + (gst_ffmpegcolorspace_get_type), (gst_ffmpegcolorspace_base_init), + (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_init), + (gst_ffmpegcolorspace_chain), (gst_ffmpegcolorspace_change_state), + (gst_ffmpegcolorspace_set_property), + (gst_ffmpegcolorspace_get_property), + (gst_ffmpegcolorspace_register): + * gst/ffmpegcolorspace/imgconvert.c: + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), + (avpicture_get_size), (avcodec_get_pix_fmt_loss), + (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), + (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), + (yuv422_to_yuv420p), (yuv422_to_yuv422p), (yuv422p_to_yuv422), + (C_JPEG_TO_CCIR), (img_convert_init), (img_apply_table), + (shrink41), (shrink21), (shrink12), (shrink22), (shrink44), + (grow21_line), (grow41_line), (grow21), (grow22), (grow41), + (grow44), (conv411), (gif_clut_index), (build_rgb_palette), + (bitcopy_n), (mono_to_gray), (monowhite_to_gray), + (monoblack_to_gray), (gray_to_mono), (gray_to_monowhite), + (gray_to_monoblack), (avpicture_alloc), (avpicture_free), + (is_yuv_planar), (img_convert), (get_alpha_info_pal8), + (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace), (deinterlace_bottom_field), + (deinterlace_bottom_field_inplace), (avpicture_deinterlace): + * gst/ffmpegcolorspace/imgconvert_template.h: + * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): + * gst/ffmpegcolorspace/mmx.h: + * gst/ffmpegcolorspace/utils.c: (avcodec_init): + adding ffmpegcolorspace element supplied by Ronald after cleaning + up and pulling in the right bits of upstream source. + I'm sure a better C/compiler wizard could do some cleaning up (for + example use GLIB's malloc stuff), but as a first pass this + works very well + +2004-03-15 Thomas Vander Stichele + + * ext/alsa/gstalsa.h: + I assume Ronald forgot to commit the change to have cardname + as a struct member. Expect some public spanking at the next + opportunity. + +2004-03-15 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_property), + (gst_alsa_open_audio), (gst_alsa_close_audio): + * ext/alsa/gstalsa.c: + Don't open the device if we're a mixer (= padless). + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_class_init), + (gst_alsa_mixer_init), (gst_alsa_mixer_open), + (gst_alsa_mixer_close), (gst_alsa_mixer_change_state): + Open mixer during state change rather than during object + initialization. Also, get a device name. Currently in a somewhat + hackish fashion, but I didn't really find something better. + +2004-03-14 Thomas Vander Stichele + + * *.c, *.h: run gst-indent + +2004-03-14 Benjamin Otte + + * gst/modplug/gstmodplug.cc: + * gst/modplug/gstmodplug.h: + set correct timestamps on outgoing buffers + +2004-03-14 Benjamin Otte + + * gst/modplug/gstmodplug.cc: + handle events - don't do crap when a discont arrives that's not + necessary + This allows correct loading and playback of mods in Rhythmbox + +2004-03-14 Benjamin Otte + + * configure.ac: + * gst-libs/gst/gconf/Makefile.am: + * pkgconfig/Makefile.am: + move gstreamer-gconf pkgconfig files to pkgconfig/ dir. Make sure + they get rebuilt properly + * configure.ac: + when checking for vorbis, try pkgconfig first. + * gst/modplug/gstmodplug.cc: + add fixate function + +2004-03-14 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Fix for obvious mistake, where we first shift the offset and then + read a samplesize element assuming the old offset. Note that this + part still has something weird, i.e. my movies containing those + don't actually play well, but at least there's something that looks + like sound now. + +2004-03-14 Jan Schmidt + * gst/typefind/gsttypefindfunctions.c: (speex_type_find), + (plugin_init): + Add a typefind function for speex format + +2004-03-13 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps), + (gst_asf_demux_setup_pad): + Use 25fps as our "fake" fps value (marked for fixage in 0.9.x) + instead of 0. Reason is simple: some elements have a fps range + of 1-max instead of 0-max. So now ASF video actually works. + +2004-03-13 Thomas Vander Stichele + + * po/LINGUAS: + * po/sr.po: + adding serbian as a language + +2004-03-13 Benjamin Otte + + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + return taglist correctly from _get function, don't gst_pad_push it. + (fixes #137042) + +2004-03-13 Jan Schmidt + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + +2004-03-13 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_free_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_class_init), + (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Fix ancient leftovers... MixerTrack is a GObject. + +2004-03-13 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Don't block during probing... + +2004-03-12 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_type), (gst_alsa_class_init), + (gst_alsa_get_property), (gst_alsa_probe_get_properties), + (gst_alsa_class_probe_devices), (gst_alsa_class_list_devices), + (gst_alsa_probe_probe_property), (gst_alsa_probe_needs_probe), + (gst_alsa_probe_get_values), (gst_alsa_probe_interface_init), + (gst_alsa_open_audio), (gst_alsa_close_audio): + * ext/alsa/gstalsa.h: + Add propertyprobe interface implementation, add some device-name + property, all this so that it looks good in gnome-volume-control. + +2004-03-12 David Schleef + + * configure.ac: the Hermes library controls hermescolorspace, not + colorspace. + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), + (gst_mpeg2dec_init): minor pet peeve: disable code with #ifdef, + not /* */ + * ext/sdl/sdlvideosink.c: Change XID to unsigned long. + * ext/sdl/sdlvideosink.h: ditto. + * gst/colorspace/gstcolorspace.c: Fix old comments about Hermes + +2004-03-12 Benjamin Otte + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_set_xwindow_id), + (gst_x_overlay_got_xwindow_id): + * gst-libs/gst/xoverlay/xoverlay.h: + replace XID with unsigned long to get rid of the xlibs dependency in + XOverlay (fixes #137004) + +2004-03-13 Jan Schmidt + * gst/effectv/gstaging.c: (gst_agingtv_base_init), + (gst_agingtv_setup): + * gst/effectv/gstdice.c: (gst_dicetv_get_type), + (gst_dicetv_base_init), (gst_dicetv_class_init), + (gst_dicetv_setup), (gst_dicetv_init), (gst_dicetv_draw): + * gst/effectv/gstedge.c: (gst_edgetv_get_type), + (gst_edgetv_base_init), (gst_edgetv_class_init), (gst_edgetv_init), + (gst_edgetv_setup), (gst_edgetv_rgb32): + * gst/effectv/gsteffectv.c: + * gst/effectv/gstquark.c: (gst_quarktv_link), (gst_quarktv_init), + (gst_quarktv_set_property): + * gst/effectv/gstrev.c: (gst_revtv_get_type), + (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), + (gst_revtv_setup), (gst_revtv_rgb32): + * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type), + (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), + (gst_shagadelictv_init), (gst_shagadelictv_setup), + (gst_shagadelictv_rgb32): + * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type), + (gst_vertigotv_base_init), (gst_vertigotv_class_init), + (gst_vertigotv_setup), (gst_vertigotv_init), (gst_vertigotv_rgb32): + * gst/effectv/gstwarp.c: + Port everything that can be ported to videofilter and fix up the caps. + Can someone with a big-endian machine please check these? + +2004-03-10 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_get_time), + (gst_osssink_chain), (gst_osssink_change_state): + Latest fixes for A/V sync, audio playback and such. This is about + all... MPEG playback issues are mostly related to the async build- + up of MPEG files, I cannot fix that. Use basicgthread to solve it. + +2004-03-10 Thomas Vander Stichele + + patch from: Stephane Loeuillet + + * configure.ac: + use pkg-config for some libraries, falling back to the old .m4 way + (fixes #131270) + * m4/libdv.m4: + removed + +2004-03-10 Thomas Vander Stichele + + * configure.ac: + * tools/Makefile.am: + * tools/Makefile.in: + * tools/gst-launch-ext-m.m: + * tools/gst-launch-ext.1.in: + * tools/gst-visualise-m.m: + * tools/gst-visualise.1: + * tools/gst-visualise.1.in: + reorganizing generation of script tools + +2004-03-10 Ronald Bultje + + * ext/divx/gstdivxdec.c: + Downgrade priority. We prefer ffdec_mpeg4. + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), + (gst_faad_chain), (gst_faad_change_state): + Fix capsnego. Doesn't work for some sounds because we don't have + a 5:1 to stereo element. + * ext/xvid/gstxvid.c: (plugin_init): + Add priority. + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + Add discont handling. + +2004-03-09 Colin Walters + + * gst/audioconvert/gstaudioconvert.c: Fix typo in width 8 + conversion. + +2004-03-09 Benjamin Otte + + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): + the signals take 2 arguments + +2004-03-09 David Schleef + + * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad), + (gst_alsa_fixate): Add fixate function. (bug #136686) + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_init): + +2004-03-09 Benjamin Otte + + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), + (gst_mikmod_change_state): + * ext/mikmod/gstmikmod.h: + make mikmod's loop function not loop infinitely and call + gst_element_yield anymore + * gst/modplug/gstmodplug.cc: + fix pad negotiation (fixes #136590) + +2004-03-09 David Schleef + + * ext/lcs/Makefile.am: Fix so that the lcs colorspace plugin + doesn't conflict with the internal colorspace plugin. + * gst-libs/gst/audio/make_filter: Use `` instead of $() to + satisfy the crappy-ass shell shipped by a certain vendor. + * gst/videofilter/make_filter: same (bug #135299) + +2004-03-09 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.7.6 === + +2004-03-09 Thomas Vander Stichele + + * configure.in: releasing 0.7.6, "There" + +2004-03-09 Thomas Vander Stichele + + * pkgconfig/gstreamer-play-uninstalled.pc.in: + * pkgconfig/gstreamer-play.pc.in: + synchronize the two + +2004-03-09 Thomas Vander Stichele + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_base_init), + (cdparanoia_open), (cdparanoia_event): + fix/add error handling + * po/POTFILES.in: + add cdparanoia source + * tools/Makefile.am: + make scripts executable + +2004-03-09 Thomas Vander Stichele + + * configure.ac: + * ext/vorbis/Makefile.am: + * sys/Makefile.am: + remove id3types, vorbisfile and xvideosink from the build (#133783) + +2004-03-08 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + Fix metadata read crash (#136537). + +2004-03-08 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_read): + adding mime types, fixing the one-stop function + +2004-03-08 Christian Schaller + + * ext/nas/nassink.c and /ext/nas/nassink.h: + More NAS love from Arwed von Merkatz + So lets all sing 'Can you feel the NAS tonight' + +2004-03-08 Christian Schaller + + * tools/gst-launch-ext.in: + Replace vorbisfile with oggdemux/vorbisdec/audioconvert + +2004-03-08 Thomas Vander Stichele + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), + (gst_mpeg2dec_init): + remove the user_data pad for now, because it is being used in + fixating causing MPEG playback to fixate on 1000 Hz for playback. + If someone knows how to fix this properly, please do. + +2004-03-08 Thomas Vander Stichele + + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_get_time): + add a warning, IMO this won't get triggered anymore, remove later + +2004-03-07 David Schleef + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Added Cinepak + format (bug #136470) + +2004-03-07 Thomas Vander Stichele + + * gst-libs/Makefile.am: + * gst-libs/gst/media-info/Makefile.am: + * gst-libs/gst/media-info/media-info-priv.c: (found_tag_callback), + (error_callback), (gst_media_info_error_create), + (gst_media_info_error_element), (gmip_init), (gmip_reset), + (gmi_clear_decoder), (gmip_find_type_pre), (gmip_find_type): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (main): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), + (gst_media_info_class_init), (gst_media_info_instance_init), + (gst_media_info_set_source), (gst_media_info_read_with_idler), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + fixed, should work now + +2004-03-07 Christian Schaller + + * ext/nas/nassink.c: + A bunch of NAS fixes from Arwed von Merkatz + +2004-03-06 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Fix crash (j might be greater than n_samples, in which case we're + writing outside the allocated space for the array) and memleak. + +2004-03-06 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_chain): + And another caller that couldn't handle delay < 0 (unsigned + integer overflow). Video now continues playing on an audio + buffer underrun, and the clock continues working. Audio still + stalls. + +2004-03-06 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_get_time): + get_delay() may return values lower than 0. In those cases, we + should not actually cast to *unsigned* int64, that will break + stuff horribly. In my case, it screwed up A/V sync in movies + in totem rather badly. + +2004-03-06 Christophe Fergeau + + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/libpng/gstpngenc.c: (user_write_data): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): + Fix several misuse of gst_buffer_merge (it doesn't take ownership + of any buffer), should fix some leaks. I hope I didn't unref buffers + that shouldn't be... + +2004-03-06 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), + (deep_notify_callback), (tag_flag_score), (found_tag_callback), + (error_callback), (gmi_reset), (gmi_seek_to_track), + (gmi_get_decoder), (gmi_set_mime), (gmip_find_type_pre), + (gmip_find_type_post), (gmip_find_stream_post), + (gmip_find_track_streaminfo_post): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (print_tag), + (info_print), (main): + * gst-libs/gst/media-info/media-info.c: + (gst_media_info_error_create), (gst_media_info_error_element), + (gst_media_info_instance_init), (gst_media_info_get_property), + (gst_media_info_new), (gst_media_info_set_source), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + first pass at making this work again. This seems to work on + tagged ogg/vorbis and mp3 files. + +2004-03-06 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + fix huge leak: gst_buffer_merge doesn't unref the first argument + itself. + +2004-03-06 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_update_info): + report layer/mode/emphasis + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: (gst_mad_chain): fixed caps leak + +2004-03-06 Thomas Vander Stichele + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): + signal serial + +2004-03-06 Thomas Vander Stichele + + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (gst_vorbis_dec_init), (vorbis_dec_event): + add debug category + make vorbisdec handle _BYTE and _TIME queries + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: (gst_mad_chain): send the average bitrate read + from the xing header + +2004-03-06 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps), + (gst_audio_convert_link), (gst_audio_convert_change_state), + (gst_audio_convert_buffer_from_default_format): + do conversions from/to float correctly, fix some caps nego errors, + export correct supported caps in template and getcaps, use correct + caps in try_set_caps functions + +2004-03-06 Christophe Fergeau + + For some reason, I only committed a ChangeLog entry yesterday and + not the corresponding code... + * ext/mad/gstmad.c: Fix detection of Xing headers + * gst/tags/gstid3tag.c: Changes to support TLEN tags + +2004-03-06 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_get_pad_by_pad), + (gst_ogg_demux_src_query): + make sure to handle the case where there's no current chain + gracefully. + +2004-03-05 David Schleef + + * ext/aalib/gstaasink.c: (gst_aasink_fixate), (gst_aasink_init): + Add fixate function. (bug #131128) + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), + (gst_sdlvideosink_fixate): Add fixate function. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Fix attempt to print a non-pointer using GST_PTR_FORMAT. + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): + Fix missing break that was causing ulaw to be interpreted as + raw int. + +2004-03-05 David Schleef + + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): + Fix code that ignores return value of gst_buffer_merge(). + (bug #114560) + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_descramble_segment): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): same + * testsuite/gst-lint: Check for above. + +2004-03-05 David Schleef + + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Check for unfixed + caps and throw an element error. (bug #136334) + +2004-03-05 David Schleef + + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps), + (gst_faad_chain): Fix negotiation. + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add + key and button events. + * gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this + dung heap of code. + * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf + depends on gconf + * gst-libs/gst/gconf/gstreamer-gconf.pc.in: same + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate + function to encourage better negotiation, particularly between + audioconvert and osssink. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Make some debugging + more important. + * gst/typefind/gsttypefindfunctions.c: Fix mistake in flash + typefinding. + * gst/vbidec/vbiscreen.c: Add glib header + * pkgconfig/gstreamer-play.pc.in: Depends on gst-interfaces. + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: Fix detection of Xing headers + * gst/tags/gstid3tag.c: Changes to support TLEN tags + +2004-03-06 Thomas Vander Stichele + + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query): + debug updates + +2004-03-06 Christophe Fergeau + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + * ext/mad/gstmad.c: (gst_mad_init), (is_xhead), + (mpg123_parse_xing_header), (gst_mad_chain): parse Xing header in vbr + files, and report the parsed length as a GST_TAG_DURATION tag. + * gst/tags/gstid3tag.c: support TLEN (duration) tag + +2004-03-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_channels): + convert channels correctly. convert correctly to unsigned. + +2004-03-05 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state): Check if + we have a window before clearing it. + +2004-03-05 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): Check if we + have a window before clearing it. + +2004-03-05 Thomas Vander Stichele + + * gconf/gstreamer.schemas.in: + * gst-libs/gst/gconf/Makefile.am: + version installation path the same way as for 0.6 + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + remove comment that was fixed + +2004-03-05 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_formats), + (gst_qtdemux_src_convert), (gst_qtdemux_get_src_query_types), + (gst_qtdemux_get_event_mask), (gst_qtdemux_handle_src_query), + (gst_qtdemux_handle_src_event), (gst_qtdemux_add_stream): + Add prototype code for handling seeking and querying. + +2004-03-04 Ronald Bultje + + * examples/gstplay/player.c: (main): + Initialize variables to NULL. Prevents a segfault because the + (uninitialized) variable is not NULL, resulting in a crash on + trying to reach error->message. + +2004-03-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format): + make float=>int conversion work correctly even in cornercases. + +2004-03-04 David I. Lehn + + * debian/README.Debian: + * debian/build-deps: + * debian/changelog: + * debian/control: + * debian/control.in: + * debian/copyright: + * debian/gstreamer-a52dec.files: + * debian/gstreamer-aa.files: + * debian/gstreamer-alsa.files: + * debian/gstreamer-alsa.manpages: + * debian/gstreamer-arts.files: + * debian/gstreamer-artsd.files: + * debian/gstreamer-audiofile.files: + * debian/gstreamer-avifile.files: + * debian/gstreamer-cdparanoia.files: + * debian/gstreamer-colorspace.files: + * debian/gstreamer-doc.files: + * debian/gstreamer-dv.files: + * debian/gstreamer-dvd.files: + * debian/gstreamer-esd.files: + * debian/gstreamer-festival.files: + * debian/gstreamer-flac.files: + * debian/gstreamer-gconf.conffiles: + * debian/gstreamer-gconf.files: + * debian/gstreamer-gconf.postinst: + * debian/gstreamer-gnomevfs.files: + * debian/gstreamer-gsm.files: + * debian/gstreamer-http.files: + * debian/gstreamer-jack.files: + * debian/gstreamer-jpeg.files: + * debian/gstreamer-mad.files: + * debian/gstreamer-mikmod.files: + * debian/gstreamer-misc.files: + * debian/gstreamer-mpeg2dec.files: + * debian/gstreamer-oss.files: + * debian/gstreamer-plugin-apps.files: + * debian/gstreamer-plugin-apps.manpages: + * debian/gstreamer-plugin-libs-dev.files: + * debian/gstreamer-plugin-libs.files: + * debian/gstreamer-plugin-template.postinst: + * debian/gstreamer-plugin-template.postrm: + * debian/gstreamer-sdl.files: + * debian/gstreamer-sid.files: + * debian/gstreamer-vorbis.files: + * debian/gstreamer-x.files: + * debian/mk.control: + * debian/rules: + Debian package info not maintained here. + +2004-03-04 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_class_init): + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init): + * ext/divx/gstdivxenc.c: (gst_divxenc_class_init): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init): + * ext/gsm/gstgsmenc.c: (gst_gsmenc_class_init): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init): + * gst-libs/gst/colorbalance/colorbalance.c: + (gst_color_balance_class_init): + * gst-libs/gst/colorbalance/colorbalancechannel.c: + (gst_color_balance_channel_class_init): + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): + * gst-libs/gst/play/play.c: (gst_play_class_init): + * gst-libs/gst/propertyprobe/propertyprobe.c: + (gst_property_probe_iface_init): + * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init): + * gst-libs/gst/tuner/tunerchannel.c: + (gst_tuner_channel_class_init): + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init): + * gst/cutter/gstcutter.c: (gst_cutter_class_init): + * gst/effectv/gstvertigo.c: (gst_vertigotv_class_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): + fix signals to use - instead of _ + * ext/libcaca/gstcacasink.h: + * ext/sdl/sdlvideosink.h: + fix header rename + +2004-03-04 David Schleef + + * testsuite/gst-lint: Add a check for bad signal names. + +2004-03-04 + + reviewed by David Schleef + + * gst/videofilter/gstgamma.c: (gst_gamma_rgb32): Fix typo that + modified the alpha channel and caused a warning. (bug #136192) + +2004-04-03 Christian Schaller + + * gst-plugins.spec.in: + Change names of plugins to actually be correct. Try to keep things + alphabetical to avoid getting beat up by Thomas + +2004-03-03 Julien MOUTTE + + * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_default_video_sink): + Using ximagesink as a default if no gconf key found. We should + probably consider using alsasink instead of osssink for the audio + part. + +2004-03-02 Thomas Vander Stichele + + * configure.ac: + fix --with-plugins, don't think it ever worked before + * gst-plugins.spec.in: + even more updates + +2004-03-01 Ronald Bultje + + * ext/sdl/sdlvideosink.h: + * sys/ximage/ximagesink.h: + * sys/xvideo/xvideosink.h: + * sys/xvimage/xvimagesink.h: + Fix for move of gstvideosink.h -> videosink.h. + +2004-03-02 Thomas Vander Stichele + + * gst-libs/gst/xwindowlistener/Makefile.am: + this is a plugin library, not a library + +2004-03-01 David Schleef + + * AUTHORS: Added some names. Add yourself if you're still + missing. + +2004-03-01 David Schleef + + * MAINTAINERS: Add + +2004-03-01 Thomas Vander Stichele + + * gst-plugins.spec.in: clean up spec file + +2004-03-01 Thomas Vander Stichele + + * gst-libs/gst/video/Makefile.am: + * gst-libs/gst/video/gstvideosink.c: + * gst-libs/gst/video/gstvideosink.h: + rename gstvideosink.h to videosink.h to match other headers + * gst/mixmatrix/Makefile.am: + fix plugin filename + * gst/tags/Makefile.am: fix plugin filename + +2004-03-01 Thomas Vander Stichele + + * gst/tags/Makefile.am: fix plugin filename + +2004-03-01 Thomas Vander Stichele + + * examples/gstplay/player.c: (got_time_tick), (main): + add error handler + display time_tick more readably + * gst/mixmatrix/Makefile.am: + fix plugin file name + +2004-02-29 Christophe Fergeau + + * sys/oss/gstosselement.c: (gst_osselement_probe), + (device_combination_append), (gst_osselement_class_probe_devices): + * sys/oss/gstosselement.h: + Reworked enumeration of oss dsps and mixers so that gst-mixer works + on my system using alsa oss emulation, fixes bug #135597 + +2004-02-29 Ronald Bultje + + * gst/videodrop/gstvideodrop.c: (gst_videodrop_init), + (gst_videodrop_chain), (gst_videodrop_change_state): + * gst/videodrop/gstvideodrop.h: + Work based on timestamp of input data, not based on the expected + framerate from the input. The consequence is that this element now + not only scales framerates, but also functions as a framerate + corrector or framerate stabilizer/constantizer. + +2004-02-27 David Schleef + + patches from jmmv@menta.net (Julio M. Merino Vidal) + + * gst/interleave/deinterleave.c: (deinterleave_chain): Fix + GST_ELEMENT_ERROR call (bug #135634) + * gst/interleave/interleave.c: (interleave_buffered_loop), + (interleave_bytestream_loop): Don't use alloca() (bug #135640) + * sys/cdrom/gstcdplayer_ioctl_bsd.h: Fix ioctls on NetBSD (bug #135645) + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_chain): Fix ioctls on NetBSD. (bug #135644) + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_sync_next_frame), + (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), + (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_requeue_frame): + Fix GST_ELEMENT_ERROR call. + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_palette): Fix + GST_ELEMENT_ERROR call. + +2004-02-27 Benjamin Otte + + * gst-libs/gst/audio/audio.h: + add macro to make sure header isn't included twice + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + don't use gst_buffer_free + * gst/playondemand/filter.func: + don't use gst_data_free. Free data only once. + +2004-02-26 David Schleef + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + * gst/level/Makefile.am: -marshal.[ch] and -enum.[ch] files + should not be disted, -marshal.h files should not be installed, + and -enum.h files _should_ be installed. Fix to make this the + case. + +=== release 0.7.5 === + +2004-02-26 Thomas Vander Stichele + + * configure.ac: release 0.7.5, "Under The Sea" + +2004-02-25 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (gst_audio_convert_change_state), (gst_audio_convert_get_buffer): + * gst/videoscale/gstvideoscale.c: + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + assorted debug/warning fixes + +2004-02-25 Thomas Vander Stichele + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), + (gst_videoscale_init), (gst_videoscale_chain), + (gst_videoscale_set_property), (plugin_init): + * gst/videoscale/gstvideoscale.h: + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_scale_rgb), (gst_videoscale_planar411), + (gst_videoscale_planar400), (gst_videoscale_packed422), + (gst_videoscale_packed422rev), (gst_videoscale_32bit), + (gst_videoscale_24bit), (gst_videoscale_16bit), + (gst_videoscale_bilinear), (gst_videoscale_bicubic), + (gst_videoscale_scale_plane_slow), + (gst_videoscale_scale_point_sample), + (gst_videoscale_scale_nearest), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + add debugging category and use it properly + fix use of GST_PTR_FORMAT + +2004-02-25 Andy Wingo + + * gst/interleave/interleave.c (interleave_buffered_loop): Always + push only when channel->buffer is NULL. Prevents segfaults doing + the state change after a nonlocal exit, like a scheme exception. + + * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_getcaps): + Handle the case where the intersected caps is empty. + +2004-02-25 Thomas Vander Stichele + + * gst/law/mulaw-decode.c: (mulawdec_link): + * gst/law/mulaw.c: (plugin_init): + fix mulawdec so it actually works again + +2004-02-24 Arwed v. Merkatz + + reviewed by: David Schleef + + * gst/videofilter/gstgamma.c: (gst_gamma_class_init), + (gst_gamma_init), (gst_gamma_set_property), + (gst_gamma_get_property), (gst_gamma_calculate_tables), + (gst_gamma_rgb24), (gst_gamma_rgb32): Adds gamma correction + for RGB, with separate r g and b correction factors. (#131167) + +2004-02-24 Thomas Vander Stichele + + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + only signal tags for bitrate if they're > 0 (#134894) + +2004-02-24 David Schleef + + * gst/qtdemux/qtdemux.c: (plugin_init), (gst_qtdemux_loop_header), + (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), + (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), + (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), + (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), + (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), + (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), + (qtdemux_dump_cmvd), (qtdemux_parse_tree), (qtdemux_parse_trak): + Cleanups. Convert g_prints to GST_LOGs. Add qtdemux debug + category. Attempt to fix timestamp calculation. + +2004-02-24 Johan Dahlin + + * gst-libs/gst/gconf/gconf.c: Add \n to g_print error messages + +2004-02-23 Thomas Vander Stichele + + * configure.ac: + * gconf/Makefile.am: + * gconf/gstreamer.schemas: + * gst-libs/gst/gconf/Makefile.am: + * gst-libs/gst/gconf/gconf.c: + version gconf schemas and install locations + +2004-02-23 Benjamin Otte + + * ext/xine/xineinput.c: (gst_xine_input_dispose): + (gst_xine_input_subclass_init): + call parent dispose. + change pad template for CD reader correctly + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: (plugin_init): + * ext/xine/xineaudiosink.c: + wrap audio sinks, too + * gst-libs/gst/resample/private.h: + * gst-libs/gst/resample/resample.c: (gst_resample_init), + (gst_resample_reinit), (gst_resample_scale), + (gst_resample_nearest_s16), (gst_resample_bilinear_s16), + (gst_resample_sinc_slow_s16), (gst_resample_sinc_s16), + (gst_resample_sinc_ft_s16), (gst_resample_nearest_float), + (gst_resample_bilinear_float), (gst_resample_sinc_slow_float), + (gst_resample_sinc_float), (gst_resample_sinc_ft_float): + * gst-libs/gst/resample/resample.h: + * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), + (gst_audioscale_class_init), (gst_audioscale_link), + (gst_audioscale_get_buffer), (gst_audioscale_init), + (gst_audioscale_chain), (gst_audioscale_set_property), + (gst_audioscale_get_property): + * gst/audioscale/gstaudioscale.h: + s/resample_*/gst_resample_*/i to not clobber namespaces + +2004-02-23 Julien MOUTTE + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), + (gst_riff_create_audio_caps), (gst_riff_create_iavs_caps), + (gst_riff_create_video_template_caps), + (gst_riff_create_audio_template_caps), + (gst_riff_create_iavs_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), + (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): First batch implementing audio and + video codec tags in demuxers. + +2004-02-22 Benjamin Otte + + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: (plugin_init): + * ext/xine/xineinput.c: + add input plugin wrapper. Playback from files, http, mms and cdda + works. + * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): + remove leftover G_GNUC_UNUSED + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_stream), + (gst_asf_demux_identify_guid): + improve debugging output + +2004-02-22 Benjamin Otte + + reported by: Padraig O'Briain + + * autogen.sh: + replace test -e with test -x for mkinstalldirs to be more portable. + (fixes #134816) + +2004-02-22 Benjamin Otte + + reported by: Stefan Kost + + * gst/audioconvert/gstaudioconvert.c: (plugin_init): + set rank to PRIMARY + * gst/volume/gstvolume.c: (plugin_init): + set rank to NONE + fixes #134960 + +2004-02-22 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + escape NULL strings in GST_ELEMENT_ERROR properly (fixes #135116) + +2004-02-22 Benjamin Otte + + * configure.ac: + export [_]*{gst,Gst,GST}.* symbols from plugins + +2004-02-22 Christophe Fergeau + + reviewed by: Benjamin Otte + + * ext/lame/gstlame.c: (add_one_tag): + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value), + (gst_vorbisenc_metadata_set1): + * gst/tags/gstid3tag.c: + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): + apply fixes from bugs #135042 (lame can't write tags) and #133817 + (add GST_ALBUM_VOLUME_{COUNT,NUMBER} tags) + +2004-02-22 Ramon Garcia + + * configure.ac: Export only gst_plugin_desc from plugins. + Note that this change only makes any effect with Linux using libtool + 1.5.2 or higher. Otherwise it is silently ignored, but it would build + fine. And don't try to have several versions of libtool in different + directories. + +2004-02-20 Andy Wingo + + * gst/intfloat/, gst/oneton: Removed, replaced by audioconvert and + interleave respectively. + + * gst/interleave/deinterleave.c: New plugin: deinterleave + (replaces on oneton). + * gst/interleave/interleave.c: New plugin: interleave. + * gst/interleave/plugin.h: Support file. + * gst/interleave/plugin.c: Support file. + + * configure.ac: Remove intfloat and oneton, add interleave. + + * ext/sndfile/gstsf.c: Handle events better. + + * gst/audioconvert/gstaudioconvert.c: Change to support int2float + and float2int operation. int2float has scheduling problems as + noted in in2float_chain. + +2004-02-20 Benjamin Otte + + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: + * ext/xine/xineaudiodec.c: + * ext/xine/xinecaps.c: + add first version of xine plugin wrapper. Currently only wraps the + QDM2 win32 DLL, and even that only in proof-of-concept quality. + * configure.ac: + * ext/Makefile.am: + add xine plugin wrapper, disabled by default. Use --enable-xine to + build. Note that it'll segfault on gst-register if you don't remove + the goom and tvtime post plugins from xine. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps): + add extradata parsing for QDM2. + change around debugging prints. + +2004-02-19 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + use gst_tag_list_insert when you want to insert tags + +2004-02-18 David Schleef + + * configure.ac: Move massink to gst-rotten + * ext/Makefile.am: + * ext/mas/Makefile.am: + * ext/mas/massink.c: + * ext/mas/massink.h: + +2004-02-18 David Schleef + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): Disable gdk_pixbuf + typefinding, since it seems to be worse than nothing. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add ftyp + atom to recognize .mp4 and .m4a files as video/quicktime. + +2004-02-18 David Schleef + + * gst/sine/demo-dparams.c: (quit_live), + (dynparm_log_value_changed), (dynparm_value_changed), (main): + Use double dparams, not float. + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_init): Change sync default to FALSE, since multiple + sync'd elements don't really work correctly. + * gst/volume/gstvolume.c: (volume_class_init), (volume_init), + (volume_update_volume), (volume_get_property): Change dparam + to double. + +2004-02-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: + (gst_ximagesink_xwindow_update_geometry), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), + (gst_ximagesink_change_state), (gst_ximagesink_expose), + (gst_ximagesink_init): Rework the way software video scaling works. So + now we check on each chain call if the video frames are feeling the + window. If not we try to renegotiate caps. On failure we memorize that + and we won't try again for that PLAYING sessions. + * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego + failure. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the + synchronous flag. + +2004-02-18 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): + break up _link so we can give a better debug message for errors + +2004-02-18 Thomas Vander Stichele + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + set up debug category + +2004-02-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents), (gst_ximagesink_expose): Reorganizing + the way renegotiation work. The event handling function is not taking + care of external windows and renegotiate method check for pad flags + NEGOTIATING. Should fix : #133209 + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_expose): Checking if the + pad is negotiating before trying renegotiation. + +2004-02-17 Thomas Vander Stichele + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): + pass on all possible mime types as typefind hints + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a + possible SHM leak if we crash. All other apps using XShm are doing + that. + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_expose): Renegotiate size on expose. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window + size on expose. + +2004-02-16 Benjamin Otte + + * testsuite/alsa/sinesrc.c: + cosmetic fix to fix compile issue with gcc 2.95.4 + +2004-02-16 Julien MOUTTE + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_timestamp_to_bytes): Alsa should trigger an error if it + failed opening the audio device. + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), + (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), + (gst_ximagesink_xwindow_resize), (gst_ximagesink_xwindow_clear), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), + (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear), + (gst_ximagesink_change_state), (gst_ximagesink_chain), + (gst_ximagesink_set_xwindow_id): Clearing window in READY TO PAUSED. + Removing some useless g_return_if_fail like wingo suggested. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_xwindow_clear), + (gst_xvimagesink_update_colorbalance), + (gst_xvimagesink_handle_xevents), (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_get_fourcc_from_caps), + (gst_xvimagesink_change_state), (gst_xvimagesink_chain), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_colorbalance_list_channels), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value): Clearing window in READY TO + PAUSED. Removing some useless g_return_if_fail like wingo suggested. + +2004-02-16 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): + throw error when not negotiated instead of asserting + +2004-02-15 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_loop): More fixes for + correct data refcounting. + +2004-02-15 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_change_state), + (gst_switch_class_init): Cleaning the sinkpads correctly on state + change, mostly the EOS flag. + +2004-02-15 Julien MOUTTE + + * examples/gstplay/player.c: (got_eos), (main): Adding some + output for debugging. + * gst-libs/gst/play/play.c: (gst_play_state_change): Stop our + timeouts if we go to any state different from PLAYING. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Fix some + more EOS bugs in riff lib. + +2004-02-14 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_connect_visualization): Disable + visualization until i find a way to fix switch correctly. + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix a bug when + EOS arrives. + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), + (gst_switch_loop), (gst_switch_dispose), (gst_switch_class_init): + Reworked switch to get a more correct behaviour with events and refing + of data stored in sinkpads. + * gst/switch/gstswitch.h: Adding an eos flag for every sinkpad so that + we don't pull from a pad in EOS. + +2004-02-14 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + remove v1 tag even if we can't read it (makes sure we don't detect + it again) + +2004-02-14 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + try xrun recovery when wait failed. Make xrun recovery function + return TRUE/FALSE to indicate success. (might fix #134354) + +2004-02-13 David Schleef + + * gst/sine/demo-dparams.c: (dynparm_log_value_changed), + (dynparm_value_changed), (main): Convert from float to double. + * gst/sine/gstsinesrc.c: (gst_sinesrc_init): same. + +2004-02-13 David Schleef + + * gst/silence/gstsilence.c: (gst_silence_class_init), + (gst_silence_set_clock), (gst_silence_get), + (gst_silence_set_property), (gst_silence_get_property): + * gst/silence/gstsilence.h: Add sync property. + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_init), (gst_sinesrc_set_clock), (gst_sinesrc_get), + (gst_sinesrc_set_property), (gst_sinesrc_get_property): + * gst/sine/gstsinesrc.h: Add sync property. + +2004-02-13 David Schleef + + * gst/intfloat/gstint2float.c: (conv_f32_s16), + (gst_int2float_chain_gint16): Change stdint usage to glib types. + +2004-02-13 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + * gst-libs/ext/Makefile.am: + move ffmpeg plugin to gst-ffmpeg module + +2004-02-13 Thomas Vander Stichele + + * configure.ac: use GST_ARCH to detect architecture + +2004-02-12 Julien MOUTTE + + * gst/vbidec/vbiscreen.c: Fixing thomasvs fixes. Missing header. + +2004-02-12 Thomas Vander Stichele + + * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): + classify LADSPA plugins based on number of src/sink pads + (#133663, Stefan Kost) + * gst/sine/gstsinesrc.c: (gst_sinesrc_init): + fix dparams registration + (#133528, Stefan Kost) + * gst/vbidec/vbiscreen.c: (vbiscreen_set_current_cell): + fix use of isprint and use g_ascii_isprint instead + (#133316, Stefan Kost) + +2004-02-11 David Schleef + + Convert a few inner loops to use liboil. This is currently + optional, and is only enabled if liboil is present (duh!). + * configure.ac: Check for liboil-0.1 + * gst/intfloat/Makefile.am: + * gst/intfloat/gstint2float.c: (conv_f32_s16), (scalarmult_f32), + (gst_int2float_chain_gint16): + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init), + (tablelookup_u8), (gst_videobalance_planar411): + * gst/videotestsrc/Makefile.am: + * gst/videotestsrc/gstvideotestsrc.c: (plugin_init): + * gst/videotestsrc/videotestsrc.c: (splat_u8), (paint_hline_YUY2), + (paint_hline_IYU2), (paint_hline_str4), (paint_hline_str3), + (paint_hline_RGB565), (paint_hline_xRGB1555): + +2004-02-11 David Schleef + + * ext/lcs/gstcolorspace.c: (colorspace_find_lcs_format), + (gst_colorspace_caps_get_fourcc), (colorspace_setup_converter), + (gst_colorspace_getcaps), (gst_colorspace_link), + (gst_colorspace_base_init), (gst_colorspace_init), + (gst_colorspace_chain), (gst_colorspace_change_state), + (plugin_init): Merge Ronald's patch (bug #117897) and update + for new caps and negotiation. Seems to work, although it + shows off bugs in lcs. + +2004-02-11 David Schleef + + * ext/alsa/Makefile.am: Fix linking against libgstinterfaces. + (bug #133886) Noticed by bugs@leroutier.net (Stephane LOEUILLET) + +2004-02-11 David Schleef + + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init), + (gst_rfbsrc_change_state), (gst_rfbsrc_init), + (gst_rfbsrc_set_property), (gst_rfbsrc_get_property): + Add server and port properties + +2004-02-11 Thomas Vander Stichele + + * m4/a52.m4: + * m4/aalib.m4: + * m4/as-ffmpeg.m4: + * m4/as-liblame.m4: + * m4/as-slurp-ffmpeg.m4: + * m4/check-libheader.m4: + * m4/esd.m4: + * m4/freetype2.m4: + * m4/gconf-2.m4: + * m4/glib.m4: + * m4/gst-alsa.m4: + * m4/gst-artsc.m4: + * m4/gst-ivorbis.m4: + * m4/gst-matroska.m4: + * m4/gst-sdl.m4: + * m4/gst-shout2.m4: + * m4/gst-sid.m4: + * m4/gtk.m4: + * m4/libdv.m4: + * m4/libfame.m4: + * m4/libmikmod.m4: + * m4/ogg.m4: + * m4/vorbis.m4: + fix underquotedness of macros (#133800) + * m4/as-avifile.m4: + * m4/xmms.m4: + removed because no longer used + +2004-02-11 Thomas Vander Stichele + + * configure.ac: + require gettext 0.11.5 so ulonglong.m4 gets checked out and copied + by autopoint (fixes #132996) + +2004-02-11 Benjamin Otte + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_base_init): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_base_init): + fix memleaks + +2004-02-11 David Schleef + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_chain): Fix logic bug causing spurious errors. + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_base_init), + (gst_jpegdec_init), (gst_jpegdec_chain): Fix negotiation. + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_base_init), + (gst_jpegenc_class_init), (gst_jpegenc_init), + (gst_jpegenc_getcaps), (gst_jpegenc_link), (gst_jpegenc_resync), + (gst_jpegenc_chain), (gst_jpegenc_set_property), + (gst_jpegenc_get_property): Fix negotiation. Add some properties. + * ext/jpeg/gstjpegenc.h: Fix negotiation. + +2004-02-10 Benjamin Otte + + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), + (gst_mikmod_srcfixate), (gst_mikmod_srclink), (gst_mikmod_loop): + * ext/mikmod/gstmikmod.h: + fix caps negotiation in mikmod + * ext/ogg/gstoggdemux.c: (gst_ogg_print): + output debug information + +2004-02-08 Benjamin Otte + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/navigation/Makefile.am: + * gst-libs/gst/xoverlay/Makefile.am: + remove unused GST_OPT_CFLAGS from Makefiles + include X_CFLAGS and X_LIBS in xoverlay. (#131948) + +2004-02-07 David Schleef + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_handle_event): Don't + push events to pads that haven't been created (#133508) + +2004-02-07 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_sink_convert), (gst_dvdec_handle_sink_event), + (gst_dvdec_video_getcaps), (gst_dvdec_video_link), + (gst_dvdec_loop), (gst_dvdec_change_state): + Second attempt at committing a working dvdec element. + +2004-02-06 David Schleef + + Build fixes for OS X: (see #129600) + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strh), + (gst_riff_read_strf_vids), (gst_riff_read_strf_auds), + (gst_riff_read_strf_iavs): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml): + * gst/playondemand/Makefile.am: + * gst/rtp/rtp-packet.c: + +2004-02-05 David Schleef + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_loop): Revert + last change, because it Just Doesn't Compile. + +2004-02-05 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + skip undecodable id3v2 tag instead of keeping it + +2004-02-05 David Schleef + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Unref leaked buffer. (Noticed by Ronald) + +2004-02-05 David I. Lehn + + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + Sync requires with other checks. >= vs =. + +2004-02-06 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_loop): + * ext/dv/gstdvdec.h: + rework the caps negotiation so that dvdec works again instead + of just segfaulting. + +=== release 0.7.4 === + +2004-02-06 Thomas Vander Stichele + + * NEWS: GStreamer Plugins 0.7.4 "For Great Justice" released + * configure.ac: changed for release + +2004-02-05 Thomas Vander Stichele + + * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + reworked patch by David Lehn to fix libdir and includedir for + uninstalled libraries + removed play and gconf from gstreamer-libs since they have their + own pkgconfig files + +2004-02-04 David Schleef + + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): Fix a caps + memleak. + +2004-02-05 Benjamin Otte + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + use correct GST_TAG_ENCODER tag + +2004-02-05 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + be sure to stop the clock when going to paused + * sys/oss/gstosssink.c: (gst_osssink_change_state): + reset number of transmitted when going to ready. + fixes #132935 + +2004-02-05 Charles Schmidt + + reviewed by Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + extract track count (fixes #133410) + +2004-02-04 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): + that should be !=, not == (fixes #132519) + +2004-02-04 David Schleef + + Make sure set_explicit_caps() is called before adding pad. + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + +2004-02-04 Thomas Vander Stichele + + * configure.ac: + bump nano to 2, first prerelease + put back AM_PROG_LIBTOOL + +2004-02-04 Thomas Vander Stichele + + * testsuite/alsa/Makefile.am: + these are user test apps, not automatic testsuite tests + +2004-02-04 David Schleef + + Convert GST_DEBUG_CAPS() to GST_DEBUG(): + * gst/mpeg1videoparse/gstmp1videoparse.c: + (mp1videoparse_parse_seq): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + * sys/xvideo/gstxwindow.c: (_gst_xwindow_new): + * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), + (gst_xvideosink_getcaps): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + * testsuite/gst-lint: more tests + +2004-02-04 David Schleef + + Replace use of GST_PAD_FORMATS_FUNCTION() and similar macros + with the code that they would expand to. + * ext/flac/gstflacdec.c: (gst_flacdec_get_src_formats), + (gst_flacdec_get_src_query_types), + (gst_flacdec_get_src_event_masks): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_formats), + (gst_gnomevfssrc_get_query_types), + (gst_gnomevfssrc_get_event_mask): + +2004-02-04 Benjamin Otte + + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_dispose): + fix memleak by properly disposing sinesrc + +2004-02-04 Julien MOUTTE + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose): + * gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell + an overlay to redraw the image because it has been exposed. + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy), + (gst_ximagesink_ximage_put), (gst_ximagesink_expose), + (gst_ximagesink_xoverlay_init), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: Implement expose method from XOverlay + interface + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose), + (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: Implement expose method from XOverlay + interface + +2004-02-03 Benjamin Otte + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): + more memleak fixage + +2004-02-03 Benjamin Otte + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * gst/typefind/gsttypefindfunctions.c: + fix memleaks shown by gst-typefind + +2004-02-03 Thomas Vander Stichele + + * common/glib-gen.mak: + add hack rule to touch .Plo files + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + remove glib_root variable + +2004-02-03 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): + set explicit caps before adding the element, so the autopluggers can + plug correctly. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (mpeg2_sys_type_find), (mpeg1_sys_type_find), + (mpeg_video_type_find), (mpeg_video_stream_type_find), + (dv_type_find): + fix memleaks in typefind functions. gst_type_find_suggest takes a const + argument. + +2004-02-03 Thomas Vander Stichele + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/colorbalance/colorbalance-marshal.list: + * gst-libs/gst/colorbalance/colorbalance.c: + * gst-libs/gst/colorbalance/colorbalance.h: + * gst-libs/gst/colorbalance/colorbalancemarshal.list: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer-marshal.list: + * gst-libs/gst/mixer/mixer.c: + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/mixer/mixermarshal.list: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/play.h: + * gst-libs/gst/tuner/Makefile.am: + * gst-libs/gst/tuner/tuner-marshal.list: + * gst-libs/gst/tuner/tuner.c: + * gst-libs/gst/tuner/tuner.h: + * gst-libs/gst/tuner/tunermarshal.list: + use new glib-gen.mak snippet to clean up Makefile.am + fix various bugs in Makefile.am's + +2004-02-03 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): + handle chain parsing correctly in the multichain case + * ext/theora/theoradec.c: (gst_theora_dec_init), (_theora_ilog), + (theora_dec_from_granulepos), (theora_dec_to_granulepos), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + handle events and queries correctly + +2004-02-03 David I. Lehn + + * .cvsignore: + Ignore generated file _stdint.h. + +2004-02-03 David I. Lehn + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/colorbalance/colorbalance.h: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/play.h: + * gst-libs/gst/tuner/Makefile.am: + * gst-libs/gst/tuner/tuner.h: + Generate enum type code with glib-mkenums. + * gst-libs/gst/colorbalance/.cvsignore: + * gst-libs/gst/mixer/.cvsignore: + * gst-libs/gst/play/.cvsignore: + * gst-libs/gst/tuner/.cvsignore: + Ignore generated files. + +2004-02-03 David I. Lehn + + * gst-libs/gst/audio/.cvsignore: + Ignore generated file. + * gst-libs/gst/audio/Makefile.am: + Do not install example filter. + +2004-02-03 David I. Lehn + + * examples/switch/.cvsignore: + Ignore generated file. + +2004-02-03 Benjamin Otte + + * common/m4/ax_create_stdint_h.m4: + * configure.ac: + add AX_CREATE_STDINT_H to get correct type definitions for a52dec in + _stdint.h. + * Makefile.am: + remove generated _stdint.h in DISTCLEANFILES + * ext/a52dec/gsta52dec.c: + include _stdint.h for a52dec. (should fix #133064) + +2004-02-02 Jeremy Simon + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add), + (gst_tag_to_vorbis_comments): + Add replaygain support to vorbistag + +2004-02-02 Jeremy Simon + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_to_extradata): + Fix SVQ3 caps flag properties + Use glib macro for bytes swap + +2004-02-02 Thomas Vander Stichele + + * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/sndfile/gstsf.c: (plugin_init): + * gst/avi/gstavi.c: (plugin_init): + * sys/dxr3/dxr3init.c: (plugin_init): + * sys/oss/gstossaudio.c: (plugin_init): + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l2/gstv4l2.c: (plugin_init): + remove textdomain calls + * po/nl.po: + update Dutch translation + +2004-02-02 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_set_audio_sink): Moving volume in the audio thread for + instantaneous volume change. Maybe i will add another volume in front + of visualization later, not sure yet though. + +2004-02-02 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents): Better X events handling, only take + the latest events for configure and motion. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. + +2004-02-02 Jon Trowbridge + + reviewed by: David Schleef + + Fix memory leaks: + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register): + +2004-02-02 David Schleef + + code cleanup. Change bzero() to memset(). Remove duplicate ; at ends + of lines. + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_event): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/xvid/gstxviddec.c: (gst_xviddec_src_link): + * gst-libs/gst/play/play.c: (gst_play_get_sink_element): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): + * gst/effectv/gstedge.c: (gst_edgetv_sinkconnect): + * gst/effectv/gstvertigo.c: (gst_vertigotv_sinkconnect): + * gst/intfloat/float22int.c: (gst_float2_2_int_getcaps), + (gst_float2_2_int_link): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): + * gst/rtjpeg/RTjpeg.c: (RTjpeg_init_mcompress): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_init_send): + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_init_receive): + * gst/udp/gstudpsink.c: (gst_udpsink_init_send): + * gst/udp/gstudpsrc.c: (gst_udpsrc_init_receive): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_init): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): + * testsuite/gst-lint: Add tests for bzero and ;; + +2004-02-02 David Schleef + + * gst/debug/efence.c: Add fallback if MAP_ANONYMOUS isn't defined. + +2004-02-02 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_open): + * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file): + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): + * ext/esd/esdmon.c: (gst_esdmon_get): + * ext/esd/esdsink.c: (gst_esdsink_chain), (gst_esdsink_open_audio): + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/faad/gstfaad.c: (gst_faad_chain): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), + (gst_flacdec_loop): + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), + (gst_gnomevfssrc_open_file): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): + * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_do_typefind), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), + (gst_ogg_demux_push): + * ext/raw1394/gstdv1394src.c: + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), + (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): + * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), + (gst_sf_loop): + * ext/speex/gstspeexenc.c: (gst_speexenc_chain): + * ext/swfdec/gstswfdec.c: (gst_swfdec_loop): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): + * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): + * gst/adder/gstadder.c: (gst_adder_loop): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), + (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + * gst/avi/gstavimux.c: (gst_avimux_stop_file): + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/intfloat/float22int.c: (gst_float2_2_int_chain): + * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): + * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_header): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_blockgroup): + * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + * gst/oneton/gstoneton.c: (gst_oneton_chain): + * gst/silence/gstsilence.c: (gst_silence_get): + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/smpte/gstsmpte.c: (gst_smpte_loop): + * gst/speed/gstspeed.c: (speed_loop): + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * gst/volenv/gstvolenv.c: (gst_volenv_chain): + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), + (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), + (dxr3audiosink_close): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), + (dxr3videosink_close), (dxr3videosink_write_data): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/oss/gstosssink.c: (gst_osssink_chain): + * sys/oss/gstosssrc.c: (gst_osssrc_get): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), + (gst_v4l_set_window), (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), + (gst_v4l_set_chan_norm), (gst_v4l_get_signal), + (gst_v4l_get_frequency), (gst_v4l_set_frequency), + (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), + (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): + * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), + (gst_v4l2_set_window), (gst_v4l2_enable_overlay): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), + (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), + (gst_v4l2_get_output), (gst_v4l2_set_output), + (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), + (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), + (gst_v4l2_set_attribute): + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_stop): + * sys/vcd/vcdsrc.c: (vcdsrc_open_file): + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), + (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), + (gst_xvideosink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): + +2004-02-02 Thomas Vander Stichele + + * gst/volume/gstvolume.c: (gst_volume_set_volume), + (gst_volume_get_volume), (volume_class_init), (volume_init), + (volume_chain_int16), (volume_update_volume): + * gst/volume/gstvolume.h: + make code more readable by removing magic numbers + make mixer interface export 0-100 range + make it internally map to 0.0-1.0 range so users don't distort + output by putting the sliders at full volume + +2004-02-02 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_tick_callback), + (gst_play_state_change), (gst_play_seek_to_time): + block the tick callback for 0.5 secs after doing a seek + +2004-02-02 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_new): + check for GError + +2004-02-01 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_seek_to_time), + (gst_play_new): Accepting NULL GError, blocking time tick while seeking. + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_init): s/sinkconnect/sink_link + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_init): s/sinkconnect/sink_link + +2004-02-01 Thomas Vander Stichele + + * configure.ac: + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + check for a function added in vorbis 1.1 + +2004-01-31 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), + (gst_alsa_drain_audio), (gst_alsa_stop_audio): + really start/stop clock only on PLAYING <=> PAUSED + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + remove \n from debugging lines + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): + make it work when seeking does not + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + reset on DISCONT + +2004-01-31 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start): + start clock on PAUSED=>PLAYING, not later + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + extract correct time for different discont formats + (gst_alsa_sink_get_time): + don't segfault when no format is negotiated yet, just return 0 + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_handle_event), (gst_ogg_demux_push), + (gst_ogg_pad_push): + handle flush and discont events correctly + * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): + handle discont events correctly + +2004-01-31 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_error_quark), + (gst_play_error_create), (gst_play_error_plugin), + (gst_play_pipeline_setup), (gst_play_init), (gst_play_new): + * gst-libs/gst/play/play.h: + add error handling during creation + * examples/gstplay/player.c: (main): + use new gst_play_new + + +2004-01-31 Benjamin Otte + + * ext/theora/theoradec.c: (theora_dec_chain): + make comments work + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query), + (vorbis_dec_src_event), (vorbis_dec_chain): + add encoder tag, fix tag reading to be more error tolerant, change + BITRATE to NOMINAL_BITRATE, add debugging, don't unref events after + gst_pad_event_default. + * gst/tags/gstvorbistag.c: + (gst_tag_list_from_vorbiscomment_buffer): + undefine function specific define at end of function + +2004-01-31 Jeremy Simon + + * ext/flac/gstflac.c: (plugin_init): + * ext/flac/gstflacdec.c: (gst_flacdec_class_init): + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.h: + Fix typos + +2004-01-30 David I. Lehn + + * examples/gstplay/player.c: s/gstplay.h/play.h/ + +2004-01-30 Thomas Vander Stichele + + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/gstplay.c: + * gst-libs/gst/play/gstplay.h: + * gst-libs/gst/play/play.c: + more surgery, operation complete + +2004-01-30 Thomas Vander Stichele + + * gst-libs/gst/play/play.old.c: + * gst-libs/gst/play/play.old.h: + after CVS surgery by moving, remove + * gst-libs/gst/play/playpipelines.c: + remove + + * gst/intfloat/float22int.c: (gst_float2_2_int_chain): + add negotiation error + +2004-01-30 Thomas Vander Stichele + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_push): + add some seeking debug info + send a flush when seeking + +2004-01-30 Benjamin Otte + + * configure.ac: + use AC_C_INLINE + * configure.ac: + * ext/Makefile.am: + * ext/theora/Makefile.am: + * ext/theora/theoradec.c: + add theora video decoder. Does just do simple decoding for now and + has been tested against Theora cvs only. It only works when theora + is compiled with --enable-static. + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + always reset packetno on DISCONT + +2004-01-30 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + Fix audio. + +2004-01-30 Ronald Bultje + + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header): + Fix header parsing - stolen from ffmpeg (thank you! :) ). + +2004-01-30 Ronald Bultje + + * ext/esd/esdsink.c: (gst_esdsink_init): + Since we have static pad template caps, we don't need to negotiate; + either the core errors out or we know the format. + +2004-01-30 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_seek): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_seek): + Fix event handling. + +2004-01-30 Benjamin Otte + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + removee video/x-theora from vp3 decoder, it doesn't handle raw + theora streams + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init): + fix bug with finalizing element that never went to PAUSED + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): + length and position queries were swapped + * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init), + (vorbis_dec_from_granulepos), (vorbis_dec_src_query), + (vorbis_dec_src_event): + implement querying time and bytes + +2004-01-30 Thomas Vander Stichele + + * just about every source file: + gst_element_error -> GST_ELEMENT_ERROR + +2004-01-29 Julien MOUTTE + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): Fixing seeking + emiting FLUSH and even before DISCONT. + * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): Fix seeking to + get the best instant seeking as possible yay! + +2004-01-29 Ronald Bultje + + * gst/mpeg1videoparse/gstmp1videoparse.c: + (gst_mp1videoparse_real_chain): + Committed wrong version last week... Grr... Didn't notice until now. + +2004-01-29 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the + have_xwindow_id signal in xwindow_create. + +2004-01-29 Benjamin Otte + + * ext/ogg/gstoggdemux.c: + lots of changes - mainly support for chained bitstreams, seeking, + querying and bugfixes of course + * ext/vorbis/Makefile.am: + * ext/vorbis/vorbisdec.c: + * ext/vorbis/vorbisdec.h: + add vorbisdec raw vorbis decoder + * ext/vorbis/vorbis.c: (plugin_init): + register vorbisdec as PRIMARY, vorbisfile as SECONDARY + * gst/intfloat/Makefile.am: + * gst/intfloat/float22int.c: + * gst/intfloat/float22int.h: + * gst/intfloat/gstintfloatconvert.c: (plugin_init): + add float2intnew plugin. It converts multichannel interleaved float to + multichannel interleaved int. The name should probably be changed. + * gst/typefind/gsttypefindfunctions.c: (theora_type_find), + (plugin_init): + add typefinding for raw theora video so oggdemux can detect it. + +2004-01-28 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): seek on video + sink element first. + * gst/videoscale/gstvideoscale.c: + (gst_videoscale_handle_src_event): Fixing src event handler. + +2004-01-28 Ronald Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_open), (gst_v4lsrc_close), + (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps), (gst_v4lsrc_set_clock): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_start), + (gst_v4lsrc_grab_frame), (gst_v4lsrc_capture_stop): + Implement resizing... Hack. But that's why v4l is b0rked... + +2004-01-28 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, + correctly cleaning the image created to check xshm calls on succes, + added a lot of XSync calls in X11 functions, and fixed a segfault when + no image format was defined before negotiation happened. + +2004-01-28 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_query_func): + use gst_element_get_time to get correct time + +2004-01-28 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), + (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our + X plugins are now able to detect that XShm calls will fail even if the + server claims that it has XShm support (remote displays most of the + time). We then log the error as a GST_DEBUG and set use_shm to FALSE + so that we use non XShm functions. This feature is almost useless for + xvimagesink as Xv is not supported on remote displays anyway, but + it might happen than even on the local display XShm calls fail. + +2004-01-27 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), + (gst_esdsink_link), (gst_esdsink_get_time), (gst_esdsink_chain), + (gst_esdsink_change_state): Fix sync issues in esdsink. Also + changed esdsink to only use 44100,16,2, since esd sucks at rate + conversion and esdsink has had difficulty negotiating. + +2004-01-27 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback), + (gst_play_seek_to_time): Fixing the way to get current position. + +2004-01-27 Benjamin Otte + + * sys/oss/gstosssink.c: (gst_osssink_sink_query): + use gst_element_get_time to get correct time + +2004-01-27 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_set_location): The easiest + fix ever... Inverting 2 lines of code make spider autoplug correctly + tagged mp3 ! + +2004-01-27 David Schleef + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Use gst_pad_try_set_caps_nonfixed(). + +2004-01-27 David Schleef + + * gst/ac3parse/gstac3parse.c: update to checklist 5 + * gst/adder/gstadder.c: rewrite negotiation. update to checklist 5 + * gst/audioconvert/gstaudioconvert.c: update to checklist 5 + * gst/audioscale/gstaudioscale.c: same + * gst/auparse/gstauparse.c: same + * gst/avi/gstavidemux.c: same + +2004-01-27 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): + stop processing after EOS + +2004-01-27 Benjamin Otte + + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfmux.c: (gst_asfmux_put_guid), + (gst_asfmux_put_string), (gst_asfmux_put_wav_header), + (gst_asfmux_put_vid_header), (gst_asfmux_put_bmp_header): + lot's of fixes to make data extraction simpler and get the code + architecture and compiler independant. Add debugging category + * gst/goom/gstgoom.c: (gst_goom_change_state): + reset channel count on PAUSED=>READY, not READY=>PAUSED + +2004-01-26 Colin Walters + + * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_get): Remove ugly + code to pull a bigger buffer in iradio mode. This as a side effect + makes typefinding work. + +2004-01-26 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): + Fix SVQ3 decoding on PPC + +2004-01-26 Julien MOUTTE + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Dunno how + that one managed to stay there... Fixed. + +2004-01-26 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_to_extradata), (gst_ffmpeg_caps_to_pixfmt): + * gst/qtdemux/qtdemux.c: (plugin_init), (qtdemux_parse_trak), + (qtdemux_video_caps): + * gst/qtdemux/qtdemux.h: + Add SVQ3 specific flags to qtdemux and ffmpeg + +2004-01-26 Benjamin Otte + + * gst-libs/gst/audio/audio.h: + remove buffer-frames from audio caps + * gst/audioconvert/gstaudioconvert.c: + fix plugin to really work. + +2004-01-25 Ronald Bultje + + * gst-libs/gst/mixer/mixer.c: + * gst-libs/gst/propertyprobe/propertyprobe.c: + * gst-libs/gst/tuner/tuner.c: (gst_tuner_find_norm_by_name), + (gst_tuner_find_channel_by_name): + * gst-libs/gst/tuner/tuner.h: + Add gtk-doc style comments. Also fix a function name. + +2004-01-25 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_init), + (gst_divxdec_negotiate): + Fix for new capsnego - also fixes gst-player with divxdec. + +2004-01-25 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_identity_handoff), (gst_play_set_location), + (gst_play_set_visualization), (gst_play_connect_visualization): Another + try in visualization implementation. Still have an issue with switch + blocking when pulling from video_queue and only audio comes out of + spider. + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_poll_sinkpads), (gst_switch_class_init): Implementing pad + release method. And check if the pad is usable before pulling. + +2004-01-25 Ronald Bultje + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose), + (gst_videobalance_init), + (gst_videobalance_colorbalance_list_channels), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value), + (gst_videobalance_update_properties), + (gst_videobalance_update_tables_planar411), + (gst_videobalance_planar411): + * gst/videofilter/gstvideobalance.h: + Implement lookup-tables. +/- 10x faster. + +2004-01-25 Ronald Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): + The index reading was broken. The rest worked fine, but the whole + goal of my rewrite was to make avidemux readable, and this was + not at all readable. Please use typed variables. + +2004-01-25 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + Additional pad usability check. + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (mp1videoparse_find_next_gop), (gst_mp1videoparse_time_code), + (gst_mp1videoparse_real_chain): + Fix MPEG video stream parsing. The original plugin had several + issues, including not timestamping streams where the source was + not timestamped (this happens with PTS values in mpeg system + streams, but MPEG video is also a valid stream on its own so + that needs timestamps too). We use the display time code for that + for now. Also, if one incoming buffer contains multiple valid + frames, we push them all on correctly now, including proper EOS + handling. Lastly, several potential segfaults were fixed, and we + properly sync on new sequence/gop headers to include them in next, + not previous frames (since they're header for the next frame, not + the previous). Also see #119206. + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain), + (bpf_from_header): + Move caps setting so we only do it after finding several valid + MPEG-1 fraes sequentially, not right after the first one (which + might be coincidental). + * gst/typefind/gsttypefindfunctions.c: (mpeg1_sys_type_find), + (mpeg_video_type_find), (mpeg_video_stream_type_find), + (plugin_init): + Add unsynced MPEG video stream typefinding, and change some + probability values so we detect streams rightly. The idea is as + follows: I can have an unsynced system stream which contains + video. In the current code, I would randomly get a type for either + system or video stream type found, because the probabilities are + being calculated rather randomly. I now use fixed values, so we + always prefer system stream if that was found (and that is how it + should be). If no system stream was found, we can still identity the stream as video-only. + +2004-01-23 Benjamin Otte + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): + don't write to buffer. Extract data without the need of + __attribute__ ((packed)) + +2004-01-23 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (mpeg1_parse_header), + (mpeg1_sys_type_find): + Fix MPEG-1 stream typefinding. + +2004-01-23 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): + Fix typefinding for MPEG-1 system streams, similar to MPEG-2. + +2004-01-23 Thomas Vander Stichele + + * ext/esd/esdsink.c: (gst_esdsink_open_audio): + * ext/esd/gstesd.c: (plugin_init): + private debugging, better error reporting + +2004-01-23 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), + (gst_riff_read_init), (gst_riff_read_change_state): + * gst-libs/gst/riff/riff-read.h: + Remove stuff fromold metadata system. + +2004-01-23 Ronald Bultje + + * ext/ogg/gstoggdemux.c: + Fix wrong file comment. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): + Add metadata reading properly. + +2004-01-23 Thomas Vander Stichele + + * ext/Makefile.am: + Fix nas DIST_SUBDIRS + Uraeus: + Fix bug where make distcheck doesn't get run on adding stuff to + the build. + +2004-01-23 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_init), (gst_divxdec_setup): + * ext/divx/gstdivxdec.h: + Fix divx3 ("msmpeg4") playback using divxdec. + +2004-01-23 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: + (mp3_type_frame_length_from_header): fix bug in length computation + (mp3_type_find): improve debugging output + +2004-01-23 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_set_location), (gst_play_seek_to_time), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_sink_element): Reworked + the pipeline from scratch. Visualization is back and switch went out as + i realized it was not possible to use the way i wanted. + * sys/ximage/ximagesink.c: (gst_ximagesink_imagepool_clear), + (gst_ximagesink_change_state), (gst_ximagesink_dispose): Move xcontext + clearing in state change from READY to NULL. So that one can clean the + X ressources keeping the element. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_imagepool_clear), (gst_xvimagesink_change_state), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_set_property), (gst_xvimagesink_dispose), + (gst_xvimagesink_init): Same xcontext cleaning than ximagesink in state + change from READY to NULL and fixed some stupid bugs in colorbalance + get/set values. Also added the following feature : when nobody tries to + set some values to the colorbalance levels before the xcontext is + grabbed, then when creating channels list from Xv attributes we set the + internal values to the Xv defaults. This way we handle buggy Xv drivers + that set default hue values far from the middle of the range (Thanks + to Jon Trowbridge for pointing that issue). + * sys/xvimage/xvimagesink.h: Adding a cb_changed boolean to know if + colorbalance levels have been set before xcontext is grabbed. + +2004-01-22 Ronald Bultje + + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Fix the ossmixer case where we shouldn't open /dev/dsp* because + it might block operations (which is bad for a mixer). + +2004-01-22 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), + (deep_notify_callback), (gmi_set_decoder), (gmi_clear_decoder), + (gmip_find_type_pre): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info.c: + (gst_media_info_instance_init), (gst_media_info_read_idler): + add fakesink to get caps on decoder src pad again + fix callback prototype to match new have_type signal signature + +2004-01-22 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_link): + fix non-compile and cut-n-paste code + +2004-01-21 David Schleef + + * ext/swfdec/gstswfdec.c: (gst_swfdec_video_getcaps), + (gst_swfdec_video_link), (copy_image), (gst_swfdec_loop), + (gst_swfdec_init), (gst_swfdec_change_state): + * ext/swfdec/gstswfdec.h: + Fix negotiation. + * gst/adder/gstadder.c: (gst_adder_link), (gst_adder_init), + (gst_adder_request_new_pad): Fix negotiation. + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_fixate): + Add a fixate function. + * gst/intfloat/gstfloat2int.c: + * gst/intfloat/gstfloat2int.h: + * gst/intfloat/gstint2float.c: + * gst/intfloat/gstint2float.h: + Completely rewrite the negotiation. Doesn't quite work yet, + due to some buffer-frames problem. + +2004-01-21 Thomas Vander Stichele + + * ext/gnomevfs/gstgnomevfssrc.c: + * sys/v4l2/v4l2_calls.h: + fix includes for distcheck + +2004-01-21 Christian Schaller + + * ext/nas/ + Add libnas (network audio system) plugin, patch from Arwed von Merkatz + based on earlier patch from Laurent Vivier + +2004-01-20 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): + Fix wma caps property + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Fix typo (flags1 and flags2) + +2004-01-20 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: + (deep_notify_callback), (gmi_seek_to_track), (gmi_get_decoder), + (gmip_find_type_pre), (gmip_find_type), (gmip_find_stream_post), + (gmip_find_stream), (gmip_find_track_metadata), + (gmip_find_track_streaminfo_post), (gmip_find_track_streaminfo), + (gmip_find_track_format): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (main): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + register debugging category and use it for debugging + +2004-01-20 Thomas Vander Stichele + + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_update_streaminfo), + (gst_vorbisfile_new_link): + signal streaminfo through tags + +2004-01-20 Ronald Bultje + + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + g++ doesn't like NULL in our i18n/error macros, should be + either (NULL) or (""). + +2004-01-20 Ronald Bultje + + * sys/dxr3/dxr3audiosink.c: + * sys/dxr3/dxr3init.c: + * sys/dxr3/dxr3spusink.c: (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_close): + Fix more error error error errors (missing includes here). + +2004-01-20 Ronald Bultje + + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + fix thomas' error errors. + +2004-01-20 Thomas Vander Stichele + + * ext/mpeg2enc/gstmpeg2enc.cc: + fix error errors. + +2004-01-20 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + Fix for new error system. + +2004-01-20 Thomas Vander Stichele + + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + fix for new error reporting + +2004-01-20 David Schleef + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), + (gst_ximagesink_set_xwindow_id): Change to using a framerate + of [1,100] instead of [0,MAX], since 0 isn't handled correctly, + and neither is 100+, most likely. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_getcaps): same + +2004-01-19 Benjamin Otte + + * configure.ac: + Up version requirement to 2.0.3 (not yet released) to avoid symbol + clashes with ffmpeg. + +2004-01-20 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_request_new_pad), + (gst_switch_init): Fixed switch element : proxying link and setting + caps from src to sink on request. + +2004-01-19 Thomas Vander Stichele + + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), + (gst_v4l2_set_window), (gst_v4l2_enable_overlay): + fix element_error + +2004-01-19 Thomas Vander Stichele + + * sys/v4l/v4l_calls.h: + * sys/v4l2/v4l2_calls.h: + element_error fixes + +2004-01-19 Thomas Vander Stichele + + * gst-libs/gst/gst-i18n-plugin.h: + add locale.h + remove config.h inclusion + +2004-01-19 Thomas Vander Stichele + + * autogen.sh: + adding autopoint invocation + * Makefile.am: + * configure.ac: + * gst-libs/gst/gettext.h: + adding gettext bits + * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_open_file): + * ext/sndfile/gstsf.c: (gst_sf_loop), (plugin_init): + * gst-libs/gst/gst-i18n-plugin.h: + * gst/avi/gstavi.c: (plugin_init): + * sys/dxr3/dxr3init.c: (plugin_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_write_data): + * sys/oss/gstossaudio.c: (plugin_init): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/v4l_calls.c: (gst_v4l_open): + * sys/v4l2/gstv4l2.c: (plugin_init): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_get_norm), (gst_v4l2_set_norm), + (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), + (gst_v4l2_set_output), (gst_v4l2_get_frequency), + (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), + (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): + make sure locale and translation domain are set + fix translated strings + * po/.cvsignore: + * po/LINGUAS: + * po/Makevars: + * po/POTFILES.in: + * po/nl.po: + put translation files into place + * sys/xvideo/imagetest.c: (main): + * ext/dv/demo-play.c: (main): + fix unnecessary translations + +2004-01-19 Thomas Vander Stichele + + * ext/sndfile/gstsf.c: + * gst/avi/gstavimux.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/gnomevfs/gstgnomevfssink.c: + * ext/gnomevfs/gstgnomevfssrc.c: + * sys/oss/gstosselement.c: + * sys/v4l/v4l_calls.h: + fix i18n include + +2004-01-19 Thomas Vander Stichele + + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), + (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), + (gst_v4l2_get_output), (gst_v4l2_set_output), + (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), + (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), + (gst_v4l2_set_attribute): + update to new error handling + +2004-01-19 Thomas Vander Stichele + + * ext/sidplay/gstsiddec.cc: + * gst/modplug/gstmodplug.cc: + parenthese NULL because C++ seems angry about it + +2004-01-19 Thomas Vander Stichele + + * gst-libs/gst/gst-i18n-plugin.h: + add skeleton i18n stuff, but needs to be further implemented + +2004-01-18 Thomas Vander Stichele + + * examples/gstplay/player.c: (main): + * ext/aalib/gstaasink.c: (gst_aasink_open): + * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file): + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): + * ext/esd/esdmon.c: (gst_esdmon_get): + * ext/esd/esdsink.c: (gst_esdsink_chain): + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/faad/gstfaad.c: (gst_faad_chain): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), + (gst_flacdec_loop): + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), + (gst_gnomevfssrc_open_file): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): + * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_do_typefind), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), + (gst_ogg_demux_push), (gst_ogg_pad_push): + * ext/raw1394/gstdv1394src.c: + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), + (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): + * ext/sidplay/gstsiddec.cc: + * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), + (gst_sf_loop): + * ext/speex/gstspeexenc.c: (gst_speexenc_chain): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): + * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): + * gst-libs/gst/Makefile.am: + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): + * gst/adder/gstadder.c: (gst_adder_parse_caps), (gst_adder_loop): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), + (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + * gst/avi/gstavimux.c: (gst_avimux_stop_file): + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): + * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_header): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_blockgroup): + * gst/modplug/gstmodplug.cc: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + * gst/oneton/gstoneton.c: (gst_oneton_chain): + * gst/silence/gstsilence.c: (gst_silence_get): + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/smpte/gstsmpte.c: (gst_smpte_loop): + * gst/speed/gstspeed.c: (speed_loop): + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * gst/volenv/gstvolenv.c: (gst_volenv_chain): + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), + (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), + (dxr3audiosink_close): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), + (dxr3videosink_close), (dxr3videosink_write_data): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/oss/gstosselement.h: + * sys/oss/gstosssink.c: (gst_osssink_get_type), (gst_osssink_init), + (gst_osssink_chain): + * sys/oss/gstosssrc.c: (gst_osssrc_get): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_window), + (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), + (gst_v4l_set_chan_norm), (gst_v4l_get_signal), + (gst_v4l_get_frequency), (gst_v4l_set_frequency), + (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), + (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_capture), + (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), + (gst_v4lmjpegsrc_requeue_frame): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), + (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_stop): + * sys/vcd/vcdsrc.c: (vcdsrc_open_file): + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), + (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), + (gst_xvideosink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): + use new error signal, function and categories + +2004-01-18 Jeremy Simon + + * configure.ac: + * ext/Makefile.am: + * ext/musicbrainz/gsttrm.c: + * ext/musicbrainz/gsttrm.h: + * ext/musicbrainz/Makefile.am: + Add a trm plugin + +2004-01-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), + (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding + synchronous property for debugging. + * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_set_property): Moving a pointer declaration to a + smaller block, fixing indent. + +2004-01-16 David Schleef + + * gst/videofilter/gstvideobalance.c: Fix regression; changing a + property affects the video stream. + * sys/xvimage/xvimagesink.c: + * sys/xvimage/xvimagesink.h: + Add synchronous property for debugging. Should probably be + disabled in non-CVS builds. Make sure that the Xv attribute + exists before we set it (crash!). Fix a silly float bug that + caused colorbalance to just not work. + +2004-01-17 Christian Schaller + + * tools/gst-launch-ext.in - update for new plugins + +2004-01-16 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Fix use of + already-freed caps. + +2994-01-16 Christian Schaller + + * Update spec for new colorspace plugin and libcaca plugin + * Fix compilation of libcaca plugin (clock -> id) + +2004-01-16 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing + correct colorbalance properties. They can now be set when the element + is still in NULL state. The values will be committed to the Xv Port + when xcontext is initialized. + * sys/xvimage/xvimagesink.h: Added hue, saturation, contrast, + brightness int values in the GstXvImagesink structure. + +2004-01-16 Ronald Bultje + + * gst-libs/gst/Makefile.am: + restructure so having local patches works easier. + +2004-01-16 Ronald Bultje + + * ext/mpeg2enc/Makefile.am: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + Bugfix with respect to EOS handling. + +2004-01-16 Ronald Bultje + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): + Link with right caps (else, it segfaults). + * ext/mplex/gstmplexjob.cc: + Fix for slight API change in 1.6.1.93 release of mjpegtools. + +2004-01-15 David Schleef + + * gst-libs/gst/audio/Makefile.am: + Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c + from the template. + * gst-libs/gst/audio/gstaudiofilter.c: + * gst-libs/gst/audio/gstaudiofilter.h: + Add bytes_per_sample and size and n_samples calculation. + * gst-libs/gst/audio/gstaudiofilterexample.c: + Remove, now autogenerated. + * gst-libs/gst/audio/gstaudiofiltertemplate.c: + Moved from gstaudiofilterexample, object name changed, code added + so that it actually works. + * gst-libs/gst/audio/make_filter: + Script to build an audiofilter subclass from the template. + * gst/colorspace/Makefile.am: + * gst/colorspace/yuv2yuv.c: + Remove file, since it's GPL, and we don't use it. + +2004-01-15 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of + them use the buffer free function to test how the buffer was allocated. + +2004-01-15 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_class_init): Remove property + that handles osssink fallback. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), + (gst_audio_convert_getcaps): + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Add audio/x-qdm2 for QDM2 audio. + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/sine/gstsinesrc.h: Add example of how to implement tags. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + Decrease minimum size to 16x16. + * gst/wavparse/gstwavparse.c: + Convert disabled pad template caps to new caps. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): Throw element error when display cannot + be opened. Increase minimum framerate to 1.0. Check the data + free function on a buffer to make sure it is the type we expect + before manipulating it. + +2004-01-15 Julien MOUTTE + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), + (gst_videobalance_colorbalance_set_value): Implement passthru if + settings are in the middle. + * tools/gst-launch-ext.in: Stop using xvideosink, use ximagesink. + +2004-01-15 Ronald Bultje + + * gst/videofilter/Makefile.am: + * gst/volume/Makefile.am: + Since we use videofilter symbols, link to it. + +2004-01-15 Julien MOUTTE + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init): Setting + mixer interface type to HARDWARE. + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): Adding a default + type to SOFTWARE. + * gst-libs/gst/mixer/mixer.h: Adding mixer interface type and macro. + * gst-libs/gst/mixer/mixertrack.h: Adding mixertrack flag SOFTWARE. + * gst/volume/gstvolume.c: (gst_volume_interface_supported), + (gst_volume_interface_init), (gst_volume_list_tracks), + (gst_volume_set_volume), (gst_volume_get_volume), + (gst_volume_set_mute), (gst_volume_mixer_init), + (gst_volume_dispose), (gst_volume_get_type), (volume_class_init), + (volume_init): Implementing mixer interface. + * gst/volume/gstvolume.h: Adding tracklist for mixer interface. + * sys/oss/gstosselement.c: (gst_osselement_get_type), + (gst_osselement_change_state): Removing some trailing commas in + structures. + * sys/oss/gstossmixer.c: (gst_ossmixer_interface_init): Setting mixer + interface type to HARDWARE. + * sys/v4l/gstv4lcolorbalance.c: + (gst_v4l_color_balance_interface_init): Setting colorbalance interface + type to HARDWARE. + * sys/v4l2/gstv4l2colorbalance.c: + (gst_v4l2_color_balance_interface_init): Setting colorbalance + interface type to HARDWARE. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): use exactly the + same code than ximagesink for event handling. + +2004-01-15 Ronald Bultje + + * ext/snapshot/Makefile.am: + * ext/snapshot/gstsnapshot.c: (gst_snapshot_sinkconnect), + (gst_snapshot_chain): + * ext/snapshot/gstsnapshot.h: + This has to be a joke... Snapshot should be connected to a tee, + colorspace element before it and EOS after that, where the other + src of the tee receives normal data. + The current way is *wrong*. + +2004-01-15 Ronald Bultje + + * ext/hermes/gsthermescolorspace.c: + Fix another compile error. Same as below. + +2004-01-15 Ronald Bultje + + * gst/colorspace/gstcolorspace.c: + * gst/colorspace/yuv2yuv.c: (gst_colorspace_yuy2_to_i420), + (gst_colorspace_i420_to_yv12): + Fix compiling... Didn't test if it actually works. + +2004-01-15 David Schleef + + * configure.ac: + * gst/colorspace/Makefile.am: + * gst/colorspace/gstcolorspace.c: + * gst/colorspace/gstcolorspace.h: + * gst/colorspace/yuv2rgb.c: + * gst/colorspace/yuv2rgb.h: + Duplicate the ext/hermes colorspace plugin, and remove Hermes + code and GPL code. Fix for new caps negotiation. Rewrite + much of the format handling code, and some of the conversion + code. Basically, rewrote almost everything. This element + handles I420, YV12 to RGB conversions. + * ext/hermes/Makefile.am: + * ext/hermes/gsthermescolorspace.c: + Rename colorspace to hermescolorspace. Fix negotiation issues. + Remove non-Hermes related code. This element handles lots of + RGB to RGB conversions, but no YUV. + * ext/hermes/gstcolorspace.c: + * ext/hermes/gstcolorspace.h: + * ext/hermes/rgb2yuv.c: + * ext/hermes/yuv2rgb.c: + * ext/hermes/yuv2rgb.h: + * ext/hermes/yuv2rgb_mmx16.s: + * ext/hermes/yuv2yuv.c: + * ext/hermes/yuv2yuv.h: + Remove old code. + +2004-01-14 Colin Walters + + * ext/mad/gstid3tag.c (gst_id3_tag_chain): Don't nego caps if + they've already been. + +2004-01-15 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): + assume tag mode when pad is not connected + +2004-01-15 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Don't update the time of the clock + (gst_alsa_sink_loop): + sync to the clock given to alsasink, not the own clock + * sys/oss/gstosssink.c: (gst_osssink_chain): + sync to the clock + (gst_osssink_change_state): + activate the clock + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): + remove bogus code that made DISCONT events unhandled + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): + explicitly case to double in _set_simple. (fixes 2nd warning in bug + #131502) + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_read_object_header), + (gst_asf_demux_handle_sink_event), (gst_asf_demux_audio_caps), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_video_caps): + convert g_warning because of wrong asf data to GST_WARNINGs (fixes + 2nd warning in bug #131502) + +2004-01-14 Julien MOUTTE + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value): Fixing videobalance ranges + for colorbalance interface implementation. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_set_property), (gst_ximagesink_get_property), + (gst_ximagesink_dispose), (gst_ximagesink_init), + (gst_ximagesink_class_init): Adding DISPLAY property. + * sys/ximage/ximagesink.h: Adding display_name to store display. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_dispose), (gst_xvimagesink_init), + (gst_xvimagesink_class_init): Adding DISPLAY property and colorbalance + properties (they still need polishing though for gst-launch use : no + xcontext yet, i ll do that tomorrow). + * sys/xvimage/xvimagesink.h: Adding display_name to store display. + +2004-01-14 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_set_location), (gst_play_set_visualization): Preparing + switch integration, adding videobalance in the pipeline. + +2004-01-14 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalance.c: + (gst_color_balance_class_init): Adding a default type. + * gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access + the type. + * gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type), + (gst_videobalance_dispose), (gst_videobalance_class_init), + (gst_videobalance_init), (gst_videobalance_interface_supported), + (gst_videobalance_interface_init), + (gst_videobalance_colorbalance_list_channels), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value), + (gst_videobalance_colorbalance_init): Implementing colorbalance + interface. + * gst/videofilter/gstvideobalance.h: Adding colorbalance channels + list. + * sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a + bug which was triggering a BadAccess X error when setting an overlay + before pad was really negotiated. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init): + Using the colorbalance type macro. + +2004-01-14 Benjamin Otte + + * ext/flac/gstflacenc.c: (gst_flacenc_set_metadata), + (gst_flacenc_chain): + handle tags correctly + * gst/tags/gstid3tag.c: (gst_tag_list_new_from_id3v1): + extract ID3v1 tags correctly + +2004-01-14 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (matroska_type_find), + (plugin_init): + Improve matroska typefinding for odd-typed headers... + +2004-01-14 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + Fix for using incremental number on padnames. + +2004-01-14 Ronald Bultje + + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + Set category to divx4linux instead of divx (too generic). + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), + (gst_wavparse_loop), (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + fix parsing of WAV files with non-standard fmt-tag size and fix + skipping of unrecognized chunks... Someone please fix this thing + to use rifflib so all this is automated. + * sys/v4l/Makefile.am: + * sys/v4l2/Makefile.am: + Add X_CFLAGS because we depend on X (for overlay). + +2004-01-14 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + Don't issue a timestamp unless we tagged the frame + with a PTS. + +2004-01-14 Benjamin Otte + + * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback): + Query the audio element to get the time, not the clock. We're + interested in the element's time here. + +2004-01-14 Benjamin Otte + + * ext/aalib/gstaasink.c: (gst_aasink_chain): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + * ext/esd/esdsink.c: (gst_esdsink_chain): + * ext/libcaca/gstcacasink.c: (gst_cacasink_chain): + * ext/mas/massink.c: (gst_massink_chain): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_chain): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_index), + (gst_matroska_demux_parse_metadata): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop), + (gst_mpeg_parse_release_locks): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_chain): + * gst/udp/gstudpsink.c: (gst_udpsink_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_chain), + (gst_xvideosink_release_locks): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): + use element time. + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_start), + (gst_alsa_clock_stop): + * gst-libs/gst/audio/audioclock.c: (gst_audio_clock_set_active), + (gst_audio_clock_get_internal_time): + simplify for use with new clocking code. + * testsuite/alsa/Makefile.am: + * testsuite/alsa/sinesrc.c: (sinesrc_init), (sinesrc_force_caps): + fix testsuite for new caps system + +2004-01-14 Benjamin Otte + + * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): + * ext/flac/gstflacenc.c: (add_one_tag): + length is already host endian, no need to convert. Fixes playback of + tagged files on PPC. (bug #128384) + +2004-01-13 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalance.h: Adding a type to the + colorbalance interface stating if it is hardware based or software + based. + * gst/videofilter/gstvideobalance.c: (gst_videobalance_planar411): + Removing a trailing comma. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_colorbalance_init): Integrating a patch from Jon + Trowbridge querying Xv adaptor for min/max value as + the documentation seems to be wrong on the -1000 to 1000 interval. + +2004-01-12 David Schleef + + * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), + (gst_efence_buffer_alloc), (gst_fenced_buffer_new), + (gst_fenced_buffer_default_free), (gst_fenced_buffer_default_copy): + Fix negotiation. Add a bufferalloc function for the sink pad, + and generally clean up some of the code. + +2004-01-12 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalancechannel.c: + (gst_color_balance_channel_dispose): Adding safety check in dispose + method. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_interface_supported), + (gst_xvimagesink_colorbalance_list_channels), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): + Adding colorbalance interface support to set XV parameters such as + HUE, BRIGHTNESS, CONTRAST, SATURATION. + * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance + interface. + +2004-01-12 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_get_type), + (gst_audio_convert_class_init), (gst_audioconvert_getcaps), + (gst_audio_convert_init), (gst_audio_convert_set_property), + (gst_audio_convert_get_property), (gst_audio_convert_chain), + (gst_audio_convert_link), + (gst_audio_convert_buffer_to_default_format), + (gst_audio_convert_buffer_from_default_format), (plugin_init): + - implement _getcaps and use it + - improve linking + - remove float caps since no float conversion is actually done + - remove properties and arguments that were to be used for rate + conversion + +2004-01-12 Thomas Vander Stichele + + * gst-libs/gst/audio/audio.c: (_gst_audio_structure_set_list), + (gst_audio_structure_set_int): + * gst-libs/gst/audio/audio.h: + add helper functions for _getcaps matching the standard audio + templates + +2004-01-12 David Schleef + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Test that pad is negotiated before getting its caps. + +2004-01-12 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): When + analyzing the pads of an element the bin is mostly in READY state so + no caps were negotiated. This helper function needs to work with + _get_caps directly then. I was not freeing them though, added that to + fix the mem leak. + +2004-01-12 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the + direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE + than the free_func. + +2004-01-12 Thomas Vander Stichele + + * sys/oss/gstossaudio.c: (plugin_init): + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + * sys/oss/gstosselement.h: + make an oss debugging category + make failure more descriptive + +2004-01-11 David Schleef + + * ext/ffmpeg/gstffmpeg.c: + * ext/ffmpeg/gstffmpegcodecmap.c: + * ext/ffmpeg/gstffmpegdec.c: + * ext/ffmpeg/gstffmpegenc.c: + * ext/ffmpeg/gstffmpegprotocol.c: + * ext/gdk_pixbuf/gstgdkanimation.c: + * ext/jpeg/gstjpeg.c: + * ext/libpng/gstpng.c: + * ext/mpeg2dec/perftest.c: + * ext/speex/gstspeex.c: + * gst-libs/gst/resample/dtos.c: + * gst/intfloat/gstintfloatconvert.c: + * gst/oneton/gstoneton.c: + * gst/rtjpeg/RTjpeg.c: + * gst/rtp/gstrtp.c: + * sys/dxr3/dxr3init.c: + * sys/glsink/gstgl_nvimage.c: + * sys/glsink/gstgl_pdrimage.c: + * sys/glsink/gstglsink.c: + * testsuite/gst-lint: + Make sure everybody wraps #include "config.h" in #ifdef HAVE_CONFIG_H + +2004-01-11 David Schleef + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_set_caps): + * ext/faac/gstfaac.c: (gst_faac_sinkconnect): + * ext/gdk_pixbuf/gstgdkanimation.c: + (gst_gdk_animation_iter_create_pixbuf): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/jack/gstjack.c: (gst_jack_change_state): + * ext/xvid/gstxviddec.c: (gst_xviddec_sink_link): + * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): + * gst-libs/gst/play/play.c: (gst_play_get_sink_element): + * gst/videofilter/gstvideofilter.c: + (gst_videofilter_set_output_size): + Remove all usage of gst_pad_get_caps(), and replace it with + gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). + +2004-01-11 David Schleef + + * configure.ac: + * ext/Makefile.am: Fixes to make ext/libcaca compile. + * ext/divx/gstdivxdec.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_chain): Make gdkpixbufdec + handle images that span multiple buffers. Now work with both + filesrc ! gdkpixbufdec and qtdemux ! gdkpixbufdec. + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/libcaca/gstcacasink.h: Fixes needed due to recent + video/video.h changes + * ext/xvid/gstxvid.c: (gst_xvid_csp_to_caps): same + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): Use buffer free function instead + of GstData free function. + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): + same. + +2004-01-12 Benjamin Otte + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_class_init), + (gst_v4l2element_dispose), (gst_v4l2element_set_property), + (gst_v4l2element_get_property): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults), (gst_v4l2_open): + add norm, channel and frequency properties. + * sys/v4l2/gstv4l2tuner.c: + fixes for tuner interface changes + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + rework v4l2src to work with saa1734 cards and allow mmaped buffers. + +2004-01-12 Benjamin Otte + + * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init), + (gst_tuner_find_norm_by_name), (gst_v4l2_find_channel_by_name), + (gst_tuner_channel_changed), (gst_tuner_norm_changed), + (gst_tuner_frequency_changed), (gst_tuner_signal_changed): + * gst-libs/gst/tuner/tuner.h: + GObjects aren't const. + Add find_by_name functions. + Add checks to _changed functions. + * sys/v4l/gstv4ltuner.c: (gst_v4l_tuner_get_channel), + (gst_v4l_tuner_get_norm): + Fixes for above. + +2004-01-12 Benjamin Otte + + * gst-libs/gst/video/video.h: + Fix caps template names to be understandable. + Prefix everything with GST_VIDEO. + * ext/aalib/gstaasink.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): + * ext/jpeg/gstjpegdec.c: (raw_caps_factory): + * ext/jpeg/gstjpegenc.c: (raw_caps_factory): + * ext/libcaca/gstcacasink.c: + * ext/libpng/gstpngenc.c: (raw_caps_factory): + * ext/snapshot/gstsnapshot.c: + * ext/swfdec/gstswfdec.c: + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + * gst/chart/gstchart.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/effectv/gsteffectv.c: + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), + (gst_monoscope_srcconnect), (gst_monoscope_chain): + * gst/overlay/gstoverlay.c: + * gst/smooth/gstsmooth.c: + * gst/smpte/gstsmpte.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/videocrop/gstvideocrop.c: + * gst/videodrop/gstvideodrop.c: + * gst/y4m/gsty4mencode.c: + * sys/qcam/gstqcamsrc.c: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): + Make them work with new video.h file. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): + Make it work with new buffer allocation system. + +2004-01-11 Julien MOUTTE + + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_chain), (gst_ximagesink_buffer_free), + (gst_ximagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep + a reference to everything we need. + * sys/ximage/ximagesink.h: adding a reference to the sink in the image. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep + a reference to everything we need. + * sys/xvimage/xvimagesink.h: adding a reference to the sink in the image + +2004-01-11 David Schleef + + * ext/divx/gstdivxenc.c: remove bogus gst_caps_is_fixed() test + * gst/debug/efence.c: (gst_efence_chain), (gst_fenced_buffer_new), + (gst_fenced_buffer_default_copy): Fix for rename of buffer private + structure members. + * gst/effectv/gstwarp.c: (gst_warptv_setup): Don't reset the time + value during a resize/renegotiation. + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): use + gst_pad_alloc_buffer(); + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): Fix for rename of buffer private + structure members. + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): + Fix for rename of buffer private structure members. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): + Fix for rename of buffer private structure members. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): + Fix for rename of buffer private structure members. + +2004-01-11 Arwed v. Merkatz + + reviewed by: David Schleef + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: Gamma correction filter. Modified + from the patch by ds to fit in with recent make_filter changes. + +2004-01-11 Julien MOUTTE + + * configure.ac: Adding examples/switch/Makefile + * examples/Makefile.am: Adding examples/switch + * examples/switch/Makefile.am: Adding switcher example. + * examples/switch/switcher.c: (got_eos), (idle_iterate), + (switch_timer), (main): Adding an example demonstrating switch usage + with 2 videotestsrc showing different patterns. + * gst/switch/gstswitch.c: (gst_switch_request_new_pad), + (gst_switch_init): Fixing switch with the new caps system. + +2004-01-11 Benjamin Otte + + * gst-libs/gst/video/video.h: + Fix 32bit caps. Issue remaining: The macro names are chosen poorly. + They should probably be like + GST_VIDEO_PAD_TEMPLATE_CAPS_{RGB,BGR,RGBx,BGRx}. + +2004-01-11 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + fix audio chunk size/timestamp calculation + +2004-01-11 Benjamin Otte + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + fix SVQ3 caps + +2004-01-11 Steve Baker + + * gst/effectv/gstaging.c: (gst_agingtv_get_type), + (gst_agingtv_base_init), (gst_agingtv_class_init), + (gst_agingtv_init), (gst_agingtv_setup), (gst_agingtv_rgb32), + (gst_agingtv_set_property), (gst_agingtv_get_property): + Port agingTV to videofilter + +2004-01-09 Julien MOUTTE + + * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + +2004-01-09 Julien MOUTTE + + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * gst-libs/gst/xoverlay/xoverlay.c: + (gst_x_overlay_got_desired_size): Updating doc for the xid being 0. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): Implementing + the bufferalloc_function to replace bufferpools, fixing the XOverlay + interface implementation to handle xid being 0 and fix some bugs + triggered by Benjamin's testcase. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): Implementing + the bufferalloc_function to replace bufferpools, fixing the XOverlay + interface implementation to handle xid being 0 and fix some bugs + triggered by Benjamin's testcase. + +2004-01-09 David Schleef + + * ext/librfb/gstrfbsrc.c: Hacking. Added actual decoding and + mouse pointer events. It works. + +2004-01-09 Ronald Bultje + + * ext/divx/gstdivxenc.c: (gst_divxenc_init): + Use explicit caps - fix capsnego. + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + Remove macro-inside-macro which caused compile errors. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_header): + Error out if it's not a RIFF file. Else we error out without + gst_element_error() which is not good... + +2004-01-08 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): + Fix pad_link function to handle formats that ffmpeg returns + as multiple caps structures. + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): + Only complain if source buffer is _smaller_ than expected. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_init), + (gst_videoscale_handle_src_event): Resize navigation events + when passing them upstream. + * gst/videotestsrc/gstvideotestsrc.c: + * gst/videotestsrc/gstvideotestsrc.h: + * gst/videotestsrc/videotestsrc.c: + * gst/videotestsrc/videotestsrc.h: + Rewrite many of the buffer painting functions to handle odd + sizes (for many formats, size%4!=0 or size%8!=0). Most have + been verified to work with my video card. + * testsuite/gst-lint: Add check for elements calling + gst_pad_get_caps() instead of gst_pad_get_allowed_caps(). + +2004-01-08 David Schleef + + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link), (gst_videodrop_init): Fix negotiation. + +2004-01-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): A + configure event is not emiting the desired size signal. That fixes + aspect ratio issues with gst-player. + +2004-01-08 Ronald Bultje + + * gst/median/gstmedian.c: (gst_median_link), (gst_median_init): + Fix capsnego. + +2004-01-08 Julien MOUTTE + + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): Using XOverlay + public method to fire size signal. + +2004-01-07 Julien MOUTTE + + * examples/gstplay/Makefile.am: Adding the interface library. + * gst-libs/gst/play/Makefile.am: Adding the interface library. + * gst-libs/gst/play/gstplay.c: (gst_play_set_video_sink): Connecting to the XOverlay size signal instead of GstVideoSink. + * gst-libs/gst/play/gstplay.h: Including the XOverlay interface to check + GST_IS_X_OVERLAY before signal connect. + * gst-libs/gst/video/gstvideosink.c: (gst_videosink_class_init): + Removing the have_video_size signal. + * gst-libs/gst/video/gstvideosink.h: Removing the have_video_size signal + and associated public method. + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_sinkconnect): Using XOverlay public method to fire size + signal. + * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), + (gst_xvideosink_xwindow_new): Using XOverlay public method to fire size + signal. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sinkconnect): + Using XOverlay public method to fire size signal. + +2004-01-07 David Schleef + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideotemplate.c: + * gst/videofilter/make_filter: + Create gstvideoexample.c in a srcdir!=builddir friendly way. + Convert make_filter to /bin/sh script. + +2004-01-07 Thomas Vander Stichele + + * gst/modplug/gstmodplug.cc: fix element description + +2004-01-07 Julien MOUTTE + + * examples/gstplay/player.c: (got_time_tick), (got_stream_length), + (got_video_size): Adding some new lines in g_print calls. + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy), (gst_ximagesink_xwindow_resize), + (gst_ximagesink_handle_xevents), (gst_ximagesink_fixate), + (gst_ximagesink_sinkconnect), (gst_ximagesink_change_state), + (gst_ximagesink_chain), (gst_ximagesink_buffer_new), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_get_desired_size): + Complete code review, reverting some stuff i disagree with, adding + some fixes : time synchronization on invalid timestamps, renegotiation + of private window. + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_handle_xevents), + (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_fixate), (gst_xvimagesink_sinkconnect), + (gst_xvimagesink_change_state), (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_new), + (gst_xvimagesink_navigation_send_event), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_get_desired_size), + (gst_xvimagesink_xoverlay_init): Complete code review, reverting some + stuff i disagree with, adding some fixes : Renegotiation of private + window, implementing get_desired_size. + +2004-01-07 Ronald Bultje + + * ext/audiofile/gstafsink.c: (gst_afsink_init), (gst_afsink_chain), + (gst_afsink_handle_event): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): + * gst/avi/gstavimux.c: (gst_avimux_request_new_pad): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_init): + Fix for instantiate-test (see core). Also remove dead code from + jpegenc (which still needs fixing, but that's lower on my TODO + list...). + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Never return NULL as caps. + +2004-01-07 David Schleef + + * configure.ac: + * ext/Makefile.am: + * ext/librfb/Makefile.am: + * ext/librfb/gstrfbsrc.c: + New source plugin based on librfb-0.1. RFB (remote framebuffer) + is the protocol used by VNC. + +2004-01-07 David Schleef + + * gst/videofilter/gstvideotemplate.c: + * gst/videofilter/gstvideotemplate.h: + * gst/videofilter/make_filter: + Merge videotemplate header into source file. + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: (plugin_init): + * gst/effectv/gstwarp.c: + Make warpTV a subclass of videofilter. + +2004-01-07 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + Add guard against invalid utf-8 conversions in mad. Just in case. + +2004-01-07 Benjamin Otte + + * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): + Fix for bug shown by poisoning + +2004-01-06 Ronald Bultje + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), + (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_get), + (gst_v4lsrc_buffer_free): + Fix for removed bufferpools. + +2004-01-07 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + Fix caps negotiation. + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), + (dvdnavsrc_update_buttoninfo), (dvdnavsrc_get), + (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), + (dvdnavsrc_event): + * ext/mpeg2dec/gstmpeg2dec.c: + * gst-libs/gst/navigation/navigation.c: + (gst_navigation_send_key_event), (gst_navigation_send_mouse_event): + * gst-libs/gst/navigation/navigation.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_handle_src_event): + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): + Super-simple first version of mouse and keyboard events. Clicking + on a DVD menu now works, although it may not take you where you + expected. + + * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_src_fixate): + These fixate functions were broken - they never actually + fixated :) + +2004-01-06 Ronald Bultje + + * ext/shout/gstshout.c: (gst_icecastsend_base_init), + (gst_icecastsend_init): + fix for new caps system. + * gst-libs/gst/mixer/mixertrack.h: + * sys/oss/gstossmixer.c: (gst_ossmixer_build_list): + Add 'master track' flag (for tools like ACME that only want to + change the main volume). + +2004-01-07 Jan Schmidt + + * ext/xvid/gstxvid.c: (gst_xvid_structure_to_csp), + (gst_xvid_csp_to_caps): + * ext/xvid/gstxviddec.c: (gst_xviddec_src_getcaps): + * ext/xvid/gstxvidenc.c: + ifdef out ARGB type when it isn't available + in xvidcore 1.0.0beta2 + +2004-01-06 Ronald Bultje + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + When we have received a new SCR right in the first buffer after + a seek (so in the same cycle that handles the discont), we should + handle the buffer instead of unreffing it, else we lose data. + +2004-01-06 Iain + + * gst/intfloat/gstint2float.c (gst_int2float_link): Set the + buffer-frames caps too. + + * gst/oneton/gstoneton.c (gst_oneton_sink_connect): Only create the new + caps that we need, don't destroy them all and rebuild them. And when + creating src pads, use the src pad template rather than the sink... + +2004-01-05 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + Add pad to element *after* setting functions such as event handler. + Without this, the scheduler (opt) will link pads, set the event + handler from the default event function (dispatcher in gstpad.c) + and *after* that, we will set our own event function, which will + thus never be used (and thus mpegdemux doesn't handle events). + +2004-01-04 David Schleef + + Fix the fixate functions to handle new prototype: + * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_src_fixate): + * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): + * sys/ximage/ximagesink.c: (gst_ximagesink_fixate): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate): + +2004-01-04 Benjamin Otte + + * sys/ximage/ximagesink.h: + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy), (gst_ximagesink_sinkconnect), + (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_xoverlay_init): + assorted fixes to make (re)embedding work + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect), + (gst_ximagesink_get_desired_size): + implement desired size additions to XOverlay + +2004-01-04 Benjamin Otte + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init), + (gst_x_overlay_got_xwindow_id), (gst_x_overlay_get_desired_size), + (gst_x_overlay_got_desired_size): + * gst-libs/gst/xoverlay/xoverlay.h: + Add optional "desired size" signal and querying. + +2004-01-04 Ronald Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix EBML-laced block parsing. Diffs are relative to previous + lace, not the first lace. Thanks to Mosu from the Matroska + team for detecting this. + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt), (gst_wavparse_getcaps), + (gst_wavparse_handle_sink_event), (gst_wavparse_loop), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + Quickfix for capsnego. + +2004-01-04 Ronald Bultje + + * gst/wavenc/gstwavenc.c: (set_property), (gst_wavenc_init): + Fix indenting, fix pad creation. + +2004-01-04 Ronald Bultje + + * ext/xvid/gstxviddec.c: (gst_xviddec_init), + (gst_xviddec_src_getcaps), (gst_xviddec_src_link), + (gst_xviddec_sink_link): + Implement src_getcaps() so proper size caps is negotiated. + +2004-01-04 Ronald Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_loop): + Finish flac decoder on EOS. See #116178. + +2004-01-04 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_src_getcaps), + (gst_matroska_demux_add_stream): + * gst/matroska/matroska-ids.h: + Add getcaps() function to fix capsnego... + +2004-01-04 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Fix more integer overflows. Again, see #126967. + +2004-01-03 Ronald Bultje + + * ext/mpeg2dec/gstmpeg2dec.c: + Add support for mpeg2dec-0.4.0 (released two weeks ago). See + #130416. + +2004-01-03 Ronald Bultje + + * configure.ac: + * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_error), + (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): + * ext/xvid/gstxvid.h: + * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), + (gst_xviddec_init), (gst_xviddec_setup), (gst_xviddec_chain), + (gst_xviddec_src_link), (gst_xviddec_sink_link), + (gst_xviddec_change_state): + * ext/xvid/gstxviddec.h: + * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), + (gst_xvidenc_base_init), (gst_xvidenc_class_init), + (gst_xvidenc_init), (gst_xvidenc_setup), (gst_xvidenc_chain), + (gst_xvidenc_link), (gst_xvidenc_set_property), + (gst_xvidenc_get_property), (gst_xvidenc_change_state): + * ext/xvid/gstxvidenc.h: + Update xvid plugin to latest xvid (1.0.0-beta3) API. + +2004-01-03 Ronald Bultje + + * gst/rtp/rtp-packet.c: + Add sys/types.h include, since OS X doesn't define in_addr_t + in netinet/in.h, like it does on Linux (see #129600). + +2004-01-03 Thomas Canty + + reviewed by: Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_dispose): + Correct logic of dispose function (see #129306). + +2004-01-03 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), + (gst_mpeg_parse_init): + * gst/mpegstream/gstmpegparse.h: + Remove clock (which was never provided, i.e. dead code), and + also fix integer overflows at high PTS values (see #126967). + +2004-01-03 Ronald Bultje + + * ext/flac/gstflacdec.c: + * ext/libpng/gstpngenc.h: + * ext/mikmod/gstmikmod.h: + OS X fixes (see #126628). + +2004-01-02 David Schleef + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_pad_factory), + (gst_alsa_src_base_init): Remove bogus "src" request pad. + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_base_init), + (gst_mpeg_parse_class_init): Move pad template registration + to class_init, since the derived class (mpegdemux) doesn't + want them. + +2004-01-03 Ronald Bultje + + * sys/ximage/Makefile.am: + * sys/xvideo/Makefile.am: + * sys/xvimage/Makefile.am: + Move interface libs from LDFLAGS to LIBADD, fix relocation errors + after installation (see #127664). + +2004-01-02 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), + (gst_ffmpegenc_connect): Negotiation fixes. + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): + Remove inappropriate gst_caps_free(). + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Reenable Ronald's internal resize code, since the core handles + it correctly now. + +2004-01-02 Ronald Bultje + + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init), (gst_v4lsrc_init): + Fix pad template stuff. + +2004-01-02 Ronald Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_sint): + * gst/matroska/ebml-write.c: (gst_ebml_write_sint): + fix signed integer reading/writing. + +2004-01-02 Benjamin Otte + + * ext/alsa/README: + Remove outdated document + +2004-01-03 Jan Schmidt + + * gst/cutter/gstcutter.c: (gst_cutter_init): + src pad was being created twice - oops. + +2004-01-02 Ronald Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Comment out internal resize. It doesn't handle the resulting + XEvent internally, does another try_set_caps() which leads to + a really nice loop. + Real fix will come when Julien and Dave are awake. ;). + +2004-01-02 Ronald Bultje + + * ext/mpeg2enc/gstmpeg2enc.cc: + fix const/nonconst compile issue. + +2004-01-02 David Schleef + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate), + (gst_xvimagesink_sinkconnect), (gst_xvimagesink_init): + Add fixate function and a check for bad formats. + +2004-01-01 David Schleef + + Negotiation fixes: + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link), + (gst_audiofilter_init): + * gst/debug/efence.c: (gst_efence_init): + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), + (gst_deinterlace_init): + * gst/volume/gstvolume.c: (volume_connect): + +2004-01-01 David Schleef + + Convert elements to use gst_pad_use_explicit_caps() where + appropriate: + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_reneg): + * ext/audiofile/gstafparse.c: (gst_afparse_init), + (gst_afparse_open_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_init), + (gst_afsrc_open_file): + * ext/esd/esdmon.c: (gst_esdmon_init), (gst_esdmon_get): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init), + (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_init), (gst_flacdec_write): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init), + (gst_gdk_pixbuf_chain): + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init), (gst_jpegdec_link), + (gst_jpegdec_chain): + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), + (gst_mikmod_negotiate): + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_negotiate_format): + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/speex/gstspeexdec.c: (gst_speexdec_init), + (gst_speexdec_sinkconnect): + * ext/swfdec/gstswfdec.c: (gst_swfdec_loop), (gst_swfdec_init): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_init), + (gst_vorbisfile_new_link): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_init), + (gst_ac3parse_chain): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_audio_stream), + (gst_asf_demux_setup_pad): + * gst/auparse/gstauparse.c: (gst_auparse_init), + (gst_auparse_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (mp1videoparse_parse_seq): + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init), + (bpf_from_header): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_lpcm_set_caps): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), + (gst_mpeg_parse_send_data): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt): + +2004-01-01 Ronald Bultje + + * configure.ac: + Fix configure check for mpeg2enc. We need 1.6.1.93 instead of + 1.6.1.92, since the pkg-config file of 1.6.1.92 is borked and + it therefore uses the wrong include paths. Too bad... Note + that 1.6.1.93 is not release yet. ;). + Also add a check for mplex, which is now using the lib'ified + mplex from mjpegtools, too. + * ext/ffmpeg/gstffmpegcodecmap.c: + Add codec_tag for 3ivx/xvid. For xvid, this should fix playback + issues. I don't think ffmpeg handles 3ivx correctly, so this + probably won't work. But it won't hurt either. + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_connect), + (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), + (gst_ffmpegenc_chain_audio): + Fix memleak in audio encoding. Close codec if open fails, this + calls the cleanup routines so we can re-use the context. + * ext/mpeg2enc/gstmpeg2enc.cc: + Fix pad template names/types, fix memory issue with getcaps(). + * ext/mpeg2enc/gstmpeg2encoder.cc: + * ext/mpeg2enc/gstmpeg2encoder.hh: + Fix compile issue with new caps system (const thingy). + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.hh: + We read a first frame right on initing, so that we have a caps + when we init the output. This caps is cached in padprivate and + read as first frame. + * ext/mplex/Makefile.am: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplex.h: + * ext/mplex/gstmplex.hh: + * ext/mplex/gstmplexibitstream.cc: + * ext/mplex/gstmplexibitstream.hh: + * ext/mplex/gstmplexjob.cc: + * ext/mplex/gstmplexjob.hh: + * ext/mplex/gstmplexoutputstream.cc: + * ext/mplex/gstmplexoutputstream.hh: + We wrap mjpegtools mplex. So I rewrote the plugin. The old plugin + had issues, didn't do capsnego, supported only a subset of the + mplex features and required a mplex fork in our local CVS. Plus + that it worked agaist a very old mplex version. Rewriting was + faster than updating it. + * gst-libs/ext/Makefile.am: + * gst-libs/ext/mplex/INSTRUCT: + * gst-libs/ext/mplex/Makefile.am: + * gst-libs/ext/mplex/README: + * gst-libs/ext/mplex/TODO: + * gst-libs/ext/mplex/ac3strm_in.cc: + * gst-libs/ext/mplex/audiostrm.hh: + * gst-libs/ext/mplex/audiostrm_out.cc: + * gst-libs/ext/mplex/aunit.hh: + * gst-libs/ext/mplex/bits.cc: + * gst-libs/ext/mplex/bits.hh: + * gst-libs/ext/mplex/buffer.cc: + * gst-libs/ext/mplex/buffer.hh: + * gst-libs/ext/mplex/fastintfns.h: + * gst-libs/ext/mplex/format_codes.h: + * gst-libs/ext/mplex/inputstrm.cc: + * gst-libs/ext/mplex/inputstrm.hh: + * gst-libs/ext/mplex/lpcmstrm_in.cc: + * gst-libs/ext/mplex/mjpeg_logging.cc: + * gst-libs/ext/mplex/mjpeg_logging.h: + * gst-libs/ext/mplex/mjpeg_types.h: + * gst-libs/ext/mplex/mpastrm_in.cc: + * gst-libs/ext/mplex/mpegconsts.cc: + * gst-libs/ext/mplex/mpegconsts.h: + * gst-libs/ext/mplex/mplexconsts.hh: + * gst-libs/ext/mplex/multplex.cc: + * gst-libs/ext/mplex/outputstream.hh: + * gst-libs/ext/mplex/padstrm.cc: + * gst-libs/ext/mplex/padstrm.hh: + * gst-libs/ext/mplex/stillsstream.cc: + * gst-libs/ext/mplex/stillsstream.hh: + * gst-libs/ext/mplex/systems.cc: + * gst-libs/ext/mplex/systems.hh: + * gst-libs/ext/mplex/vector.cc: + * gst-libs/ext/mplex/vector.hh: + * gst-libs/ext/mplex/videostrm.hh: + * gst-libs/ext/mplex/videostrm_in.cc: + * gst-libs/ext/mplex/videostrm_out.cc: + * gst-libs/ext/mplex/yuv4mpeg.cc: + * gst-libs/ext/mplex/yuv4mpeg.h: + * gst-libs/ext/mplex/yuv4mpeg_intern.h: + * gst-libs/ext/mplex/yuv4mpeg_ratio.cc: + We don't fork mjpegtools' mplex in our CVS anymore. + * gst/avi/gstavidemux.c: (gst_avi_demux_src_getcaps), + (gst_avi_demux_add_stream): + * gst/avi/gstavidemux.h: + Add getcaps() function for proper caps nego. This makes some + parts of AVI playback/reading work. + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Resize window on new capsnego. This is probably wrong, but + I'm still committing it because with current capsnego, the + first successfull capsnego is auto-fixated, therefore rounded + down to the lowest values in the caps. this results in a 16x16 + XWindow that is not reized when real capsnego finishes. + Dave, I see more cases of this, do you know a proper solution? + * tools/gst-launch-ext.in: + Fix MPEG-4 AAC (Apple iPod/iTunes) file commandline. + +2003-12-31 David Schleef + + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): + Change gst_pad_proxy_link() to gst_pad_try_set_caps() + +2003-12-30 David Schleef + + * ext/ffmpeg/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_init), + (gst_ffmpegcsp_chain): Negotiation fixes + * ext/mad/gstmad.c: (gst_mad_chain): Negotiation fixes + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), + (gst_audio_convert_link), (gst_audio_convert_channels): + * gst/audioscale/gstaudioscale.c: (gst_audioscale_getcaps), + (gst_audioscale_link), (gst_audioscale_get_buffer), + (gst_audioscale_chain): Negotiation fixes + * gst/audioscale/gstaudioscale.h: + * gst/videofilter/gstvideofilter.c: + (gst_videofilter_format_get_structure), (gst_videofilter_getcaps), + (gst_videofilter_link), (gst_videofilter_init), + (gst_videofilter_set_output_size), (gst_videofilter_setup), + (gst_videofilter_find_format_by_structure): + * gst/videofilter/gstvideofilter.h: Negotiation fixes + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), + (gst_videoscale_link): + * gst/videoscale/videoscale.c: (videoscale_get_structure), + (videoscale_find_by_structure), (gst_videoscale_setup): + * gst/videoscale/videoscale.h: Negotiation fixes + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_fixate), (gst_ximagesink_init): Add a fixate + function, restrict resizing to a multiple of 4 (hack until + everyone supports odd sizes correctly). + +2003-12-29 Colin Walters + + * ext/esd/esdsink.c (gst_esdsink_link): Fix typo; get depth instead of + signed. + +2003-12-30 Jan Schmidt + + * ext/sndfile/gstsf.c: (gst_sf_loop): + Fix warning about discarding const qualifier + +2003-12-27 Jeremy Simon + + * gst/cutter/gstcutter.c: + * gst/videoscale/gstvideoscale.c: + * gst/volenv/gstvolenv.c: + * gst-libs/gst/audio/audio.c: + * gst-libs/gst/video/video.c: + Fix warnings + +2003-12-27 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio): + Don't send ALSA debugging to stderr. + * ext/alsa/gstalsa.h: + Use GST_WARNING instead of g_warning when ALSA functions fail. + +2003-12-27 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + Free XVAdapterInfo correctly. + +2003-12-27 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), + (gst_id3_tag_do_caps_nego), (gst_id3_tag_src_link): + Make id3tag use correct caps nego. + +2003-12-27 Amaury Jacquot + + * ext/ivorbis/vorbis.c: + * ext/ivorbis/vorbisenc.h: + * ext/ivorbis/vorbisfile.c: + Modify so that it uses the new caps things + +2003-12-27 Benjamin Otte + + * testsuite/spider/spider1.c: (main): + * testsuite/spider/spider2.c: (main): + * testsuite/spider/spider3.c: (main): + Make tests compile again. They probably don't work. + +2003-12-24 Colin Walters + + * sys/oss/gstosssink.c (gst_osssink_sink_fixate): Return NULL if + we can't fixate the caps anymore. + +2003-12-23 David Schleef + + * gst/volume/gstvolume.c: (volume_init): Proxy getcaps. + * sys/oss/gstosssink.c: (gst_osssink_init), + (gst_osssink_sink_fixate): Add fixate function. + +2003-12-24 Ronald Bultje + + * ext/ffmpeg/gstffmpegcodecmap.c: + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_srcconnect_func), (gst_ffmpegcsp_sinkconnect), + (gst_ffmpegcsp_srcconnect), (gst_ffmpegcsp_get_type), + (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), + (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), + (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), + (gst_ffmpegcsp_get_property), (gst_ffmpegcsp_register): + fix typo in RGB masks, and move back to "old" colorspace + capsnego code until whoever wrote this new crap has actually + tested it so that it works. + And yes, this works, keep it that way please. + +2003-12-23 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_base_init), + (gst_divxdec_init), (gst_divxdec_negotiate): + * ext/divx/gstdivxdec.h: + * ext/divx/gstdivxenc.c: (gst_divxenc_base_init), + (gst_divxenc_init): + * ext/faac/gstfaac.c: (gst_faac_base_init), (gst_faac_init), + (gst_faac_sinkconnect), (gst_faac_srcconnect): + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encoder.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_base_init), + (dxr3audiosink_init), (dxr3audiosink_pcm_sinklink): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_base_init), + (dxr3spusink_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_base_init), + (dxr3videosink_init): + Fix caps breakage after Dave's caps branch merge. + +2003-12-23 Ronald Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + Fix for 24bpp display. + +2003-12-23 Colin Walters + + * ext/gnomevfs/gstgnomevfssink.c: Add ARG_HANDLE property that takes + a GnomeVFSHandle directly. + +2003-12-22 Benjamin Otte + + * gst/volume/Makefile.am: + * gst/volume/gstvolume.c: (volume_connect), (volume_parse_caps), + (volume_base_init), (volume_init): + Reenable volume element and fix to work with new caps stuff. + Rhythmbox needs this. + +2003-12-22 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (plugin_init): + qtdemux requires bytestream + +2003-12-22 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_link): + Fix remaining caps handling errors due to CAPS merge. + +2003-12-22 Benjamin Otte + + * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_init), + (gst_faad_sinkconnect), (gst_faad_srcgetcaps), + (gst_faad_srcconnect): + Port to new caps system. + +2003-12-21 Julien MOUTTE + + * examples/gstplay/player.c: (got_time_tick), (got_stream_length), + (got_video_size), (main): using g_print instead of g_message. + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup): Fixing EOS + signal which was not emitted because of "switch" element added to the + bin but not connected. (Removing from the bin temporarily) + +2003-12-21 Julien MOUTTE + + * configure.ac: X_DISPLAY_MISSING is set to 1 if AC_PATH_XTRA fails to + find X development files. I don't understand the previous tests and + they fail on my debian/ppc unstable. This one works. + * examples/gstplay/player.c: (main): Set the pipeline to READY before + exiting. + * gst-libs/gst/play/gstplay.c: (gst_play_get_length_callback), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization): Add some safety checks in set_ methods + and state_change. This was throwing some ugly CRITICAL messages when + pipeline was getting disposed and casts were failing. + +2003-12-21 Ronald Bultje + + * configure.ac: + Improve mpeg2enc detection. This is for distributions that do + ship mjpegtools, but without mpeg2enc. Also does object check + for might there ever be ABI incompatibility. + * ext/mpeg2enc/gstmpeg2enc.cc: + Add Andrew as second maintainer (he's helping me), and also add + an error if no caps was set. This happens if I pull before capsnego + and that's something I should solve sometime else. + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix time parsing. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link), + (gst_matroska_mux_track_header): + Add caps to templates. + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_sink_factory): + Add mpegversion=1 to prevent confusion with MPEG/AAC. + * gst/mpegstream/gstmpegdemux.c: + Remove layer since it causes warnings about unfixed caps. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + Fix obvious typo (we error out if caps were set, we should of + course error out if *no* caps were set). + * sys/oss/gstosselement.c: (gst_osselement_convert): + Fix format conversion, we confused bits/bytes. + * sys/oss/gstosselement.h: + Improve documentation for 'bps'. + * sys/v4l/TODO: + Remove stuff about plugins that need removing - this was done + ages ago. + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init), + (gst_v4lmjpegsrc_src_convert), (gst_v4lmjpegsrc_src_query): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_src_convert), + (gst_v4lsrc_src_query): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), + (gst_v4l2src_src_convert), (gst_v4l2src_src_query): + Add get_query_types(), get_formats() and query() functions. + +2003-12-21 Thomas Vander Stichele + + * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins + * moved CVS to freedesktop.org + diff --git a/docs/random/LICENSE b/docs/random/LICENSE new file mode 100644 index 0000000000..696b1c1b22 --- /dev/null +++ b/docs/random/LICENSE @@ -0,0 +1,18 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ diff --git a/docs/random/PORTED_09 b/docs/random/PORTED_09 new file mode 100644 index 0000000000..92c40fa8ce --- /dev/null +++ b/docs/random/PORTED_09 @@ -0,0 +1,17 @@ +When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep. + +List of ported plugins (update when you commit a ported plugin): +effectv (wim) +mad (wim) +videofilter (wim) +aalib (wim) +libcaca (zeeshan) +law (wim) +shout2 (zaheer) - not fully tested +esdsink (arwed) + +osssink is partially done in the threaded branch (wim) + +- Remember that some plugins are already ported and now in the gst-plugins-base module. + +When you have ported a plugin remember to copy the relevant parts from configure.ac.orig into configure.ac and re-enable it in the Makefile.am files. diff --git a/docs/sitemap.txt b/docs/sitemap.txt new file mode 100644 index 0000000000..058a2713a4 --- /dev/null +++ b/docs/sitemap.txt @@ -0,0 +1 @@ +gst-index diff --git a/ext/a52dec/gsta52dec.c b/ext/a52dec/gsta52dec.c new file mode 100644 index 0000000000..5beba90d65 --- /dev/null +++ b/ext/a52dec/gsta52dec.c @@ -0,0 +1,848 @@ +/* GStreamer + * Copyright (C) <2001> David I. Lehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-a52dec + * @title: a52dec + * + * Dolby Digital (AC-3) audio decoder. + * + * ## Example launch line + * |[ + * gst-launch-1.0 dvdreadsrc title=1 ! mpegpsdemux ! a52dec ! audioconvert ! audioresample ! autoaudiosink + * ]| Play audio part of a dvd title. + * |[ + * gst-launch-1.0 filesrc location=abc.ac3 ! ac3parse ! a52dec ! audioconvert ! audioresample ! autoaudiosink + * ]| Decode and play a stand alone AC-3 file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_STDINT_H +#include +#endif + +#include + +#include +#if !defined(A52_ACCEL_DETECT) +# include +#endif +#include "gsta52dec.h" + +#if HAVE_ORC +#include +#endif + +#ifdef LIBA52_DOUBLE +#define SAMPLE_WIDTH 64 +#define SAMPLE_FORMAT GST_AUDIO_NE(F64) +#define SAMPLE_TYPE GST_AUDIO_FORMAT_F64 +#else +#define SAMPLE_WIDTH 32 +#define SAMPLE_FORMAT GST_AUDIO_NE(F32) +#define SAMPLE_TYPE GST_AUDIO_FORMAT_F32 +#endif + +GST_DEBUG_CATEGORY_STATIC (a52dec_debug); +#define GST_CAT_DEFAULT (a52dec_debug) + +/* A52Dec args */ +enum +{ + ARG_0, + ARG_DRC, + ARG_MODE, + ARG_LFE, +}; + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-ac3; audio/ac3; audio/x-private1-ac3") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " SAMPLE_FORMAT ", " + "layout = (string) interleaved, " + "rate = (int) [ 4000, 96000 ], " "channels = (int) [ 1, 6 ]") + ); + +static gboolean a52_element_init (GstPlugin * plugin); + +#define gst_a52dec_parent_class parent_class +G_DEFINE_TYPE (GstA52Dec, gst_a52dec, GST_TYPE_AUDIO_DECODER); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (a52dec, a52_element_init); + +static gboolean gst_a52dec_start (GstAudioDecoder * dec); +static gboolean gst_a52dec_stop (GstAudioDecoder * dec); +static gboolean gst_a52dec_set_format (GstAudioDecoder * bdec, GstCaps * caps); +static GstFlowReturn gst_a52dec_parse (GstAudioDecoder * dec, + GstAdapter * adapter, gint * offset, gint * length); +static GstFlowReturn gst_a52dec_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); + +static GstFlowReturn gst_a52dec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static void gst_a52dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_a52dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +#define GST_TYPE_A52DEC_MODE (gst_a52dec_mode_get_type()) +static GType +gst_a52dec_mode_get_type (void) +{ + static GType a52dec_mode_type = 0; + static const GEnumValue a52dec_modes[] = { + {A52_MONO, "Mono", "mono"}, + {A52_STEREO, "Stereo", "stereo"}, + {A52_3F, "3 Front", "3f"}, + {A52_2F1R, "2 Front, 1 Rear", "2f1r"}, + {A52_3F1R, "3 Front, 1 Rear", "3f1r"}, + {A52_2F2R, "2 Front, 2 Rear", "2f2r"}, + {A52_3F2R, "3 Front, 2 Rear", "3f2r"}, + {A52_DOLBY, "Dolby", "dolby"}, + {0, NULL, NULL}, + }; + + if (!a52dec_mode_type) { + a52dec_mode_type = g_enum_register_static ("GstA52DecMode", a52dec_modes); + } + return a52dec_mode_type; +} + +static void +gst_a52dec_class_init (GstA52DecClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstAudioDecoderClass *gstbase_class; + guint cpuflags = 0; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbase_class = (GstAudioDecoderClass *) klass; + + gobject_class->set_property = gst_a52dec_set_property; + gobject_class->get_property = gst_a52dec_get_property; + + gstbase_class->start = GST_DEBUG_FUNCPTR (gst_a52dec_start); + gstbase_class->stop = GST_DEBUG_FUNCPTR (gst_a52dec_stop); + gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_a52dec_set_format); + gstbase_class->parse = GST_DEBUG_FUNCPTR (gst_a52dec_parse); + gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_a52dec_handle_frame); + + /** + * GstA52Dec::drc + * + * Set to true to apply the recommended Dolby Digital dynamic range compression + * to the audio stream. Dynamic range compression makes loud sounds + * softer and soft sounds louder, so you can more easily listen + * to the stream without disturbing other people. + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DRC, + g_param_spec_boolean ("drc", "Dynamic Range Compression", + "Use Dynamic Range Compression", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstA52Dec::mode + * + * Force a particular output channel configuration from the decoder. By default, + * the channel downmix (if any) is chosen automatically based on the downstream + * capabilities of the pipeline. + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODE, + g_param_spec_enum ("mode", "Decoder Mode", "Decoding Mode (default 3f2r)", + GST_TYPE_A52DEC_MODE, A52_3F2R, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstA52Dec::lfe + * + * Whether to output the LFE (Low Frequency Emitter) channel of the audio stream. + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LFE, + g_param_spec_boolean ("lfe", "LFE", "LFE", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_add_static_pad_template (gstelement_class, &sink_factory); + gst_element_class_add_static_pad_template (gstelement_class, &src_factory); + gst_element_class_set_static_metadata (gstelement_class, + "ATSC A/52 audio decoder", "Codec/Decoder/Audio/Converter", + "Decodes ATSC A/52 encoded audio streams", + "David I. Lehn "); + + GST_DEBUG_CATEGORY_INIT (a52dec_debug, "a52dec", 0, + "AC3/A52 software decoder"); + + /* If no CPU instruction based acceleration is available, end up using the + * generic software djbfft based one when available in the used liba52 */ +#ifdef MM_ACCEL_DJBFFT + klass->a52_cpuflags = MM_ACCEL_DJBFFT; +#elif defined(A52_ACCEL_DETECT) + klass->a52_cpuflags = A52_ACCEL_DETECT; +#else + klass->a52_cpuflags = 0; +#endif + +#if HAVE_ORC && !defined(A52_ACCEL_DETECT) + cpuflags = orc_target_get_default_flags (orc_target_get_by_name ("mmx")); + if (cpuflags & ORC_TARGET_MMX_MMX) + klass->a52_cpuflags |= MM_ACCEL_X86_MMX; + if (cpuflags & ORC_TARGET_MMX_3DNOW) + klass->a52_cpuflags |= MM_ACCEL_X86_3DNOW; + if (cpuflags & ORC_TARGET_MMX_MMXEXT) + klass->a52_cpuflags |= MM_ACCEL_X86_MMXEXT; +#endif + + GST_LOG ("CPU flags: a52=%08x, orc=%08x", klass->a52_cpuflags, cpuflags); + + gst_type_mark_as_plugin_api (GST_TYPE_A52DEC_MODE, 0); +} + +static void +gst_a52dec_init (GstA52Dec * a52dec) +{ + a52dec->request_channels = A52_CHANNEL; + a52dec->dynamic_range_compression = FALSE; + + a52dec->state = NULL; + a52dec->samples = NULL; + + gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST + (a52dec), TRUE); + GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (a52dec)); + + /* retrieve and intercept base class chain. + * Quite HACKish, but that's dvd specs/caps for you, + * since one buffer needs to be split into 2 frames */ + a52dec->base_chain = GST_PAD_CHAINFUNC (GST_AUDIO_DECODER_SINK_PAD (a52dec)); + gst_pad_set_chain_function (GST_AUDIO_DECODER_SINK_PAD (a52dec), + GST_DEBUG_FUNCPTR (gst_a52dec_chain)); +} + +static gboolean +gst_a52dec_start (GstAudioDecoder * dec) +{ + GstA52Dec *a52dec = GST_A52DEC (dec); + GstA52DecClass *klass; + static GMutex init_mutex; + + GST_DEBUG_OBJECT (dec, "start"); + + klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec)); + g_mutex_lock (&init_mutex); +#if defined(A52_ACCEL_DETECT) + a52dec->state = a52_init (); + /* This line is just to avoid being accused of not using klass */ + a52_accel (klass->a52_cpuflags & A52_ACCEL_DETECT); +#else + a52dec->state = a52_init (klass->a52_cpuflags); +#endif + g_mutex_unlock (&init_mutex); + + if (!a52dec->state) { + GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), LIBRARY, INIT, (NULL), + ("failed to initialize a52 state")); + return FALSE; + } + + a52dec->samples = a52_samples (a52dec->state); + a52dec->bit_rate = -1; + a52dec->sample_rate = -1; + a52dec->stream_channels = A52_CHANNEL; + a52dec->using_channels = A52_CHANNEL; + a52dec->level = 1; + a52dec->bias = 0; + a52dec->flag_update = TRUE; + + /* call upon legacy upstream byte support (e.g. seeking) */ + gst_audio_decoder_set_estimate_rate (dec, TRUE); + + return TRUE; +} + +static gboolean +gst_a52dec_stop (GstAudioDecoder * dec) +{ + GstA52Dec *a52dec = GST_A52DEC (dec); + + GST_DEBUG_OBJECT (dec, "stop"); + + a52dec->samples = NULL; + if (a52dec->state) { + a52_free (a52dec->state); + a52dec->state = NULL; + } + + return TRUE; +} + +static GstFlowReturn +gst_a52dec_parse (GstAudioDecoder * bdec, GstAdapter * adapter, + gint * _offset, gint * len) +{ + GstA52Dec *a52dec; + const guint8 *data; + gint av, size; + gint length = 0, flags, sample_rate, bit_rate; + GstFlowReturn result = GST_FLOW_EOS; + + a52dec = GST_A52DEC (bdec); + + size = av = gst_adapter_available (adapter); + data = (const guint8 *) gst_adapter_map (adapter, av); + + /* find and read header */ + bit_rate = a52dec->bit_rate; + sample_rate = a52dec->sample_rate; + flags = 0; + while (size >= 7) { + length = a52_syncinfo ((guint8 *) data, &flags, &sample_rate, &bit_rate); + + if (length == 0) { + /* shift window to re-find sync */ + data++; + size--; + } else if (length <= size) { + GST_LOG_OBJECT (a52dec, "Sync: frame size %d", length); + result = GST_FLOW_OK; + break; + } else { + GST_LOG_OBJECT (a52dec, "Not enough data available (needed %d had %d)", + length, size); + break; + } + } + gst_adapter_unmap (adapter); + + *_offset = av - size; + *len = length; + + return result; +} + +static gint +gst_a52dec_channels (int flags, GstAudioChannelPosition * pos) +{ + gint chans = 0; + + if (flags & A52_LFE) { + chans += 1; + if (pos) { + pos[0] = GST_AUDIO_CHANNEL_POSITION_LFE1; + } + } + flags &= A52_CHANNEL_MASK; + switch (flags) { + case A52_3F2R: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; + pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; + pos[4 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; + } + chans += 5; + break; + case A52_2F2R: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; + pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; + } + chans += 4; + break; + case A52_3F1R: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; + pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER; + } + chans += 4; + break; + case A52_2F1R: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER; + } + chans += 3; + break; + case A52_3F: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; + pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + } + chans += 3; + break; + case A52_CHANNEL: /* Dual mono. Should really be handled as 2 src pads */ + case A52_STEREO: + case A52_DOLBY: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + } + chans += 2; + break; + case A52_MONO: + if (pos) { + pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_MONO; + } + chans += 1; + break; + default: + /* error, caller should post error message */ + return 0; + } + + return chans; +} + +static gboolean +gst_a52dec_reneg (GstA52Dec * a52dec) +{ + gint channels; + gboolean result = FALSE; + GstAudioChannelPosition from[6], to[6]; + GstAudioInfo info; + + channels = gst_a52dec_channels (a52dec->using_channels, from); + + if (!channels) + goto done; + + GST_INFO_OBJECT (a52dec, "reneg channels:%d rate:%d", + channels, a52dec->sample_rate); + + memcpy (to, from, sizeof (GstAudioChannelPosition) * channels); + gst_audio_channel_positions_to_valid_order (to, channels); + gst_audio_get_channel_reorder_map (channels, from, to, + a52dec->channel_reorder_map); + + gst_audio_info_init (&info); + gst_audio_info_set_format (&info, + SAMPLE_TYPE, a52dec->sample_rate, channels, (channels > 1 ? to : NULL)); + + if (!gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (a52dec), &info)) + goto done; + + result = TRUE; + +done: + return result; +} + +static void +gst_a52dec_update_streaminfo (GstA52Dec * a52dec) +{ + GstTagList *taglist; + + taglist = gst_tag_list_new_empty (); + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE, + (guint) a52dec->bit_rate, NULL); + + gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (a52dec), taglist, + GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (taglist); +} + +static GstFlowReturn +gst_a52dec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buffer) +{ + GstA52Dec *a52dec; + gint channels, i; + gboolean need_reneg = FALSE; + gint chans; + gint length = 0, flags, sample_rate, bit_rate; + GstMapInfo map; + GstFlowReturn result = GST_FLOW_OK; + GstBuffer *outbuf; + const gint num_blocks = 6; + + a52dec = GST_A52DEC (bdec); + + /* no fancy draining */ + if (G_UNLIKELY (!buffer)) + return GST_FLOW_OK; + + /* parsed stuff already, so this should work out fine */ + gst_buffer_map (buffer, &map, GST_MAP_READ); + g_assert (map.size >= 7); + + /* re-obtain some sync header info, + * should be same as during _parse and could also be cached there, + * but anyway ... */ + bit_rate = a52dec->bit_rate; + sample_rate = a52dec->sample_rate; + flags = 0; + length = a52_syncinfo (map.data, &flags, &sample_rate, &bit_rate); + g_assert (length == map.size); + + /* update stream information, renegotiate or re-streaminfo if needed */ + need_reneg = FALSE; + if (a52dec->sample_rate != sample_rate) { + GST_DEBUG_OBJECT (a52dec, "sample rate changed"); + need_reneg = TRUE; + a52dec->sample_rate = sample_rate; + } + + if (flags) { + if (a52dec->stream_channels != (flags & (A52_CHANNEL_MASK | A52_LFE))) { + GST_DEBUG_OBJECT (a52dec, "stream channel flags changed, marking update"); + a52dec->flag_update = TRUE; + } + a52dec->stream_channels = flags & (A52_CHANNEL_MASK | A52_LFE); + } + + if (bit_rate != a52dec->bit_rate) { + a52dec->bit_rate = bit_rate; + gst_a52dec_update_streaminfo (a52dec); + } + + /* If we haven't had an explicit number of channels chosen through properties + * at this point, choose what to downmix to now, based on what the peer will + * accept - this allows a52dec to do downmixing in preference to a + * downstream element such as audioconvert. + */ + if (a52dec->request_channels != A52_CHANNEL) { + flags = a52dec->request_channels; + } else if (a52dec->flag_update) { + GstCaps *caps; + + a52dec->flag_update = FALSE; + + caps = gst_pad_get_allowed_caps (GST_AUDIO_DECODER_SRC_PAD (a52dec)); + if (caps && gst_caps_get_size (caps) > 0) { + GstCaps *copy = gst_caps_copy_nth (caps, 0); + GstStructure *structure = gst_caps_get_structure (copy, 0); + gint orig_channels = flags ? gst_a52dec_channels (flags, NULL) : 6; + gint fixed_channels = 0; + const int a52_channels[6] = { + A52_MONO, + A52_STEREO, + A52_STEREO | A52_LFE, + A52_2F2R, + A52_2F2R | A52_LFE, + A52_3F2R | A52_LFE, + }; + + /* Prefer the original number of channels, but fixate to something + * preferred (first in the caps) downstream if possible. + */ + gst_structure_fixate_field_nearest_int (structure, "channels", + orig_channels); + + if (gst_structure_get_int (structure, "channels", &fixed_channels) + && fixed_channels <= 6) { + if (fixed_channels < orig_channels) + flags = a52_channels[fixed_channels - 1]; + } else { + flags = a52_channels[5]; + } + + gst_caps_unref (copy); + } else if (flags) + flags = a52dec->stream_channels; + else + flags = A52_3F2R | A52_LFE; + + if (caps) + gst_caps_unref (caps); + } else { + flags = a52dec->using_channels; + } + + /* process */ + flags |= A52_ADJUST_LEVEL; + a52dec->level = 1; + if (a52_frame (a52dec->state, map.data, &flags, &a52dec->level, a52dec->bias)) { + gst_buffer_unmap (buffer, &map); + GST_AUDIO_DECODER_ERROR (a52dec, 1, STREAM, DECODE, (NULL), + ("a52_frame error"), result); + goto exit; + } + gst_buffer_unmap (buffer, &map); + + channels = flags & (A52_CHANNEL_MASK | A52_LFE); + if (a52dec->using_channels != channels) { + need_reneg = TRUE; + a52dec->using_channels = channels; + } + + /* negotiate if required */ + if (need_reneg) { + GST_DEBUG_OBJECT (a52dec, + "a52dec reneg: sample_rate:%d stream_chans:%d using_chans:%d", + a52dec->sample_rate, a52dec->stream_channels, a52dec->using_channels); + if (!gst_a52dec_reneg (a52dec)) + goto failed_negotiation; + } + + if (a52dec->dynamic_range_compression == FALSE) { + a52_dynrng (a52dec->state, NULL, NULL); + } + + flags &= (A52_CHANNEL_MASK | A52_LFE); + chans = gst_a52dec_channels (flags, NULL); + if (!chans) + goto invalid_flags; + + /* handle decoded data; + * each frame has 6 blocks, one block is 256 samples, ea */ + outbuf = + gst_buffer_new_and_alloc (256 * chans * (SAMPLE_WIDTH / 8) * num_blocks); + + gst_buffer_map (outbuf, &map, GST_MAP_WRITE); + { + guint8 *ptr = map.data; + for (i = 0; i < num_blocks; i++) { + if (a52_block (a52dec->state)) { + /* also marks discont */ + GST_AUDIO_DECODER_ERROR (a52dec, 1, STREAM, DECODE, (NULL), + ("error decoding block %d", i), result); + if (result != GST_FLOW_OK) { + gst_buffer_unmap (outbuf, &map); + gst_buffer_unref (outbuf); + goto exit; + } + } else { + gint n, c; + gint *reorder_map = a52dec->channel_reorder_map; + + for (n = 0; n < 256; n++) { + for (c = 0; c < chans; c++) { + ((sample_t *) ptr)[n * chans + reorder_map[c]] = + a52dec->samples[c * 256 + n]; + } + } + } + ptr += 256 * chans * (SAMPLE_WIDTH / 8); + } + } + gst_buffer_unmap (outbuf, &map); + + result = gst_audio_decoder_finish_frame (bdec, outbuf, 1); + +exit: + return result; + + /* ERRORS */ +failed_negotiation: + { + GST_ELEMENT_ERROR (a52dec, CORE, NEGOTIATION, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +invalid_flags: + { + GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL), + ("Invalid channel flags: %d", flags)); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_a52dec_set_format (GstAudioDecoder * bdec, GstCaps * caps) +{ + GstA52Dec *a52dec = GST_A52DEC (bdec); + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + if (structure && gst_structure_has_name (structure, "audio/x-private1-ac3")) + a52dec->dvdmode = TRUE; + else + a52dec->dvdmode = FALSE; + + return TRUE; +} + +static GstFlowReturn +gst_a52dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstA52Dec *a52dec = GST_A52DEC (parent); + GstFlowReturn ret = GST_FLOW_OK; + gint first_access; + + if (a52dec->dvdmode) { + gsize size; + guint8 data[2]; + gint offset; + gint len; + GstBuffer *subbuf; + + size = gst_buffer_get_size (buf); + if (size < 2) + goto not_enough_data; + + gst_buffer_extract (buf, 0, data, 2); + first_access = (data[0] << 8) | data[1]; + + /* Skip the first_access header */ + offset = 2; + + if (first_access > 1) { + /* Length of data before first_access */ + len = first_access - 1; + + if (len <= 0 || offset + len > size) + goto bad_first_access_parameter; + + subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset, len); + GST_BUFFER_TIMESTAMP (subbuf) = GST_CLOCK_TIME_NONE; + ret = a52dec->base_chain (pad, parent, subbuf); + if (ret != GST_FLOW_OK) { + gst_buffer_unref (buf); + goto done; + } + + offset += len; + len = size - offset; + + if (len > 0) { + subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset, len); + GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf); + + ret = a52dec->base_chain (pad, parent, subbuf); + } + gst_buffer_unref (buf); + } else { + /* first_access = 0 or 1, so if there's a timestamp it applies to the first byte */ + subbuf = + gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset, + size - offset); + GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf); + gst_buffer_unref (buf); + ret = a52dec->base_chain (pad, parent, subbuf); + } + } else { + ret = a52dec->base_chain (pad, parent, buf); + } + +done: + return ret; + +/* ERRORS */ +not_enough_data: + { + GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL), + ("Insufficient data in buffer. Can't determine first_acess")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +bad_first_access_parameter: + { + GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL), + ("Bad first_access parameter (%d) in buffer", first_access)); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static void +gst_a52dec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstA52Dec *src = GST_A52DEC (object); + + switch (prop_id) { + case ARG_DRC: + GST_OBJECT_LOCK (src); + src->dynamic_range_compression = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (src); + break; + case ARG_MODE: + GST_OBJECT_LOCK (src); + src->request_channels &= ~A52_CHANNEL_MASK; + src->request_channels |= g_value_get_enum (value); + GST_OBJECT_UNLOCK (src); + break; + case ARG_LFE: + GST_OBJECT_LOCK (src); + src->request_channels &= ~A52_LFE; + src->request_channels |= g_value_get_boolean (value) ? A52_LFE : 0; + GST_OBJECT_UNLOCK (src); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_a52dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstA52Dec *src = GST_A52DEC (object); + + switch (prop_id) { + case ARG_DRC: + GST_OBJECT_LOCK (src); + g_value_set_boolean (value, src->dynamic_range_compression); + GST_OBJECT_UNLOCK (src); + break; + case ARG_MODE: + GST_OBJECT_LOCK (src); + g_value_set_enum (value, src->request_channels & A52_CHANNEL_MASK); + GST_OBJECT_UNLOCK (src); + break; + case ARG_LFE: + GST_OBJECT_LOCK (src); + g_value_set_boolean (value, src->request_channels & A52_LFE); + GST_OBJECT_UNLOCK (src); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +a52_element_init (GstPlugin * plugin) +{ +#if HAVE_ORC + orc_init (); +#endif + + return gst_element_register (plugin, "a52dec", GST_RANK_SECONDARY, + GST_TYPE_A52DEC); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (a52dec, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + a52dec, + "Decodes ATSC A/52 encoded audio streams", + plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/a52dec/gsta52dec.h b/ext/a52dec/gsta52dec.h new file mode 100644 index 0000000000..c50450e44d --- /dev/null +++ b/ext/a52dec/gsta52dec.h @@ -0,0 +1,105 @@ +/* GStreamer + * Copyright (C) <2001> David I. Lehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_A52DEC_H__ +#define __GST_A52DEC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_A52DEC \ + (gst_a52dec_get_type()) +#define GST_A52DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_A52DEC,GstA52Dec)) +#define GST_A52DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_A52DEC,GstA52DecClass)) +#define GST_IS_A52DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_A52DEC)) +#define GST_IS_A52DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_A52DEC)) + +typedef struct _GstA52Dec GstA52Dec; +typedef struct _GstA52DecClass GstA52DecClass; + +struct _GstA52Dec { + GstAudioDecoder element; + + GstPadChainFunction base_chain; + + gboolean dvdmode; + gboolean flag_update; + int prev_flags; + + /* stream properties */ + int bit_rate; + int sample_rate; + int stream_channels; + int request_channels; + int using_channels; + + gint channel_reorder_map[6]; + + sample_t level; + sample_t bias; + gboolean dynamic_range_compression; + sample_t *samples; + a52_state_t *state; +}; + +struct _GstA52DecClass { + GstAudioDecoderClass parent_class; + + guint32 a52_cpuflags; +}; + +GType gst_a52dec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (a52dec); + +#ifndef A52_MONO +#define A52_MONO 1 +#endif +#ifndef A52_STEREO +#define A52_STEREO 2 +#endif +#ifndef A52_3F +#define A52_3F 3 +#endif +#ifndef A52_2F1R +#define A52_2F1R 4 +#endif +#ifndef A52_3F1R +#define A52_3F1R 5 +#endif +#ifndef A52_2F2R +#define A52_2F2R 6 +#endif +#ifndef A52_3F2R +#define A52_3F2R 7 +#endif +#ifndef A52_DOLBY +#define A52_DOLBY 10 +#endif + +G_END_DECLS + +#endif /* __GST_A52DEC_H__ */ diff --git a/ext/a52dec/meson.build b/ext/a52dec/meson.build new file mode 100644 index 0000000000..843bef0910 --- /dev/null +++ b/ext/a52dec/meson.build @@ -0,0 +1,22 @@ +if get_option('a52dec').disabled() + subdir_done() +endif + +a52_dep = cc.find_library('a52', required : get_option('a52dec')) +have_a52_h = cc.has_header_symbol('a52dec/a52.h', 'a52_init', prefix : '#include ') +if not have_a52_h and get_option('a52dec').enabled() + error('a52dec plugin enabled but a52.h not found') +endif + +if a52_dep.found() and have_a52_h + a52dec = library('gsta52dec', + 'gsta52dec.c', + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstaudio_dep, orc_dep, a52_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(a52dec, install_dir : plugins_pkgconfig_install_dir) + plugins += [a52dec] +endif diff --git a/ext/amrnb/GstAmrnbEnc.prs b/ext/amrnb/GstAmrnbEnc.prs new file mode 100644 index 0000000000..69e3719dd1 --- /dev/null +++ b/ext/amrnb/GstAmrnbEnc.prs @@ -0,0 +1,11 @@ +[_presets_] +version=0.10 +element-name=GstAmrnbEnc + +[enhance-size] +_meta/comment=Maximize compression, lowest bitrate +band-mode=0 + +[enhance-quality] +_meta/comment=Maximize quality, highest bitrate +band-mode=7 diff --git a/ext/amrnb/README b/ext/amrnb/README new file mode 100644 index 0000000000..879dbe74e9 --- /dev/null +++ b/ext/amrnb/README @@ -0,0 +1,6 @@ +Compiling AMRNB: +================ + +To compile the amrnb plugin, you need the opencore-amrnb development package. +If your distribution does not provide this package, you can download the +source code from "http://sourceforge.net/projects/opencore-amr". diff --git a/ext/amrnb/amrnb.c b/ext/amrnb/amrnb.c new file mode 100644 index 0000000000..3fe3a00f87 --- /dev/null +++ b/ext/amrnb/amrnb.c @@ -0,0 +1,44 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amrnbdec.h" +#include "amrnbenc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (amrnbdec, plugin); + ret |= GST_ELEMENT_REGISTER (amrnbenc, plugin); + + return ret; +} + + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + amrnb, + "Adaptive Multi-Rate Narrow-Band", + plugin_init, VERSION, GST_LICENSE_UNKNOWN, GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN); diff --git a/ext/amrnb/amrnbdec.c b/ext/amrnb/amrnbdec.c new file mode 100644 index 0000000000..e984fb854b --- /dev/null +++ b/ext/amrnb/amrnbdec.c @@ -0,0 +1,309 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amrnbdec + * @title: amrnbdec + * @see_also: #GstAmrnbEnc, #GstAmrParse + * + * AMR narrowband decoder based on the + * [opencore codec implementation](http://sourceforge.net/projects/opencore-amr). + * + * ## Example launch line + * |[ + * gst-launch-1.0 filesrc location=abc.amr ! amrparse ! amrnbdec ! audioconvert ! audioresample ! autoaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amrnbdec.h" + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, format = (string) " GST_AUDIO_NE (S16) ", " + "layout = (string) interleaved, " + "rate = (int) 8000," "channels = (int) 1") + ); + +GST_DEBUG_CATEGORY_STATIC (gst_amrnbdec_debug); +#define GST_CAT_DEFAULT gst_amrnbdec_debug + +static const gint block_size_if1[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, + 0, 0, 0, 0, 0, 0, 0 +}; + +static const gint block_size_if2[16] = { 12, 13, 15, 17, 18, 20, 25, 30, 5, + 0, 0, 0, 0, 0, 0, 0 +}; + +static GType +gst_amrnb_variant_get_type (void) +{ + static GType gst_amrnb_variant_type = 0; + static const GEnumValue gst_amrnb_variant[] = { + {GST_AMRNB_VARIANT_IF1, "IF1", "IF1"}, + {GST_AMRNB_VARIANT_IF2, "IF2", "IF2"}, + {0, NULL, NULL}, + }; + if (!gst_amrnb_variant_type) { + gst_amrnb_variant_type = + g_enum_register_static ("GstAmrnbVariant", gst_amrnb_variant); + } + return gst_amrnb_variant_type; +} + +#define GST_AMRNB_VARIANT_TYPE (gst_amrnb_variant_get_type()) + +#define VARIANT_DEFAULT GST_AMRNB_VARIANT_IF1 +enum +{ + PROP_0, + PROP_VARIANT +}; + +static void gst_amrnbdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_amrnbdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_amrnbdec_start (GstAudioDecoder * dec); +static gboolean gst_amrnbdec_stop (GstAudioDecoder * dec); +static gboolean gst_amrnbdec_set_format (GstAudioDecoder * dec, GstCaps * caps); +static GstFlowReturn gst_amrnbdec_parse (GstAudioDecoder * dec, + GstAdapter * adapter, gint * offset, gint * length); +static GstFlowReturn gst_amrnbdec_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); + +#define gst_amrnbdec_parent_class parent_class +G_DEFINE_TYPE (GstAmrnbDec, gst_amrnbdec, GST_TYPE_AUDIO_DECODER); +GST_ELEMENT_REGISTER_DEFINE (amrnbdec, "amrnbdec", GST_RANK_PRIMARY, + GST_TYPE_AMRNBDEC); + +static void +gst_amrnbdec_class_init (GstAmrnbDecClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); + + object_class->set_property = gst_amrnbdec_set_property; + object_class->get_property = gst_amrnbdec_get_property; + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_static_metadata (element_class, "AMR-NB audio decoder", + "Codec/Decoder/Audio", + "Adaptive Multi-Rate Narrow-Band audio decoder", + "GStreamer maintainers "); + + base_class->start = GST_DEBUG_FUNCPTR (gst_amrnbdec_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_amrnbdec_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrnbdec_set_format); + base_class->parse = GST_DEBUG_FUNCPTR (gst_amrnbdec_parse); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrnbdec_handle_frame); + + g_object_class_install_property (object_class, PROP_VARIANT, + g_param_spec_enum ("variant", "Variant", + "The decoder variant", GST_AMRNB_VARIANT_TYPE, + VARIANT_DEFAULT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (gst_amrnbdec_debug, "amrnbdec", 0, + "AMR-NB audio decoder"); + + gst_type_mark_as_plugin_api (GST_AMRNB_VARIANT_TYPE, 0); +} + +static void +gst_amrnbdec_init (GstAmrnbDec * amrnbdec) +{ + gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (amrnbdec), TRUE); + gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST + (amrnbdec), TRUE); + GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (amrnbdec)); +} + +static gboolean +gst_amrnbdec_start (GstAudioDecoder * dec) +{ + GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); + + GST_DEBUG_OBJECT (dec, "start"); + if (!(amrnbdec->handle = Decoder_Interface_init ())) + return FALSE; + + amrnbdec->rate = 0; + amrnbdec->channels = 0; + + return TRUE; +} + +static gboolean +gst_amrnbdec_stop (GstAudioDecoder * dec) +{ + GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); + + GST_DEBUG_OBJECT (dec, "stop"); + Decoder_Interface_exit (amrnbdec->handle); + + return TRUE; +} + +static void +gst_amrnbdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAmrnbDec *self = GST_AMRNBDEC (object); + + switch (prop_id) { + case PROP_VARIANT: + self->variant = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + return; +} + +static void +gst_amrnbdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAmrnbDec *self = GST_AMRNBDEC (object); + + switch (prop_id) { + case PROP_VARIANT: + g_value_set_enum (value, self->variant); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + return; +} + +static gboolean +gst_amrnbdec_set_format (GstAudioDecoder * dec, GstCaps * caps) +{ + GstStructure *structure; + GstAmrnbDec *amrnbdec; + GstAudioInfo info; + + amrnbdec = GST_AMRNBDEC (dec); + + structure = gst_caps_get_structure (caps, 0); + + /* get channel count */ + gst_structure_get_int (structure, "channels", &amrnbdec->channels); + gst_structure_get_int (structure, "rate", &amrnbdec->rate); + + /* create reverse caps */ + gst_audio_info_init (&info); + gst_audio_info_set_format (&info, + GST_AUDIO_FORMAT_S16, amrnbdec->rate, amrnbdec->channels, NULL); + + return gst_audio_decoder_set_output_format (dec, &info); +} + +static GstFlowReturn +gst_amrnbdec_parse (GstAudioDecoder * dec, GstAdapter * adapter, + gint * offset, gint * length) +{ + GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); + guint8 head[1]; + guint size; + gboolean sync, eos; + gint block, mode; + + size = gst_adapter_available (adapter); + if (size < 1) + return GST_FLOW_ERROR; + + gst_audio_decoder_get_parse_state (dec, &sync, &eos); + + /* need to peek data to get the size */ + gst_adapter_copy (adapter, head, 0, 1); + + /* get size */ + switch (amrnbdec->variant) { + case GST_AMRNB_VARIANT_IF1: + mode = (head[0] >> 3) & 0x0F; + block = block_size_if1[mode] + 1; + break; + case GST_AMRNB_VARIANT_IF2: + mode = head[0] & 0x0F; + block = block_size_if2[mode] + 1; + break; + default: + g_assert_not_reached (); + return GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (amrnbdec, "mode %d, block %d", mode, block); + + if (block > size) + return GST_FLOW_EOS; + + *offset = 0; + *length = block; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_amrnbdec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) +{ + GstAmrnbDec *amrnbdec; + GstMapInfo inmap, outmap; + GstBuffer *out; + + amrnbdec = GST_AMRNBDEC (dec); + + /* no fancy flushing */ + if (!buffer || !gst_buffer_get_size (buffer)) + return GST_FLOW_OK; + + gst_buffer_map (buffer, &inmap, GST_MAP_READ); + + /* get output */ + out = gst_buffer_new_and_alloc (160 * 2); + /* decode */ + gst_buffer_map (out, &outmap, GST_MAP_WRITE); + Decoder_Interface_Decode (amrnbdec->handle, inmap.data, + (gint16 *) outmap.data, 0); + gst_buffer_unmap (out, &outmap); + + gst_buffer_unmap (buffer, &inmap); + + return gst_audio_decoder_finish_frame (dec, out, 1); +} diff --git a/ext/amrnb/amrnbdec.h b/ext/amrnb/amrnbdec.h new file mode 100644 index 0000000000..25b3db2990 --- /dev/null +++ b/ext/amrnb/amrnbdec.h @@ -0,0 +1,71 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_AMRNBDEC_H__ +#define __GST_AMRNBDEC_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AMRNBDEC \ + (gst_amrnbdec_get_type()) +#define GST_AMRNBDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRNBDEC, GstAmrnbDec)) +#define GST_AMRNBDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRNBDEC, GstAmrnbDecClass)) +#define GST_IS_AMRNBDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRNBDEC)) +#define GST_IS_AMRNBDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRNBDEC)) + +typedef struct _GstAmrnbDec GstAmrnbDec; +typedef struct _GstAmrnbDecClass GstAmrnbDecClass; + +typedef enum +{ + GST_AMRNB_VARIANT_IF1, + GST_AMRNB_VARIANT_IF2 +} GstAmrnbVariant; + +struct _GstAmrnbDec { + GstAudioDecoder element; + + GstAmrnbVariant variant; + + /* library handle */ + void *handle; + + /* output settings */ + gint channels, rate; +}; + +struct _GstAmrnbDecClass { + GstAudioDecoderClass parent_class; +}; + +GType gst_amrnbdec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (amrnbdec); + +G_END_DECLS + +#endif /* __GST_AMRNBDEC_H__ */ diff --git a/ext/amrnb/amrnbenc.c b/ext/amrnb/amrnbenc.c new file mode 100644 index 0000000000..8417326f35 --- /dev/null +++ b/ext/amrnb/amrnbenc.c @@ -0,0 +1,295 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amrnbenc + * @title: amrnbenc + * @see_also: #GstAmrnbDec, #GstAmrnbParse + * + * AMR narrowband encoder based on the + * [opencore codec implementation](http://sourceforge.net/projects/opencore-amr). + * + * ## Example launch line + * |[ + * gst-launch-1.0 filesrc location=abc.wav ! wavparse ! audioconvert ! audioresample ! amrnbenc ! filesink location=abc.amr + * ]| + * Please note that the above stream misses the header, that is needed to play + * the stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amrnbenc.h" + +static GType +gst_amrnbenc_bandmode_get_type (void) +{ + static GType gst_amrnbenc_bandmode_type = 0; + static const GEnumValue gst_amrnbenc_bandmode[] = { + {MR475, "MR475", "MR475"}, + {MR515, "MR515", "MR515"}, + {MR59, "MR59", "MR59"}, + {MR67, "MR67", "MR67"}, + {MR74, "MR74", "MR74"}, + {MR795, "MR795", "MR795"}, + {MR102, "MR102", "MR102"}, + {MR122, "MR122", "MR122"}, + {MRDTX, "MRDTX", "MRDTX"}, + {0, NULL, NULL}, + }; + if (!gst_amrnbenc_bandmode_type) { + gst_amrnbenc_bandmode_type = + g_enum_register_static ("GstAmrnbEncBandMode", gst_amrnbenc_bandmode); + } + return gst_amrnbenc_bandmode_type; +} + +#define GST_AMRNBENC_BANDMODE_TYPE (gst_amrnbenc_bandmode_get_type()) + +#define BANDMODE_DEFAULT MR122 +enum +{ + PROP_0, + PROP_BANDMODE +}; + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, format = (string) " GST_AUDIO_NE (S16) ", " + "layout = (string) interleaved, " + "rate = (int) 8000," "channels = (int) 1") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1") + ); + +GST_DEBUG_CATEGORY_STATIC (gst_amrnbenc_debug); +#define GST_CAT_DEFAULT gst_amrnbenc_debug + +static gboolean gst_amrnbenc_start (GstAudioEncoder * enc); +static gboolean gst_amrnbenc_stop (GstAudioEncoder * enc); +static gboolean gst_amrnbenc_set_format (GstAudioEncoder * enc, + GstAudioInfo * info); +static GstFlowReturn gst_amrnbenc_handle_frame (GstAudioEncoder * enc, + GstBuffer * in_buf); + +#define gst_amrnbenc_parent_class parent_class +G_DEFINE_TYPE (GstAmrnbEnc, gst_amrnbenc, GST_TYPE_AUDIO_ENCODER); +GST_ELEMENT_REGISTER_DEFINE (amrnbenc, "amrnbenc", GST_RANK_SECONDARY, + GST_TYPE_AMRNBENC); + +static void +gst_amrnbenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAmrnbEnc *self = GST_AMRNBENC (object); + + switch (prop_id) { + case PROP_BANDMODE: + self->bandmode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + return; +} + +static void +gst_amrnbenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAmrnbEnc *self = GST_AMRNBENC (object); + + switch (prop_id) { + case PROP_BANDMODE: + g_value_set_enum (value, self->bandmode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + return; +} + +static void +gst_amrnbenc_class_init (GstAmrnbEncClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass); + + object_class->set_property = gst_amrnbenc_set_property; + object_class->get_property = gst_amrnbenc_get_property; + + base_class->start = GST_DEBUG_FUNCPTR (gst_amrnbenc_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_amrnbenc_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrnbenc_set_format); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrnbenc_handle_frame); + + g_object_class_install_property (object_class, PROP_BANDMODE, + g_param_spec_enum ("band-mode", "Band Mode", + "Encoding Band Mode (Kbps)", GST_AMRNBENC_BANDMODE_TYPE, + BANDMODE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_static_metadata (element_class, "AMR-NB audio encoder", + "Codec/Encoder/Audio", + "Adaptive Multi-Rate Narrow-Band audio encoder", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (gst_amrnbenc_debug, "amrnbenc", 0, + "AMR-NB audio encoder"); + + gst_type_mark_as_plugin_api (GST_AMRNBENC_BANDMODE_TYPE, 0); +} + +static void +gst_amrnbenc_init (GstAmrnbEnc * amrnbenc) +{ + GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_ENCODER_SINK_PAD (amrnbenc)); +} + +static gboolean +gst_amrnbenc_start (GstAudioEncoder * enc) +{ + GstAmrnbEnc *amrnbenc = GST_AMRNBENC (enc); + + GST_DEBUG_OBJECT (amrnbenc, "start"); + + if (!(amrnbenc->handle = Encoder_Interface_init (0))) + return FALSE; + + return TRUE; +} + +static gboolean +gst_amrnbenc_stop (GstAudioEncoder * enc) +{ + GstAmrnbEnc *amrnbenc = GST_AMRNBENC (enc); + + GST_DEBUG_OBJECT (amrnbenc, "stop"); + + Encoder_Interface_exit (amrnbenc->handle); + + return TRUE; +} + +static gboolean +gst_amrnbenc_set_format (GstAudioEncoder * enc, GstAudioInfo * info) +{ + GstAmrnbEnc *amrnbenc; + GstCaps *copy; + + amrnbenc = GST_AMRNBENC (enc); + + /* parameters already parsed for us */ + amrnbenc->rate = GST_AUDIO_INFO_RATE (info); + amrnbenc->channels = GST_AUDIO_INFO_CHANNELS (info); + + /* we do not really accept other input, but anyway ... */ + /* this is not wrong but will sound bad */ + if (amrnbenc->channels != 1) { + g_warning ("amrnbdec is only optimized for mono channels"); + } + if (amrnbenc->rate != 8000) { + g_warning ("amrnbdec is only optimized for 8000 Hz samplerate"); + } + + /* create reverse caps */ + copy = gst_caps_new_simple ("audio/AMR", + "channels", G_TYPE_INT, amrnbenc->channels, + "rate", G_TYPE_INT, amrnbenc->rate, NULL); + + gst_audio_encoder_set_output_format (GST_AUDIO_ENCODER (amrnbenc), copy); + gst_caps_unref (copy); + + /* report needs to base class: hand one frame at a time */ + gst_audio_encoder_set_frame_samples_min (enc, 160); + gst_audio_encoder_set_frame_samples_max (enc, 160); + gst_audio_encoder_set_frame_max (enc, 1); + + return TRUE; +} + +static GstFlowReturn +gst_amrnbenc_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) +{ + GstAmrnbEnc *amrnbenc; + GstFlowReturn ret; + GstBuffer *out; + GstMapInfo in_map, out_map; + gsize out_size; + + amrnbenc = GST_AMRNBENC (enc); + + g_return_val_if_fail (amrnbenc->handle, GST_FLOW_FLUSHING); + + /* we don't deal with squeezing remnants, so simply discard those */ + if (G_UNLIKELY (buffer == NULL)) { + GST_DEBUG_OBJECT (amrnbenc, "no data"); + return GST_FLOW_OK; + } + + gst_buffer_map (buffer, &in_map, GST_MAP_READ); + + if (G_UNLIKELY (in_map.size < 320)) { + gst_buffer_unmap (buffer, &in_map); + GST_DEBUG_OBJECT (amrnbenc, "discarding trailing data of %" G_GSIZE_FORMAT + " bytes", in_map.size); + return gst_audio_encoder_finish_frame (enc, NULL, -1); + } + + /* get output, max size is 32 */ + out = gst_buffer_new_and_alloc (32); + /* AMR encoder actually writes into the source data buffers it gets */ + /* should be able to handle that with what we are given */ + + gst_buffer_map (out, &out_map, GST_MAP_WRITE); + /* encode */ + out_size = + Encoder_Interface_Encode (amrnbenc->handle, amrnbenc->bandmode, + (short *) in_map.data, out_map.data, 0); + gst_buffer_unmap (out, &out_map); + gst_buffer_resize (out, 0, out_size); + gst_buffer_unmap (buffer, &in_map); + + GST_LOG_OBJECT (amrnbenc, "output data size %" G_GSIZE_FORMAT, out_size); + + if (out_size) { + ret = gst_audio_encoder_finish_frame (enc, out, 160); + } else { + /* should not happen (without dtx or so at least) */ + GST_WARNING_OBJECT (amrnbenc, "no encoded data; discarding input"); + gst_buffer_unref (out); + ret = gst_audio_encoder_finish_frame (enc, NULL, -1); + } + + return ret; +} diff --git a/ext/amrnb/amrnbenc.h b/ext/amrnb/amrnbenc.h new file mode 100644 index 0000000000..83262e474b --- /dev/null +++ b/ext/amrnb/amrnbenc.h @@ -0,0 +1,67 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_AMRNBENC_H__ +#define __GST_AMRNBENC_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AMRNBENC \ + (gst_amrnbenc_get_type()) +#define GST_AMRNBENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRNBENC, GstAmrnbEnc)) +#define GST_AMRNBENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRNBENC, GstAmrnbEncClass)) +#define GST_IS_AMRNBENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRNBENC)) +#define GST_IS_AMRNBENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRNBENC)) + +typedef struct _GstAmrnbEnc GstAmrnbEnc; +typedef struct _GstAmrnbEncClass GstAmrnbEncClass; + +struct _GstAmrnbEnc { + GstAudioEncoder element; + + /* library handle */ + void *handle; + + /* input settings */ + gint channels, rate; + gint duration; + + /* property */ + enum Mode bandmode; +}; + +struct _GstAmrnbEncClass { + GstAudioEncoderClass parent_class; +}; + +GType gst_amrnbenc_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (amrnbenc); + +G_END_DECLS + +#endif /* __GST_AMRNBENC_H__ */ diff --git a/ext/amrnb/meson.build b/ext/amrnb/meson.build new file mode 100644 index 0000000000..fcddb58304 --- /dev/null +++ b/ext/amrnb/meson.build @@ -0,0 +1,15 @@ +amrnb_dep = dependency('opencore-amrnb', version : '>= 0.1.3', required : get_option('amrnb')) + +if amrnb_dep.found() + amrnb = library('gstamrnb', + ['amrnb.c', 'amrnbdec.c', 'amrnbenc.c'], + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstaudio_dep, amrnb_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(amrnb, install_dir : plugins_pkgconfig_install_dir) + plugins += [amrnb] + install_data(sources: 'GstAmrnbEnc.prs', install_dir: presetdir) +endif diff --git a/ext/amrwbdec/README b/ext/amrwbdec/README new file mode 100644 index 0000000000..835adef1cf --- /dev/null +++ b/ext/amrwbdec/README @@ -0,0 +1,6 @@ +Compiling AMRWB decoder: +======================== + +To compile the amrwbdec plugin, you need the opencore-amrwb development +package. If your distribution does not provide this package, you can +download the source code from "http://sourceforge.net/projects/opencore-amr". diff --git a/ext/amrwbdec/amrwb.c b/ext/amrwbdec/amrwb.c new file mode 100644 index 0000000000..e3a028e276 --- /dev/null +++ b/ext/amrwbdec/amrwb.c @@ -0,0 +1,38 @@ +/* GStreamer Adaptive Multi-Rate Wide-Band (AMR-WB) Decoder plugin + * Copyright (C) 2006 Edgard Lima + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amrwbdec.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (amrwbdec, plugin); +} + + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + amrwbdec, + "Adaptive Multi-Rate Wide-Band Decoder", + plugin_init, VERSION, GST_LICENSE_UNKNOWN, GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN); diff --git a/ext/amrwbdec/amrwbdec.c b/ext/amrwbdec/amrwbdec.c new file mode 100644 index 0000000000..3d84f647fe --- /dev/null +++ b/ext/amrwbdec/amrwbdec.c @@ -0,0 +1,234 @@ +/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin + * Copyright (C) 2004 Ronald Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amrwbdec + * @title: amrwbdec + * @see_also: #GstAmrwbEnc + * + * AMR wideband decoder based on the + * [opencore codec implementation](http://sourceforge.net/projects/opencore-amr). + * + * ## Example launch line + * |[ + * gst-launch-1.0 filesrc location=abc.amr ! amrparse ! amrwbdec ! audioconvert ! audioresample ! autoaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "amrwbdec.h" + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR-WB, " + "rate = (int) 16000, " "channels = (int) 1") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "layout = (string) interleaved, " + "rate = (int) 16000, " "channels = (int) 1") + ); + +GST_DEBUG_CATEGORY_STATIC (gst_amrwbdec_debug); +#define GST_CAT_DEFAULT gst_amrwbdec_debug + +#define L_FRAME16k 320 /* Frame size at 16kHz */ + +static const unsigned char block_size[16] = + { 18, 24, 33, 37, 41, 47, 51, 59, 61, + 6, 0, 0, 0, 0, 1, 1 +}; + +static gboolean gst_amrwbdec_start (GstAudioDecoder * dec); +static gboolean gst_amrwbdec_stop (GstAudioDecoder * dec); +static gboolean gst_amrwbdec_set_format (GstAudioDecoder * dec, GstCaps * caps); +static GstFlowReturn gst_amrwbdec_parse (GstAudioDecoder * dec, + GstAdapter * adapter, gint * offset, gint * length); +static GstFlowReturn gst_amrwbdec_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); + +#define gst_amrwbdec_parent_class parent_class +G_DEFINE_TYPE (GstAmrwbDec, gst_amrwbdec, GST_TYPE_AUDIO_DECODER); +GST_ELEMENT_REGISTER_DEFINE (amrwbdec, "amrwbdec", + GST_RANK_PRIMARY, GST_TYPE_AMRWBDEC); + +static void +gst_amrwbdec_class_init (GstAmrwbDecClass * klass) +{ + GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_static_metadata (element_class, "AMR-WB audio decoder", + "Codec/Decoder/Audio", + "Adaptive Multi-Rate Wideband audio decoder", + "Renato Araujo "); + + base_class->start = GST_DEBUG_FUNCPTR (gst_amrwbdec_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_amrwbdec_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrwbdec_set_format); + base_class->parse = GST_DEBUG_FUNCPTR (gst_amrwbdec_parse); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrwbdec_handle_frame); + + GST_DEBUG_CATEGORY_INIT (gst_amrwbdec_debug, "amrwbdec", 0, + "AMR-WB audio decoder"); +} + +static void +gst_amrwbdec_init (GstAmrwbDec * amrwbdec) +{ + gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (amrwbdec), TRUE); + gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST + (amrwbdec), TRUE); + GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (amrwbdec)); +} + +static gboolean +gst_amrwbdec_start (GstAudioDecoder * dec) +{ + GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); + + GST_DEBUG_OBJECT (dec, "start"); + if (!(amrwbdec->handle = D_IF_init ())) + return FALSE; + + amrwbdec->rate = 0; + amrwbdec->channels = 0; + + return TRUE; +} + +static gboolean +gst_amrwbdec_stop (GstAudioDecoder * dec) +{ + GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); + + GST_DEBUG_OBJECT (dec, "stop"); + D_IF_exit (amrwbdec->handle); + + return TRUE; +} + +static gboolean +gst_amrwbdec_set_format (GstAudioDecoder * dec, GstCaps * caps) +{ + GstStructure *structure; + GstAmrwbDec *amrwbdec; + GstAudioInfo info; + + amrwbdec = GST_AMRWBDEC (dec); + + structure = gst_caps_get_structure (caps, 0); + + /* get channel count */ + gst_structure_get_int (structure, "channels", &amrwbdec->channels); + gst_structure_get_int (structure, "rate", &amrwbdec->rate); + + /* create reverse caps */ + gst_audio_info_init (&info); + gst_audio_info_set_format (&info, + GST_AUDIO_FORMAT_S16, amrwbdec->rate, amrwbdec->channels, NULL); + + gst_audio_decoder_set_output_format (dec, &info); + + return TRUE; +} + +static GstFlowReturn +gst_amrwbdec_parse (GstAudioDecoder * dec, GstAdapter * adapter, + gint * offset, gint * length) +{ + GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); + guint8 header[1]; + guint size; + gboolean sync, eos; + gint block, mode; + + size = gst_adapter_available (adapter); + if (size < 1) + return GST_FLOW_ERROR; + + gst_audio_decoder_get_parse_state (dec, &sync, &eos); + + /* need to peek data to get the size */ + gst_adapter_copy (adapter, header, 0, 1); + mode = (header[0] >> 3) & 0x0F; + block = block_size[mode]; + + GST_DEBUG_OBJECT (amrwbdec, "mode %d, block %d", mode, block); + + if (block) { + if (block > size) + return GST_FLOW_EOS; + *offset = 0; + *length = block; + } else { + /* no frame yet, skip one byte */ + GST_LOG_OBJECT (amrwbdec, "skipping byte"); + *offset = 1; + return GST_FLOW_EOS; + } + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_amrwbdec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) +{ + GstAmrwbDec *amrwbdec; + GstBuffer *out; + GstMapInfo inmap, outmap; + + amrwbdec = GST_AMRWBDEC (dec); + + /* no fancy flushing */ + if (!buffer || !gst_buffer_get_size (buffer)) + return GST_FLOW_OK; + + /* the library seems to write into the source data, hence the copy. */ + /* should be no problem */ + gst_buffer_map (buffer, &inmap, GST_MAP_READ); + + /* get output */ + out = gst_buffer_new_and_alloc (sizeof (gint16) * L_FRAME16k); + gst_buffer_map (out, &outmap, GST_MAP_WRITE); + + /* decode */ + D_IF_decode (amrwbdec->handle, (unsigned char *) inmap.data, + (short int *) outmap.data, _good_frame); + + gst_buffer_unmap (out, &outmap); + gst_buffer_unmap (buffer, &inmap); + + /* send out */ + return gst_audio_decoder_finish_frame (dec, out, 1); +} diff --git a/ext/amrwbdec/amrwbdec.h b/ext/amrwbdec/amrwbdec.h new file mode 100644 index 0000000000..601b94388a --- /dev/null +++ b/ext/amrwbdec/amrwbdec.h @@ -0,0 +1,69 @@ +/* GStreamer Adaptive Multi-Rate Wide-Band (AMR-WB) plugin + * Copyright (C) 2006 Edgard Lima + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_AMRWBDEC_H__ +#define __GST_AMRWBDEC_H__ + +#include +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AMRWBDEC \ + (gst_amrwbdec_get_type()) +#define GST_AMRWBDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRWBDEC, GstAmrwbDec)) +#define GST_AMRWBDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRWBDEC, GstAmrwbDecClass)) +#define GST_IS_AMRWBDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRWBDEC)) +#define GST_IS_AMRWBDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRWBDEC)) + +typedef struct _GstAmrwbDec GstAmrwbDec; +typedef struct _GstAmrwbDecClass GstAmrwbDecClass; + +/** + * GstAmrwbDec: + * + * Opaque data structure. + */ +struct _GstAmrwbDec { + GstAudioDecoder element; + + /* library handle */ + void *handle; + + /* output settings */ + gint channels, rate; +}; + +struct _GstAmrwbDecClass { + GstAudioDecoderClass parent_class; +}; + +GType gst_amrwbdec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (amrwbdec); + +G_END_DECLS + +#endif /* __GST_AMRWBDEC_H__ */ diff --git a/ext/amrwbdec/meson.build b/ext/amrwbdec/meson.build new file mode 100644 index 0000000000..734c37109d --- /dev/null +++ b/ext/amrwbdec/meson.build @@ -0,0 +1,14 @@ +amrwb_dep = dependency('opencore-amrwb', version : '>= 0.1.3', required : get_option('amrwbdec')) + +if amrwb_dep.found() + amrwbdec = library('gstamrwbdec', + ['amrwb.c', 'amrwbdec.c'], + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstaudio_dep, amrwb_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(amrwbdec, install_dir : plugins_pkgconfig_install_dir) + plugins += [amrwbdec] +endif diff --git a/ext/cdio/gstcdio.c b/ext/cdio/gstcdio.c new file mode 100644 index 0000000000..f091f5b723 --- /dev/null +++ b/ext/cdio/gstcdio.c @@ -0,0 +1,150 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +GST_DEBUG_CATEGORY_EXTERN (gst_cdio_debug); +#define GST_CAT_DEFAULT gst_cdio_debug + +static gboolean plugin_init (GstPlugin * plugin); + +/* cdio headers redefine VERSION etc., so do this here before including them */ +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + cdio, + "Read audio from audio CDs", + plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); + +#include "gstcdio.h" +#include "gstcdiocddasrc.h" + +void +gst_cdio_add_cdtext_field (GstObject * src, cdtext_t * cdtext, track_t track, + cdtext_field_t field, const gchar * gst_tag, GstTagList ** p_tags) +{ + const gchar *vars[] = { "GST_CDTEXT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; + const gchar *txt; + gchar *txt_utf8; + +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + txt = cdtext_get_const (cdtext, field, track); +#else + txt = cdtext_get_const (field, cdtext); +#endif + if (txt == NULL || *txt == '\0') { + GST_DEBUG_OBJECT (src, "empty CD-TEXT field %u (%s)", field, gst_tag); + return; + } + + /* The character encoding is not specified, and there is no provision + * for indicating in the CD-Text data which encoding is in use.. */ + txt_utf8 = gst_tag_freeform_string_to_utf8 (txt, -1, vars); + + if (txt_utf8 == NULL) { + GST_WARNING_OBJECT (src, "CD-TEXT %s could not be converted to UTF-8, " + "try setting the GST_CDTEXT_TAG_ENCODING or GST_TAG_ENCODING " + "environment variable", gst_tag); + return; + } + + /* FIXME: beautify strings (they might be all uppercase for example)? */ + + if (*p_tags == NULL) + *p_tags = gst_tag_list_new_empty (); + + gst_tag_list_add (*p_tags, GST_TAG_MERGE_REPLACE, gst_tag, txt_utf8, NULL); + + GST_DEBUG_OBJECT (src, "CD-TEXT: %s = %s", gst_tag, txt_utf8); + g_free (txt_utf8); +} + +GstTagList * +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 +gst_cdio_get_cdtext (GstObject * src, cdtext_t * t, track_t track) +{ + GstTagList *tags = NULL; + +#else +gst_cdio_get_cdtext (GstObject * src, CdIo * cdio, track_t track) +{ + GstTagList *tags = NULL; + cdtext_t *t; + + t = cdio_get_cdtext (cdio, track); + if (t == NULL) { + GST_DEBUG_OBJECT (src, "no CD-TEXT for track %u", track); + return NULL; + } +#endif + + gst_cdio_add_cdtext_field (src, t, track, CDTEXT_FIELD_PERFORMER, + GST_TAG_ARTIST, &tags); + gst_cdio_add_cdtext_field (src, t, track, CDTEXT_FIELD_TITLE, GST_TAG_TITLE, + &tags); + + return tags; +} + +void +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 +gst_cdio_add_cdtext_album_tags (GstObject * src, cdtext_t * t, + GstTagList * tags) +{ +#else +gst_cdio_add_cdtext_album_tags (GstObject * src, CdIo * cdio, GstTagList * tags) +{ + cdtext_t *t; + + t = cdio_get_cdtext (cdio, 0); + if (t == NULL) { + GST_DEBUG_OBJECT (src, "no CD-TEXT for album"); + return; + } +#endif + + gst_cdio_add_cdtext_field (src, t, 0, CDTEXT_FIELD_PERFORMER, + GST_TAG_ALBUM_ARTIST, &tags); + gst_cdio_add_cdtext_field (src, t, 0, CDTEXT_FIELD_TITLE, GST_TAG_ALBUM, + &tags); + gst_cdio_add_cdtext_field (src, t, 0, CDTEXT_FIELD_GENRE, GST_TAG_GENRE, + &tags); + GST_DEBUG ("CD-TEXT album tags: %" GST_PTR_FORMAT, tags); +} + +void +gst_cdio_log_handler (cdio_log_level_t level, const char *msg) +{ + const gchar *level_str[] = { "DEBUG", "INFO", "WARN", "ERROR", "ASSERT" }; + const gchar *s; + + s = level_str[CLAMP (level, 1, G_N_ELEMENTS (level_str)) - 1]; + GST_DEBUG ("CDIO-%s: %s", s, GST_STR_NULL (msg)); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (cdiocddasrc, plugin); +} diff --git a/ext/cdio/gstcdio.h b/ext/cdio/gstcdio.h new file mode 100644 index 0000000000..8571d271f1 --- /dev/null +++ b/ext/cdio/gstcdio.h @@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CDIO_H__ +#define __GST_CDIO_H__ + +#include +#include +#include +#include + +#if LIBCDIO_VERSION_NUM <= 83 && LIBCDIO_VERSION_NUM >= 76 + #define CDTEXT_FIELD_PERFORMER CDTEXT_PERFORMER + #define CDTEXT_FIELD_GENRE CDTEXT_GENRE + #define CDTEXT_FIELD_TITLE CDTEXT_TITLE +#endif + + +void gst_cdio_add_cdtext_field (GstObject * src, + cdtext_t * cdtext, + track_t track, + cdtext_field_t field, + const gchar * gst_tag, + GstTagList ** p_tags); + +GstTagList * gst_cdio_get_cdtext (GstObject * src, +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + cdtext_t * t, +#else + CdIo * cdio, +#endif + track_t track); + +void gst_cdio_add_cdtext_album_tags (GstObject * src, +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + cdtext_t * t, +#else + CdIo * cdio, +#endif + GstTagList * tags); +void gst_cdio_log_handler (cdio_log_level_t level, const char *msg); + +#endif /* __GST_CDIO_H__ */ + diff --git a/ext/cdio/gstcdiocddasrc.c b/ext/cdio/gstcdiocddasrc.c new file mode 100644 index 0000000000..15b044cad1 --- /dev/null +++ b/ext/cdio/gstcdiocddasrc.c @@ -0,0 +1,518 @@ +/* GStreamer + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-cdiocddasrc + * @title: cdiocddasrc + * @see_also: GstCdParanoiaSrc, GstAudioCdSrc + * + * cdiocddasrc reads and extracts raw audio from Audio CDs. It can operate + * in one of two modes: + * + * * treat each track as a separate stream, counting time from the start + * of the track to the end of the track and posting EOS at the end of + * a track, or + * * treat the entire disc as one stream, counting time from the start of + * the first track to the end of the last track, posting EOS only at + * the end of the last track. + * + * With a recent-enough version of libcdio, the element will extract + * CD-TEXT if this is supported by the CD-drive and CD-TEXT information + * is available on the CD. The information will be posted on the bus in + * form of a tag message. + * + * When opened, the element will also calculate a CDDB disc ID and a + * MusicBrainz disc ID, which applications can use to query online + * databases for artist/title information. These disc IDs will also be + * posted on the bus as part of the tag messages. + * + * cdiocddasrc supports the GstUriHandler interface, so applications can use + * playbin with cdda://<track-number> URIs for playback (they will have + * to connect to playbin's notify::source signal and set the device on the + * cd source in the notify callback if they want to set the device property). + * Applications should use seeks in "track" format to switch between different + * tracks of the same CD (passing a new cdda:// URI to playbin involves opening + * and closing the CD device, which is much slower). + * + * ## Example launch line + * + * |[ + * gst-launch-1.0 cdiocddasrc track=5 device=/dev/cdrom ! audioconvert ! vorbisenc ! oggmux ! filesink location=track5.ogg + * ]| + * This pipeline extracts track 5 of the audio CD and encodes it into an + * Ogg/Vorbis file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcdio.h" +#include "gstcdiocddasrc.h" + +#include +#include "gst/gst-i18n-plugin.h" + +#include +#include +#include +#include + +#define SAMPLES_PER_SECTOR (CDIO_CD_FRAMESIZE_RAW / sizeof (gint16)) + +#define DEFAULT_READ_SPEED -1 + +enum +{ + PROP_0 = 0, + PROP_READ_SPEED +}; + +GST_DEBUG_CATEGORY (gst_cdio_debug); + + +G_DEFINE_TYPE (GstCdioCddaSrc, gst_cdio_cdda_src, GST_TYPE_AUDIO_CD_SRC); +#define _do_init \ + GST_DEBUG_CATEGORY_INIT (gst_cdio_debug, "cdio", 0, "libcdio elements"); \ + cdio_log_set_handler (gst_cdio_log_handler); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (cdiocddasrc, "cdiocddasrc", + GST_RANK_SECONDARY - 1, GST_TYPE_CDIO_CDDA_SRC, _do_init); + +static void gst_cdio_cdda_src_finalize (GObject * obj); +static void gst_cdio_cdda_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cdio_cdda_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstBuffer *gst_cdio_cdda_src_read_sector (GstAudioCdSrc * src, + gint sector); +static gboolean gst_cdio_cdda_src_open (GstAudioCdSrc * src, + const gchar * device); +static void gst_cdio_cdda_src_close (GstAudioCdSrc * src); + +#if 0 +static gchar * +gst_cdio_cdda_src_get_default_device (GstAudioCdSrc * audiocdsrc) +{ + GstCdioCddaSrc *src; + gchar *default_device, *ret; + + src = GST_CDIO_CDDA_SRC (audiocdsrc); + + /* src->cdio may be NULL here */ + default_device = cdio_get_default_device (src->cdio); + + ret = g_strdup (default_device); + free (default_device); + + GST_LOG_OBJECT (src, "returning default device: %s", GST_STR_NULL (ret)); + + return ret; +} + +static gchar ** +gst_cdio_cdda_src_probe_devices (GstAudioCdSrc * audiocdsrc) +{ + char **devices, **ret, **d; + + /* FIXME: might return the same hardware device twice, e.g. + * as /dev/cdrom and /dev/dvd - gotta do something more sophisticated */ + devices = cdio_get_devices (DRIVER_DEVICE); + + if (devices == NULL) + goto no_devices; + + if (*devices == NULL) + goto empty_devices; + + ret = g_strdupv (devices); + for (d = devices; *d != NULL; ++d) { + GST_DEBUG_OBJECT (audiocdsrc, "device: %s", GST_STR_NULL (*d)); + free (*d); + } + free (devices); + + return ret; + + /* ERRORS */ +no_devices: + { + GST_DEBUG_OBJECT (audiocdsrc, "no devices found"); + return NULL; + } +empty_devices: + { + GST_DEBUG_OBJECT (audiocdsrc, "empty device list found"); + free (devices); + return NULL; + } +} +#endif + +static GstBuffer * +gst_cdio_cdda_src_read_sector (GstAudioCdSrc * audiocdsrc, gint sector) +{ + GstCdioCddaSrc *src; + guint8 *data; + + src = GST_CDIO_CDDA_SRC (audiocdsrc); + + data = g_malloc (CDIO_CD_FRAMESIZE_RAW); + + /* can't use pad_alloc because we can't return the GstFlowReturn (FIXME 0.11) */ + if (cdio_read_audio_sector (src->cdio, data, sector) != 0) + goto read_failed; + + if (src->swap_le_be) { + gint16 *pcm_data = (gint16 *) data; + gint i; + + for (i = 0; i < SAMPLES_PER_SECTOR; ++i) + pcm_data[i] = GUINT16_SWAP_LE_BE (pcm_data[i]); + } + + return gst_buffer_new_wrapped (data, CDIO_CD_FRAMESIZE_RAW); + + /* ERRORS */ +read_failed: + { + GST_WARNING_OBJECT (src, "read at sector %d failed!", sector); + GST_ELEMENT_ERROR (src, RESOURCE, READ, + (_("Could not read from CD.")), + ("cdio_read_audio_sector at %d failed: %s", sector, + g_strerror (errno))); + g_free (data); + return NULL; + } +} + +static gboolean +gst_cdio_cdda_src_do_detect_drive_endianness (GstCdioCddaSrc * src, gint from, + gint to) +{ + gint16 pcm_data[SAMPLES_PER_SECTOR], last_pcm_ne, last_pcm_oe; + gdouble ne_sumd0, ne_sumd1, ne_factor; + gdouble oe_sumd0, oe_sumd1, oe_factor; + gdouble diff; + gint sector; + gint i; + + ne_sumd0 = ne_sumd1 = 0.0; + oe_sumd0 = oe_sumd1 = 0.0; + last_pcm_ne = 0; + last_pcm_oe = 0; + + GST_LOG_OBJECT (src, "checking sector %d to %d", from, to); + + for (sector = from; sector < to; ++sector) { + if (cdio_read_audio_sector (src->cdio, pcm_data, sector) != 0) + goto read_failed; + + /* only evaluate samples for left channel */ + for (i = 0; i < SAMPLES_PER_SECTOR; i += 2) { + gint16 pcm; + + /* Native endianness first */ + pcm = pcm_data[i]; + ne_sumd0 += abs (pcm); + ne_sumd1 += abs (pcm - last_pcm_ne); + last_pcm_ne = pcm; + + /* other endianness next */ + pcm = GUINT16_SWAP_LE_BE (pcm); + oe_sumd0 += abs (pcm); + oe_sumd1 += abs (pcm - last_pcm_oe); + last_pcm_oe = pcm; + } + + } + + ne_factor = (ne_sumd1 / ne_sumd0); + oe_factor = (oe_sumd1 / oe_sumd0); + diff = ne_factor - oe_factor; + + GST_DEBUG_OBJECT (src, "Native: %.2f, Other: %.2f, diff: %.2f", + ne_factor, oe_factor, diff); + + if (diff > 0.5) { + GST_INFO_OBJECT (src, "Drive produces samples in other endianness"); + src->swap_le_be = TRUE; + return TRUE; + } else if (diff < -0.5) { + GST_INFO_OBJECT (src, "Drive produces samples in host endianness"); + src->swap_le_be = FALSE; + return TRUE; + } else { + GST_INFO_OBJECT (src, "Inconclusive, assuming host endianness"); + src->swap_le_be = FALSE; + return FALSE; + } + +/* ERRORS */ +read_failed: + { + GST_WARNING_OBJECT (src, "could not read sector %d", sector); + src->swap_le_be = FALSE; + return FALSE; + } +} + +static void +gst_cdio_cdda_src_detect_drive_endianness (GstCdioCddaSrc * src, gint first, + gint last) +{ + gint from, to; + + GST_INFO ("Detecting drive endianness"); + + /* try middle of disc first */ + from = (first + last) / 2; + to = MIN (from + 10, last); + if (gst_cdio_cdda_src_do_detect_drive_endianness (src, from, to)) + return; + + /* if that was inconclusive, try other places */ + from = (first + last) / 4; + to = MIN (from + 10, last); + if (gst_cdio_cdda_src_do_detect_drive_endianness (src, from, to)) + return; + + from = (first + last) * 3 / 4; + to = MIN (from + 10, last); + if (gst_cdio_cdda_src_do_detect_drive_endianness (src, from, to)) + return; + + /* if that's still inconclusive, we give up and assume host endianness */ + return; +} + +static gboolean +notcdio_track_is_audio_track (const CdIo * p_cdio, track_t i_track) +{ + return (cdio_get_track_format (p_cdio, i_track) == TRACK_FORMAT_AUDIO); +} + +static gboolean +gst_cdio_cdda_src_open (GstAudioCdSrc * audiocdsrc, const gchar * device) +{ + GstCdioCddaSrc *src; + discmode_t discmode; + gint first_track, num_tracks, i; + gint first_audio_sector = 0, last_audio_sector = 0; +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + cdtext_t *cdtext; +#endif + + src = GST_CDIO_CDDA_SRC (audiocdsrc); + + g_assert (device != NULL); + g_assert (src->cdio == NULL); + + GST_LOG_OBJECT (src, "trying to open device %s", device); + + if (!(src->cdio = cdio_open (device, DRIVER_UNKNOWN))) + goto open_failed; + + discmode = cdio_get_discmode (src->cdio); + GST_LOG_OBJECT (src, "discmode: %d", (gint) discmode); + + if (discmode != CDIO_DISC_MODE_CD_DA && discmode != CDIO_DISC_MODE_CD_MIXED) + goto not_audio; + + first_track = cdio_get_first_track_num (src->cdio); + num_tracks = cdio_get_num_tracks (src->cdio); + + if (num_tracks <= 0 || first_track < 0) + return TRUE; /* base class will generate 'has no tracks' error */ + + if (src->read_speed != -1) + cdio_set_speed (src->cdio, src->read_speed); + +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + cdtext = cdio_get_cdtext (src->cdio); + + if (NULL == cdtext) + GST_DEBUG_OBJECT (src, "no CD-TEXT on disc"); + else + gst_cdio_add_cdtext_album_tags (GST_OBJECT_CAST (src), cdtext, + audiocdsrc->tags); +#else + gst_cdio_add_cdtext_album_tags (GST_OBJECT_CAST (src), src->cdio, + audiocdsrc->tags); +#endif + + GST_LOG_OBJECT (src, "%u tracks, first track: %d", num_tracks, first_track); + + for (i = 0; i < num_tracks; ++i) { + GstAudioCdSrcTrack track = { 0, }; + gint len_sectors; + + len_sectors = cdio_get_track_sec_count (src->cdio, i + first_track); + + track.num = i + first_track; + track.is_audio = notcdio_track_is_audio_track (src->cdio, i + first_track); + + /* Note: LSN/LBA confusion all around us; in any case, this does + * the right thing here (for cddb id calculations etc. as well) */ + track.start = cdio_get_track_lsn (src->cdio, i + first_track); + track.end = track.start + len_sectors - 1; /* -1? */ + + if (track.is_audio) { + first_audio_sector = MIN (first_audio_sector, track.start); + last_audio_sector = MAX (last_audio_sector, track.end); + } +#if LIBCDIO_VERSION_NUM > 83 || LIBCDIO_VERSION_NUM < 76 + if (NULL != cdtext) + track.tags = gst_cdio_get_cdtext (GST_OBJECT (src), cdtext, + i + first_track); +#else + track.tags = gst_cdio_get_cdtext (GST_OBJECT (src), src->cdio, + i + first_track); +#endif + + gst_audio_cd_src_add_track (GST_AUDIO_CD_SRC (src), &track); + } + + /* Try to detect if we need to byte-order swap the samples coming from the + * drive, which might be the case if the CD drive operates in a different + * endianness than the host CPU's endianness (happens on e.g. Powerbook G4) */ + gst_cdio_cdda_src_detect_drive_endianness (src, first_audio_sector, + last_audio_sector); + + return TRUE; + + /* ERRORS */ +open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open CD device for reading.")), + ("cdio_open() failed: %s", g_strerror (errno))); + return FALSE; + } +not_audio: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Disc is not an Audio CD.")), ("discmode: %d", (gint) discmode)); + + cdio_destroy (src->cdio); + src->cdio = NULL; + return FALSE; + } +} + +static void +gst_cdio_cdda_src_close (GstAudioCdSrc * audiocdsrc) +{ + GstCdioCddaSrc *src = GST_CDIO_CDDA_SRC (audiocdsrc); + + if (src->cdio) { + cdio_destroy (src->cdio); + src->cdio = NULL; + } +} + +static void +gst_cdio_cdda_src_init (GstCdioCddaSrc * src) +{ + src->read_speed = DEFAULT_READ_SPEED; /* don't need atomic access here */ + src->cdio = NULL; +} + +static void +gst_cdio_cdda_src_finalize (GObject * obj) +{ + GstCdioCddaSrc *src = GST_CDIO_CDDA_SRC (obj); + + if (src->cdio) { + cdio_destroy (src->cdio); + src->cdio = NULL; + } + + G_OBJECT_CLASS (gst_cdio_cdda_src_parent_class)->finalize (obj); +} + +static void +gst_cdio_cdda_src_class_init (GstCdioCddaSrcClass * klass) +{ + GstAudioCdSrcClass *audiocdsrc_class = GST_AUDIO_CD_SRC_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_cdio_cdda_src_set_property; + gobject_class->get_property = gst_cdio_cdda_src_get_property; + gobject_class->finalize = gst_cdio_cdda_src_finalize; + + audiocdsrc_class->open = gst_cdio_cdda_src_open; + audiocdsrc_class->close = gst_cdio_cdda_src_close; + audiocdsrc_class->read_sector = gst_cdio_cdda_src_read_sector; +#if 0 + audiocdsrc_class->probe_devices = gst_cdio_cdda_src_probe_devices; + audiocdsrc_class->get_default_device = gst_cdio_cdda_src_get_default_device; +#endif + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_READ_SPEED, + g_param_spec_int ("read-speed", "Read speed", + "Read from device at the specified speed (-1 = default)", -1, 100, + DEFAULT_READ_SPEED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_set_static_metadata (element_class, + "CD audio source (CDDA)", "Source/File", + "Read audio from CD using libcdio", + "Tim-Philipp Müller "); +} + +static void +gst_cdio_cdda_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCdioCddaSrc *src = GST_CDIO_CDDA_SRC (object); + + switch (prop_id) { + case PROP_READ_SPEED:{ + gint speed; + + speed = g_value_get_int (value); + g_atomic_int_set (&src->read_speed, speed); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_cdio_cdda_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstCdioCddaSrc *src = GST_CDIO_CDDA_SRC (object); + + switch (prop_id) { + case PROP_READ_SPEED:{ + gint speed; + + speed = g_atomic_int_get (&src->read_speed); + g_value_set_int (value, speed); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/cdio/gstcdiocddasrc.h b/ext/cdio/gstcdiocddasrc.h new file mode 100644 index 0000000000..478aa5ffd0 --- /dev/null +++ b/ext/cdio/gstcdiocddasrc.h @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CDIO_CDDA_SRC_H__ +#define __GST_CDIO_CDDA_SRC_H__ + +#include +#include + +#define GST_TYPE_CDIO_CDDA_SRC (gst_cdio_cdda_src_get_type ()) +#define GST_CDIO_CDDA_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CDIO_CDDA_SRC, GstCdioCddaSrc)) +#define GST_CDIO_CDDA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CDIO_CDDA_SRC, GstCdioCddaSrcClass)) +#define GST_IS_CDIO_CDDA_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CDIO_CDDA_SRC)) +#define GST_IS_CDIO_CDDA_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CDIO_CDDA_SRC)) + +typedef struct _GstCdioCddaSrc GstCdioCddaSrc; +typedef struct _GstCdioCddaSrcClass GstCdioCddaSrcClass; + +struct _GstCdioCddaSrc +{ + GstAudioCdSrc audiocdsrc; + + gint read_speed; /* ATOMIC */ + + gboolean swap_le_be; /* Drive produces samples in other endianness */ + + CdIo *cdio; /* NULL if not open */ +}; + +struct _GstCdioCddaSrcClass +{ + GstAudioCdSrcClass audiocdsrc_class; +}; + +GType gst_cdio_cdda_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (cdiocddasrc); + +#endif /* __GST_CDIO_CDDA_SRC_H__ */ + diff --git a/ext/cdio/meson.build b/ext/cdio/meson.build new file mode 100644 index 0000000000..054d02627c --- /dev/null +++ b/ext/cdio/meson.build @@ -0,0 +1,14 @@ +cdio_dep = dependency('libcdio', version : '>= 0.76', required : get_option('cdio')) + +if cdio_dep.found() + cdio = library('gstcdio', + ['gstcdio.c', 'gstcdiocddasrc.c'], + c_args : ugly_args, + include_directories : [configinc, libsinc], + dependencies : [gstaudio_dep, gsttag_dep, cdio_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(cdio, install_dir : plugins_pkgconfig_install_dir) + plugins += [cdio] +endif diff --git a/ext/dvdread/README b/ext/dvdread/README new file mode 100644 index 0000000000..4594f65991 --- /dev/null +++ b/ext/dvdread/README @@ -0,0 +1,4 @@ +Various Info +============ + +http://dvd.sourceforge.net/ diff --git a/ext/dvdread/demo-play b/ext/dvdread/demo-play new file mode 100755 index 0000000000..ed9d4d8d46 --- /dev/null +++ b/ext/dvdread/demo-play @@ -0,0 +1,6 @@ +#!/bin/sh +AUDIOSINK=`gconftool-2 -g /system/gstreamer/0.8/default/audiosink` +VIDEOSINK=`gconftool-2 -g /system/gstreamer/0.8/default/videosink` +gst-launch dvdreadsrc ! dvddemux name=demux .video_00 ! \ + { queue ! mpeg2dec ! videoconvert ! videoscale ! $VIDEOSINK } \ + { demux.audio_00 ! queue ! a52dec ! audioconvert ! audioscale ! $AUDIOSINK } diff --git a/ext/dvdread/dvdreadsrc.c b/ext/dvdread/dvdreadsrc.c new file mode 100644 index 0000000000..cfd72ad6a3 --- /dev/null +++ b/ext/dvdread/dvdreadsrc.c @@ -0,0 +1,1819 @@ +/* GStreamer DVD title source + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2001 Billy Biggs . + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +#include +#include +#include +#include + +#include "dvdreadsrc.h" + +#include + +#include + +GST_DEBUG_CATEGORY_STATIC (gstgst_dvd_read_src_debug); +#define GST_CAT_DEFAULT (gstgst_dvd_read_src_debug) + +enum +{ + ARG_0, + ARG_DEVICE, + ARG_TITLE, + ARG_CHAPTER, + ARG_ANGLE +}; + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, mpegversion=2, systemstream=(boolean)true")); + +static GstFormat title_format; +static GstFormat angle_format; +static GstFormat sector_format; +static GstFormat chapter_format; + +static gboolean gst_dvd_read_src_start (GstBaseSrc * basesrc); +static gboolean gst_dvd_read_src_stop (GstBaseSrc * basesrc); +static GstFlowReturn gst_dvd_read_src_create (GstPushSrc * pushsrc, + GstBuffer ** buf); +static gboolean gst_dvd_read_src_src_query (GstBaseSrc * basesrc, + GstQuery * query); +static gboolean gst_dvd_read_src_src_event (GstBaseSrc * basesrc, + GstEvent * event); +static gboolean gst_dvd_read_src_goto_title (GstDvdReadSrc * src, gint title, + gint angle); +static gboolean gst_dvd_read_src_goto_chapter (GstDvdReadSrc * src, + gint chapter); +static gboolean gst_dvd_read_src_goto_sector (GstDvdReadSrc * src, gint angle); +static void gst_dvd_read_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dvd_read_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstEvent *gst_dvd_read_src_make_clut_change_event (GstDvdReadSrc * src, + const guint32 * clut); +static gboolean gst_dvd_read_src_get_size (GstDvdReadSrc * src, gint64 * size); +static gboolean gst_dvd_read_src_do_seek (GstBaseSrc * src, GstSegment * s); +static gint64 gst_dvd_read_src_convert_timecode (dvd_time_t * time); +static gint gst_dvd_read_src_get_next_cell (GstDvdReadSrc * src, + pgc_t * pgc, gint cell); +static GstClockTime gst_dvd_read_src_get_time_for_sector (GstDvdReadSrc * src, + guint sector); +static gint gst_dvd_read_src_get_sector_from_time (GstDvdReadSrc * src, + GstClockTime ts); + +static void gst_dvd_read_src_uri_handler_init (gpointer g_iface, + gpointer iface_data); +static gboolean dvdread_element_init (GstPlugin * plugin); + +#define gst_dvd_read_src_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstDvdReadSrc, gst_dvd_read_src, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, + gst_dvd_read_src_uri_handler_init)); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (dvdreadsrc, dvdread_element_init); + +static void +gst_dvd_read_src_finalize (GObject * object) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (object); + + g_free (src->location); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_dvd_read_src_init (GstDvdReadSrc * src) +{ + src->dvd = NULL; + src->vts_file = NULL; + src->vmg_file = NULL; + src->dvd_title = NULL; + + src->location = g_strdup ("/dev/dvd"); + src->first_seek = TRUE; + src->new_seek = TRUE; + src->new_cell = TRUE; + src->change_cell = FALSE; + src->uri_title = 1; + src->uri_chapter = 1; + src->uri_angle = 1; + + src->title_lang_event_pending = NULL; + src->pending_clut_event = NULL; + + gst_pad_use_fixed_caps (GST_BASE_SRC_PAD (src)); + gst_pad_set_caps (GST_BASE_SRC_PAD (src), + gst_static_pad_template_get_caps (&srctemplate)); +} + +static gboolean +gst_dvd_read_src_is_seekable (GstBaseSrc * src) +{ + return TRUE; +} + +static void +gst_dvd_read_src_class_init (GstDvdReadSrcClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + GstPushSrcClass *gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); + GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + + gobject_class->finalize = gst_dvd_read_src_finalize; + gobject_class->set_property = gst_dvd_read_src_set_property; + gobject_class->get_property = gst_dvd_read_src_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE, + g_param_spec_string ("device", "Device", + "DVD device location", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TITLE, + g_param_spec_int ("title", "title", "title", + 1, 999, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHAPTER, + g_param_spec_int ("chapter", "chapter", "chapter", + 1, 999, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ANGLE, + g_param_spec_int ("angle", "angle", "angle", + 1, 999, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_add_static_pad_template (gstelement_class, &srctemplate); + + gst_element_class_set_static_metadata (gstelement_class, "DVD Source", + "Source/File/DVD", + "Access a DVD title/chapter/angle using libdvdread", + "Erik Walthinsen "); + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvd_read_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dvd_read_src_stop); + gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_dvd_read_src_src_query); + gstbasesrc_class->event = GST_DEBUG_FUNCPTR (gst_dvd_read_src_src_event); + gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_dvd_read_src_do_seek); + gstbasesrc_class->is_seekable = + GST_DEBUG_FUNCPTR (gst_dvd_read_src_is_seekable); + + gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dvd_read_src_create); + + title_format = gst_format_register ("title", "DVD title"); + angle_format = gst_format_register ("angle", "DVD angle"); + sector_format = gst_format_register ("sector", "DVD sector"); + chapter_format = gst_format_register ("chapter", "DVD chapter"); +} + +static gboolean +gst_dvd_read_src_start (GstBaseSrc * basesrc) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (basesrc); + + g_return_val_if_fail (src->location != NULL, FALSE); + + GST_DEBUG_OBJECT (src, "Opening DVD '%s'", src->location); + + if ((src->dvd = DVDOpen (src->location)) == NULL) + goto open_failed; + + /* Load the video manager to find out the information about the titles */ + GST_DEBUG_OBJECT (src, "Loading VMG info"); + + if (!(src->vmg_file = ifoOpen (src->dvd, 0))) + goto ifo_open_failed; + + src->tt_srpt = src->vmg_file->tt_srpt; + + src->title = src->uri_title - 1; + src->chapter = src->uri_chapter - 1; + src->angle = src->uri_angle - 1; + + if (!gst_dvd_read_src_goto_title (src, src->title, src->angle)) + goto title_open_failed; + + if (!gst_dvd_read_src_goto_chapter (src, src->chapter)) + goto chapter_open_failed; + + src->new_seek = FALSE; + src->change_cell = TRUE; + + src->first_seek = TRUE; + + return TRUE; + + /* ERRORS */ +open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD")), + ("DVDOpen(%s) failed: %s", src->location, g_strerror (errno))); + return FALSE; + } +ifo_open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD")), + ("ifoOpen() failed: %s", g_strerror (errno))); + return FALSE; + } +title_open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD title %d"), src->uri_title), (NULL)); + return FALSE; + } +chapter_open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Failed to go to chapter %d of DVD title %d"), + src->uri_chapter, src->uri_title), (NULL)); + return FALSE; + } +} + +static gboolean +gst_dvd_read_src_stop (GstBaseSrc * basesrc) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (basesrc); + + if (src->vts_file) { + ifoClose (src->vts_file); + src->vts_file = NULL; + } + if (src->vmg_file) { + ifoClose (src->vmg_file); + src->vmg_file = NULL; + } + if (src->dvd_title) { + DVDCloseFile (src->dvd_title); + src->dvd_title = NULL; + } + if (src->dvd) { + DVDClose (src->dvd); + src->dvd = NULL; + } + src->new_cell = TRUE; + src->new_seek = TRUE; + src->change_cell = FALSE; + src->chapter = 0; + src->title = 0; + src->need_newsegment = TRUE; + src->vts_tmapt = NULL; + if (src->title_lang_event_pending) { + gst_event_unref (src->title_lang_event_pending); + src->title_lang_event_pending = NULL; + } + if (src->pending_clut_event) { + gst_event_unref (src->pending_clut_event); + src->pending_clut_event = NULL; + } + if (src->chapter_starts) { + g_free (src->chapter_starts); + src->chapter_starts = NULL; + } + + GST_LOG_OBJECT (src, "closed DVD"); + + return TRUE; +} + +static void +cur_title_get_chapter_pgc (GstDvdReadSrc * src, gint chapter, gint * p_pgn, + gint * p_pgc_id, pgc_t ** p_pgc) +{ + pgc_t *pgc; + gint pgn, pgc_id; + + g_assert (chapter >= 0 && chapter < src->num_chapters); + + pgc_id = src->vts_ptt_srpt->title[src->ttn - 1].ptt[chapter].pgcn; + pgn = src->vts_ptt_srpt->title[src->ttn - 1].ptt[chapter].pgn; + pgc = src->vts_file->vts_pgcit->pgci_srp[pgc_id - 1].pgc; + + *p_pgn = pgn; + *p_pgc_id = pgc_id; + *p_pgc = pgc; +} + +static void +cur_title_get_chapter_bounds (GstDvdReadSrc * src, gint chapter, + gint * p_first_cell, gint * p_last_cell) +{ + pgc_t *pgc; + gint pgn, pgc_id, pgn_next_ch; + + g_assert (chapter >= 0 && chapter < src->num_chapters); + + cur_title_get_chapter_pgc (src, chapter, &pgn, &pgc_id, &pgc); + + *p_first_cell = pgc->program_map[pgn - 1] - 1; + + /* last cell is used as a 'up to boundary', not 'up to and including', + * i.e. it is the first cell not included in the chapter range */ + if (chapter == (src->num_chapters - 1)) { + *p_last_cell = pgc->nr_of_cells; + } else { + pgn_next_ch = src->vts_ptt_srpt->title[src->ttn - 1].ptt[chapter + 1].pgn; + *p_last_cell = pgc->program_map[pgn_next_ch - 1] - 1; + } + + GST_DEBUG_OBJECT (src, "Chapter %d bounds: %d %d (within %d cells)", + chapter, *p_first_cell, *p_last_cell, pgc->nr_of_cells); +} + +static gboolean +gst_dvd_read_src_goto_chapter (GstDvdReadSrc * src, gint chapter) +{ + gint i; + const guint8 *palette; + + /* make sure the chapter number is valid for this title */ + if (chapter < 0 || chapter >= src->num_chapters) { + GST_WARNING_OBJECT (src, "invalid chapter %d (only %d available)", + chapter, src->num_chapters); + chapter = CLAMP (chapter, 0, src->num_chapters - 1); + } + + /* determine which program chain we want to watch. This is + * based on the chapter number */ + cur_title_get_chapter_pgc (src, chapter, &src->pgn, &src->pgc_id, + &src->cur_pgc); + cur_title_get_chapter_bounds (src, chapter, &src->start_cell, + &src->last_cell); + + GST_LOG_OBJECT (src, "Opened chapter %d - cell %d-%d", chapter + 1, + src->start_cell, src->last_cell); + + /* retrieve position */ + src->cur_pack = 0; + for (i = 0; i < chapter; i++) { + gint c1, c2; + + cur_title_get_chapter_bounds (src, i, &c1, &c2); + + while (c1 < c2) { + src->cur_pack += + src->cur_pgc->cell_playback[c1].last_sector - + src->cur_pgc->cell_playback[c1].first_sector; + ++c1; + } + } + + /* prepare reading for new cell */ + src->new_cell = TRUE; + src->next_cell = src->start_cell; + + src->chapter = chapter; + + if (src->pending_clut_event) + gst_event_unref (src->pending_clut_event); + + /* Work around GCC 9 compiler warning here about taking address of packed + * member, which may result in an unaligned pointer access */ + palette = (const guint8 *) src->cur_pgc->palette; + src->pending_clut_event = + gst_dvd_read_src_make_clut_change_event (src, (const guint32 *) palette); + + return TRUE; +} + +static void +gst_dvd_read_src_get_chapter_starts (GstDvdReadSrc * src) +{ + GstClockTime uptohere; + guint c; + + g_free (src->chapter_starts); + src->chapter_starts = g_new (GstClockTime, src->num_chapters); + + uptohere = (GstClockTime) 0; + for (c = 0; c < src->num_chapters; ++c) { + GstClockTime chapter_duration = 0; + gint cell_start, cell_end, cell; + gint pgn, pgc_id; + pgc_t *pgc; + + cur_title_get_chapter_pgc (src, c, &pgn, &pgc_id, &pgc); + cur_title_get_chapter_bounds (src, c, &cell_start, &cell_end); + + cell = cell_start; + while (cell < cell_end) { + dvd_time_t *cell_duration; + + cell_duration = &pgc->cell_playback[cell].playback_time; + chapter_duration += gst_dvd_read_src_convert_timecode (cell_duration); + cell = gst_dvd_read_src_get_next_cell (src, pgc, cell); + } + + src->chapter_starts[c] = uptohere; + + GST_INFO_OBJECT (src, "[%02u] Chapter %02u starts at %" GST_TIME_FORMAT + ", dur = %" GST_TIME_FORMAT ", cells %d-%d", src->title + 1, c + 1, + GST_TIME_ARGS (uptohere), GST_TIME_ARGS (chapter_duration), + cell_start, cell_end); + + uptohere += chapter_duration; + } +} + +static gboolean +gst_dvd_read_src_goto_title (GstDvdReadSrc * src, gint title, gint angle) +{ + GstStructure *s; + gchar lang_code[3] = { '\0', '\0', '\0' }, *t; + pgc_t *pgc0; + gint title_set_nr; + gint num_titles; + gint pgn0, pgc0_id; + gint i; + + /* make sure our title number is valid */ + num_titles = src->tt_srpt->nr_of_srpts; + GST_INFO_OBJECT (src, "There are %d titles on this DVD", num_titles); + if (title < 0 || title >= num_titles) + goto invalid_title; + + src->num_chapters = src->tt_srpt->title[title].nr_of_ptts; + GST_INFO_OBJECT (src, "Title %d has %d chapters", title + 1, + src->num_chapters); + + /* make sure the angle number is valid for this title */ + src->num_angles = src->tt_srpt->title[title].nr_of_angles; + GST_LOG_OBJECT (src, "Title %d has %d angles", title + 1, src->num_angles); + if (angle < 0 || angle >= src->num_angles) { + GST_WARNING_OBJECT (src, "Invalid angle %d (only %d available)", + angle, src->num_angles); + angle = CLAMP (angle, 0, src->num_angles - 1); + } + + /* load the VTS information for the title set our title is in */ + title_set_nr = src->tt_srpt->title[title].title_set_nr; + src->vts_file = ifoOpen (src->dvd, title_set_nr); + if (src->vts_file == NULL) + goto ifo_open_failed; + + src->ttn = src->tt_srpt->title[title].vts_ttn; + src->vts_ptt_srpt = src->vts_file->vts_ptt_srpt; + + /* interactive title? */ + if (src->num_chapters > 0 && + src->vts_ptt_srpt->title[src->ttn - 1].ptt[0].pgn == 0) { + goto commands_only_pgc; + } + + /* we've got enough info, time to open the title set data */ + src->dvd_title = DVDOpenFile (src->dvd, title_set_nr, DVD_READ_TITLE_VOBS); + if (src->dvd_title == NULL) + goto title_open_failed; + + GST_INFO_OBJECT (src, "Opened title %d, angle %d", title + 1, angle); + src->title = title; + src->angle = angle; + + /* build event */ + + if (src->title_lang_event_pending) { + gst_event_unref (src->title_lang_event_pending); + src->title_lang_event_pending = NULL; + } + + s = gst_structure_new ("application/x-gst-dvd", + "event", G_TYPE_STRING, "dvd-lang-codes", NULL); + + /* so we can filter out invalid/unused streams (same for all chapters) */ + cur_title_get_chapter_pgc (src, 0, &pgn0, &pgc0_id, &pgc0); + + /* audio */ + for (i = 0; i < src->vts_file->vtsi_mat->nr_of_vts_audio_streams; i++) { + const audio_attr_t *a; + + /* audio stream present? */ + if (pgc0 != NULL && (pgc0->audio_control[i] & 0x8000) == 0) + continue; + + a = &src->vts_file->vtsi_mat->vts_audio_attr[i]; + + t = g_strdup_printf ("audio-%d-format", i); + gst_structure_set (s, t, G_TYPE_INT, (int) a->audio_format, NULL); + g_free (t); + t = g_strdup_printf ("audio-%d-stream", i); + gst_structure_set (s, t, G_TYPE_INT, (int) i, NULL); + g_free (t); + + if (a->lang_type) { + t = g_strdup_printf ("audio-%d-language", i); + lang_code[0] = (a->lang_code >> 8) & 0xff; + lang_code[1] = a->lang_code & 0xff; + gst_structure_set (s, t, G_TYPE_STRING, lang_code, NULL); + g_free (t); + } else { + lang_code[0] = '\0'; + } + + GST_INFO_OBJECT (src, "[%02d] Audio %02d: lang='%s', format=%d", + src->title + 1, i, lang_code, (gint) a->audio_format); + } + + /* subtitle */ + for (i = 0; i < src->vts_file->vtsi_mat->nr_of_vts_subp_streams; i++) { + const subp_attr_t *u; + const video_attr_t *v; + gint sid; + + /* subpicture stream present? */ + if (pgc0 != NULL && (pgc0->subp_control[i] & 0x80000000) == 0) + continue; + + u = &src->vts_file->vtsi_mat->vts_subp_attr[i]; + v = &src->vts_file->vtsi_mat->vts_video_attr; + + sid = i; + if (pgc0 != NULL) { + if (v->display_aspect_ratio == 0) /* 4:3 */ + sid = (pgc0->subp_control[i] >> 24) & 0x1f; + else if (v->display_aspect_ratio == 3) /* 16:9 */ + sid = (pgc0->subp_control[i] >> 8) & 0x1f; + } + + if (u->type) { + t = g_strdup_printf ("subpicture-%d-language", i); + lang_code[0] = (u->lang_code >> 8) & 0xff; + lang_code[1] = u->lang_code & 0xff; + gst_structure_set (s, t, G_TYPE_STRING, lang_code, NULL); + g_free (t); + t = g_strdup_printf ("subpicture-%d-stream", i); + gst_structure_set (s, t, G_TYPE_INT, (int) sid, NULL); + g_free (t); + t = g_strdup_printf ("subpicture-%d-format", i); + gst_structure_set (s, t, G_TYPE_INT, (int) 0, NULL); + g_free (t); + } else { + lang_code[0] = '\0'; + } + + GST_INFO_OBJECT (src, "[%02d] Subtitle %02d: lang='%s', type=%d", + src->title + 1, sid, lang_code, u->type); + } + + src->title_lang_event_pending = + gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s); + + /* dump seek tables */ + src->vts_tmapt = src->vts_file->vts_tmapt; + if (src->vts_tmapt) { + gint i, j; + + GST_LOG_OBJECT (src, "nr_of_tmaps = %d", src->vts_tmapt->nr_of_tmaps); + for (i = 0; i < src->vts_tmapt->nr_of_tmaps; ++i) { + GST_LOG_OBJECT (src, "======= Table %d ===================", i); + GST_LOG_OBJECT (src, "Offset relative to VTS_TMAPTI: %d", + src->vts_tmapt->tmap_offset[i]); + GST_LOG_OBJECT (src, "Time unit (seconds) : %d", + src->vts_tmapt->tmap[i].tmu); + GST_LOG_OBJECT (src, "Number of entries : %d", + src->vts_tmapt->tmap[i].nr_of_entries); + for (j = 0; j < src->vts_tmapt->tmap[i].nr_of_entries; j++) { + guint64 time; + + time = (guint64) src->vts_tmapt->tmap[i].tmu * (j + 1) * GST_SECOND; + GST_LOG_OBJECT (src, "Time: %" GST_TIME_FORMAT " VOBU " + "Sector: 0x%08x %s", GST_TIME_ARGS (time), + src->vts_tmapt->tmap[i].map_ent[j] & 0x7fffffff, + (src->vts_tmapt->tmap[i].map_ent[j] >> 31) ? "discontinuity" : ""); + } + } + } else { + GST_WARNING_OBJECT (src, "no vts_tmapt - seeking will suck"); + } + + gst_dvd_read_src_get_chapter_starts (src); + + return TRUE; + + /* ERRORS */ +invalid_title: + { + GST_WARNING_OBJECT (src, "Invalid title %d (only %d available)", + title, num_titles); + return FALSE; + } +ifo_open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD title %d"), title_set_nr), + ("ifoOpen(%d) failed: %s", title_set_nr, g_strerror (errno))); + return FALSE; + } +title_open_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD title %d"), title_set_nr), + ("Can't open title VOBS (VTS_%02d_1.VOB)", title_set_nr)); + return FALSE; + } +commands_only_pgc: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (_("Could not open DVD title %d. Interactive titles are not supported " + "by this element"), title_set_nr), + ("Commands-only PGC, not supported, use rsndvdbin")); + return FALSE; + } +} + +/* FIXME: double-check this function, compare against original */ +static gint +gst_dvd_read_src_get_next_cell (GstDvdReadSrc * src, pgc_t * pgc, gint cell) +{ + /* Check if we're entering an angle block. */ + if (pgc->cell_playback[cell].block_type != BLOCK_TYPE_ANGLE_BLOCK) + return (cell + 1); + + while (pgc->cell_playback[cell].block_mode != BLOCK_MODE_LAST_CELL) + ++cell; + + return cell + 1; +} + +/* Returns true if the pack is a NAV pack */ +static gboolean +gst_dvd_read_src_is_nav_pack (const guint8 * data, gint lbn, dsi_t * dsi_pack) +{ + if (GST_READ_UINT32_BE (data + 0x26) != 0x000001BF) + return FALSE; + + /* Check that this is substream 0 (PCI) */ + if (data[0x2c] != 0) + return FALSE; + + if (GST_READ_UINT32_BE (data + 0x400) != 0x000001BF) + return FALSE; + + /* Check that this is substream 1 (DSI) */ + if (data[0x406] != 1) + return FALSE; + + /* Check sizes of PCI and DSI packets */ + if (GST_READ_UINT16_BE (data + 0x2a) != 0x03d4) + return FALSE; + + if (GST_READ_UINT16_BE (data + 0x404) != 0x03fa) + return FALSE; + + /* Read the DSI packet into the provided struct and check it */ + navRead_DSI (dsi_pack, (unsigned char *) data + DSI_START_BYTE); + if (lbn != dsi_pack->dsi_gi.nv_pck_lbn) + return FALSE; + + return TRUE; +} + +/* find time for sector from index, returns NONE if there is no exact match */ +static GstClockTime +gst_dvd_read_src_get_time_for_sector (GstDvdReadSrc * src, guint sector) +{ + gint i, j; + + if (src->vts_tmapt == NULL || src->vts_tmapt->nr_of_tmaps == 0) + return GST_CLOCK_TIME_NONE; + + for (i = 0; i < src->vts_tmapt->nr_of_tmaps; ++i) { + for (j = 0; j < src->vts_tmapt->tmap[i].nr_of_entries; ++j) { + if ((src->vts_tmapt->tmap[i].map_ent[j] & 0x7fffffff) == sector) + return (guint64) src->vts_tmapt->tmap[i].tmu * (j + 1) * GST_SECOND; + } + } + + if (sector == 0) + return (GstClockTime) 0; + + return GST_CLOCK_TIME_NONE; +} + +/* returns the sector in the index at (or before) the given time, or -1 */ +static gint +gst_dvd_read_src_get_sector_from_time (GstDvdReadSrc * src, GstClockTime ts) +{ + gint sector, j; + + if (src->vts_tmapt == NULL || src->vts_tmapt->nr_of_tmaps < src->ttn) + return -1; + + sector = src->vts_tmapt->tmap[src->ttn - 1].map_ent[0] & 0x7fffffff; + + for (j = 0; j < src->vts_tmapt->tmap[src->ttn - 1].nr_of_entries; ++j) { + GstClockTime entry_time; + + entry_time = + (guint64) src->vts_tmapt->tmap[src->ttn - 1].tmu * (j + 1) * GST_SECOND; + if (entry_time <= ts) { + sector = src->vts_tmapt->tmap[src->ttn - 1].map_ent[j] & 0x7fffffff; + } + if (entry_time >= ts) { + return sector; + } + } + + if (ts == 0) + return 0; + + return -1; +} + +typedef enum +{ + GST_DVD_READ_OK = 0, + GST_DVD_READ_ERROR = -1, + GST_DVD_READ_EOS = -2, + GST_DVD_READ_AGAIN = -3 +} GstDvdReadReturn; + +static GstDvdReadReturn +gst_dvd_read_src_read (GstDvdReadSrc * src, gint angle, gint new_seek, + GstBuffer ** p_buf) +{ + GstBuffer *buf; + GstSegment *seg; + guint8 oneblock[DVD_VIDEO_LB_LEN]; + dsi_t dsi_pack; + guint next_vobu, cur_output_size; + gint len; + gint retries; + gint64 next_time; + GstMapInfo map; + + seg = &(GST_BASE_SRC (src)->segment); + + /* playback by cell in this pgc, starting at the cell for our chapter */ + if (new_seek) + src->cur_cell = src->start_cell; + +again: + + if (src->cur_cell >= src->last_cell) { + /* advance to next chapter */ + if (src->chapter == (src->num_chapters - 1) || + (seg->format == chapter_format && seg->stop != -1 && + src->chapter == (seg->stop - 1))) { + GST_DEBUG_OBJECT (src, "end of chapter segment"); + goto eos; + } + + GST_INFO_OBJECT (src, "end of chapter %d, switch to next", + src->chapter + 1); + + ++src->chapter; + gst_dvd_read_src_goto_chapter (src, src->chapter); + + return GST_DVD_READ_AGAIN; + } + + if (src->new_cell || new_seek) { + if (!new_seek) { + src->cur_cell = src->next_cell; + if (src->cur_cell >= src->last_cell) { + GST_LOG_OBJECT (src, "last cell in chapter"); + goto again; + } + } + + /* take angle into account */ + if (src->cur_pgc->cell_playback[src->cur_cell].block_type + == BLOCK_TYPE_ANGLE_BLOCK) + src->cur_cell += angle; + + /* calculate next cell */ + src->next_cell = + gst_dvd_read_src_get_next_cell (src, src->cur_pgc, src->cur_cell); + + /* we loop until we're out of this cell */ + src->cur_pack = src->cur_pgc->cell_playback[src->cur_cell].first_sector; + src->new_cell = FALSE; + GST_DEBUG_OBJECT (src, "Starting new cell %d @ pack %d", src->cur_cell, + src->cur_pack); + } + + if (src->cur_pack >= src->cur_pgc->cell_playback[src->cur_cell].last_sector) { + src->new_cell = TRUE; + GST_LOG_OBJECT (src, "Beyond last sector for cell %d, going to next cell", + src->cur_cell); + return GST_DVD_READ_AGAIN; + } + + /* read NAV packet */ + retries = 0; +nav_retry: + retries++; + + len = DVDReadBlocks (src->dvd_title, src->cur_pack, 1, oneblock); + if (len != 1) + goto read_error; + + if (!gst_dvd_read_src_is_nav_pack (oneblock, src->cur_pack, &dsi_pack)) { + GST_LOG_OBJECT (src, "Skipping nav packet @ pack %d", src->cur_pack); + src->cur_pack++; + + if (retries < 2000) { + goto nav_retry; + } else { + GST_LOG_OBJECT (src, "No nav packet @ pack %d after 2000 blocks", + src->cur_pack); + goto read_error; + } + } + + /* determine where we go next. These values are the ones we + * mostly care about */ + cur_output_size = dsi_pack.dsi_gi.vobu_ea + 1; + + /* If we're not at the end of this cell, we can determine the next + * VOBU to display using the VOBU_SRI information section of the + * DSI. Using this value correctly follows the current angle, + * avoiding the doubled scenes in The Matrix, and makes our life + * really happy. + * + * Otherwise, we set our next address past the end of this cell to + * force the code above to go to the next cell in the program. */ + if (dsi_pack.vobu_sri.next_vobu != SRI_END_OF_CELL) { + next_vobu = src->cur_pack + (dsi_pack.vobu_sri.next_vobu & 0x7fffffff); + } else { + next_vobu = src->cur_pgc->cell_playback[src->cur_cell].last_sector + 1; + } + + g_assert (cur_output_size < 1024); + + /* create the buffer (TODO: use buffer pool?) */ + buf = + gst_buffer_new_allocate (NULL, cur_output_size * DVD_VIDEO_LB_LEN, NULL); + + GST_LOG_OBJECT (src, "Going to read %u sectors @ pack %d", cur_output_size, + src->cur_pack); + + gst_buffer_map (buf, &map, GST_MAP_WRITE); + /* read in and output cursize packs */ + len = + DVDReadBlocks (src->dvd_title, src->cur_pack, cur_output_size, map.data); + + if (len != cur_output_size) + goto block_read_error; + + gst_buffer_unmap (buf, &map); + gst_buffer_resize (buf, 0, cur_output_size * DVD_VIDEO_LB_LEN); + /* GST_BUFFER_OFFSET (buf) = priv->cur_pack * DVD_VIDEO_LB_LEN; */ + GST_BUFFER_TIMESTAMP (buf) = + gst_dvd_read_src_get_time_for_sector (src, src->cur_pack); + + *p_buf = buf; + + GST_LOG_OBJECT (src, "Read %u sectors", cur_output_size); + + src->cur_pack = next_vobu; + + next_time = GST_BUFFER_TIMESTAMP (buf); + if (GST_CLOCK_TIME_IS_VALID (next_time) && seg->format == GST_FORMAT_TIME && + GST_CLOCK_TIME_IS_VALID (seg->stop) && + next_time > seg->stop + 5 * GST_SECOND) { + GST_DEBUG_OBJECT (src, "end of TIME segment"); + goto eos; + } + + return GST_DVD_READ_OK; + + /* ERRORS */ +eos: + { + GST_INFO_OBJECT (src, "Reached end-of-segment/stream - EOS"); + return GST_DVD_READ_EOS; + } +read_error: + { + GST_ERROR_OBJECT (src, "Read failed for block %d", src->cur_pack); + return GST_DVD_READ_ERROR; + } +block_read_error: + { + GST_ERROR_OBJECT (src, "Read failed for %d blocks at %d", + cur_output_size, src->cur_pack); + gst_buffer_unmap (buf, &map); + gst_buffer_unref (buf); + return GST_DVD_READ_ERROR; + } +} + +/* we don't cache the result on purpose */ +static gboolean +gst_dvd_read_descrambler_available (void) +{ + GModule *module; + gpointer sym; + gsize res; + + module = g_module_open ("libdvdcss", 0); + if (module != NULL) { + res = g_module_symbol (module, "dvdcss_open", &sym); + g_module_close (module); + } else { + res = FALSE; + } + + return res; +} + +static GstFlowReturn +gst_dvd_read_src_create (GstPushSrc * pushsrc, GstBuffer ** p_buf) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (pushsrc); + GstPad *srcpad; + gint res; + + g_return_val_if_fail (src->dvd != NULL, GST_FLOW_ERROR); + + srcpad = GST_BASE_SRC (src)->srcpad; + + if (src->need_newsegment) { + GstSegment seg; + + gst_segment_init (&seg, GST_FORMAT_BYTES); + seg.start = src->cur_pack * DVD_VIDEO_LB_LEN; + seg.stop = -1; + seg.time = 0; + gst_pad_push_event (srcpad, gst_event_new_segment (&seg)); + src->need_newsegment = FALSE; + } + + if (src->new_seek) { + gst_dvd_read_src_goto_title (src, src->title, src->angle); + gst_dvd_read_src_goto_chapter (src, src->chapter); + + src->new_seek = FALSE; + src->change_cell = TRUE; + } + + if (src->title_lang_event_pending) { + gst_pad_push_event (srcpad, src->title_lang_event_pending); + src->title_lang_event_pending = NULL; + } + + if (src->pending_clut_event) { + gst_pad_push_event (srcpad, src->pending_clut_event); + src->pending_clut_event = NULL; + } + + /* read it in */ + do { + res = gst_dvd_read_src_read (src, src->angle, src->change_cell, p_buf); + } while (res == GST_DVD_READ_AGAIN); + + switch (res) { + case GST_DVD_READ_ERROR:{ + /* FIXME: figure out a way to detect if scrambling is the problem */ + if (!gst_dvd_read_descrambler_available ()) { + GST_ELEMENT_ERROR (src, RESOURCE, READ, + (_("Could not read DVD. This may be because the DVD is encrypted " + "and a DVD decryption library is not installed.")), (NULL)); + } else { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (_("Could not read DVD.")), + (NULL)); + } + return GST_FLOW_ERROR; + } + case GST_DVD_READ_EOS:{ + return GST_FLOW_EOS; + } + case GST_DVD_READ_OK:{ + src->change_cell = FALSE; + return GST_FLOW_OK; + } + default: + break; + } + + g_return_val_if_reached (GST_FLOW_EOS); +} + +static void +gst_dvd_read_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (object); + gboolean started; + + GST_OBJECT_LOCK (src); + started = GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_FLAG_STARTED); + + switch (prop_id) { + case ARG_DEVICE:{ + if (started) { + g_warning ("%s: property '%s' needs to be set before the device is " + "opened", GST_ELEMENT_NAME (src), pspec->name); + break; + } + + g_free (src->location); + /* clear the filename if we get a NULL (is that possible?) */ + if (g_value_get_string (value) == NULL) { + src->location = g_strdup ("/dev/dvd"); + } else { + src->location = g_value_dup_string (value); + } + break; + } + case ARG_TITLE: + src->uri_title = g_value_get_int (value); + if (started) { + src->title = src->uri_title - 1; + src->new_seek = TRUE; + } + break; + case ARG_CHAPTER: + src->uri_chapter = g_value_get_int (value); + if (started) { + src->chapter = src->uri_chapter - 1; + src->new_seek = TRUE; + } + break; + case ARG_ANGLE: + src->uri_angle = g_value_get_int (value); + if (started) { + src->angle = src->uri_angle - 1; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (src); +} + +static void +gst_dvd_read_src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (object); + + GST_OBJECT_LOCK (src); + + switch (prop_id) { + case ARG_DEVICE: + g_value_set_string (value, src->location); + break; + case ARG_TITLE: + g_value_set_int (value, src->uri_title); + break; + case ARG_CHAPTER: + g_value_set_int (value, src->uri_chapter); + break; + case ARG_ANGLE: + g_value_set_int (value, src->uri_angle); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (src); +} + +static gboolean +gst_dvd_read_src_get_size (GstDvdReadSrc * src, gint64 * size) +{ + gboolean ret = FALSE; + + if (src->dvd_title) { + gssize blocks; + + blocks = DVDFileSize (src->dvd_title); + if (blocks >= 0) { + *size = (gint64) blocks *DVD_VIDEO_LB_LEN; + + ret = TRUE; + } else { + GST_WARNING_OBJECT (src, "DVDFileSize(%p) failed!", src->dvd_title); + } + } + + return ret; +} + +/*** Querying and seeking ***/ + +static gboolean +gst_dvd_read_src_handle_seek_event (GstDvdReadSrc * src, GstEvent * event) +{ + GstSeekFlags flags; + GstSeekType cur_type, end_type; + gint64 new_off, total; + GstFormat format; + GstPad *srcpad; + gboolean query_ok; + gdouble rate; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &new_off, + &end_type, NULL); + + if (rate <= 0.0) { + GST_DEBUG_OBJECT (src, "cannot do backwards playback yet"); + return FALSE; + } + + if (end_type != GST_SEEK_TYPE_NONE) { + if ((format != chapter_format && format != GST_FORMAT_TIME) || + end_type != GST_SEEK_TYPE_SET) { + GST_DEBUG_OBJECT (src, "end seek type not supported"); + return FALSE; + } + } + + if (cur_type != GST_SEEK_TYPE_SET) { + GST_DEBUG_OBJECT (src, "only SEEK_TYPE_SET is supported"); + return FALSE; + } + + if (format == angle_format) { + GST_OBJECT_LOCK (src); + if (new_off < 0 || new_off >= src->num_angles) { + GST_OBJECT_UNLOCK (src); + GST_DEBUG_OBJECT (src, "invalid angle %d, only %d available", + src->num_angles, src->num_angles); + return FALSE; + } + src->angle = (gint) new_off; + GST_OBJECT_UNLOCK (src); + GST_DEBUG_OBJECT (src, "switched to angle %d", (gint) new_off + 1); + return TRUE; + } + + if (format != chapter_format && format != title_format && + format != GST_FORMAT_BYTES && format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (src, "unsupported seek format %d (%s)", format, + gst_format_get_name (format)); + return FALSE; + } + + if (format == GST_FORMAT_BYTES) { + GST_DEBUG_OBJECT (src, "Requested seek to byte %" G_GUINT64_FORMAT, + new_off); + } else if (format == GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (src, "Requested seek to time %" GST_TIME_FORMAT, + GST_TIME_ARGS (new_off)); + if (gst_dvd_read_src_get_sector_from_time (src, new_off) < 0) { + GST_DEBUG_OBJECT (src, "Can't find sector for requested time"); + return FALSE; + } + } + + srcpad = GST_BASE_SRC_PAD (src); + + /* check whether the seek looks reasonable (ie within possible range) */ + if (format == GST_FORMAT_BYTES) { + GST_OBJECT_LOCK (src); + query_ok = gst_dvd_read_src_get_size (src, &total); + GST_OBJECT_UNLOCK (src); + } else { + query_ok = gst_pad_query_duration (srcpad, format, &total); + } + + if (!query_ok) { + GST_DEBUG_OBJECT (src, "Failed to query duration in format %s", + gst_format_get_name (format)); + return FALSE; + } + + GST_DEBUG_OBJECT (src, "Total %s: %12" G_GINT64_FORMAT, + gst_format_get_name (format), total); + GST_DEBUG_OBJECT (src, "Seek to %s: %12" G_GINT64_FORMAT, + gst_format_get_name (format), new_off); + + if (new_off >= total) { + GST_DEBUG_OBJECT (src, "Seek position out of range"); + return FALSE; + } + + /* set segment to seek format; this allows us to use the do_seek + * virtual function and let the base source handle all the tricky + * stuff for us. We don't use the segment internally anyway */ + /* FIXME: can't take the stream lock here - what to do? */ + GST_OBJECT_LOCK (src); + GST_BASE_SRC (src)->segment.format = format; + GST_BASE_SRC (src)->segment.start = 0; + GST_BASE_SRC (src)->segment.stop = total; + GST_BASE_SRC (src)->segment.duration = total; + GST_OBJECT_UNLOCK (src); + + return GST_BASE_SRC_CLASS (parent_class)->event (GST_BASE_SRC (src), event); +} + +static void +gst_dvd_read_src_get_sector_bounds (GstDvdReadSrc * src, gint * first, + gint * last) +{ + gint c1, c2, tmp; + cur_title_get_chapter_bounds (src, 0, &c1, &tmp); + cur_title_get_chapter_bounds (src, src->num_chapters - 1, &tmp, &c2); + *first = src->cur_pgc->cell_playback[c1].first_sector; + *last = src->cur_pgc->cell_playback[c2].last_sector; +} + +static gboolean +gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s) +{ + GstDvdReadSrc *src; + + src = GST_DVD_READ_SRC (basesrc); + + GST_DEBUG_OBJECT (src, "Seeking to %s: %12" G_GINT64_FORMAT, + gst_format_get_name (s->format), s->position); + + /* Ignore the first seek to 0, as it breaks starting playback + * from another chapter by seeking back to sector 0 */ + if (src->first_seek && s->format == GST_FORMAT_BYTES && s->start == 0) { + src->first_seek = FALSE; + return TRUE; + } + + if (s->format == sector_format || s->format == GST_FORMAT_BYTES + || s->format == GST_FORMAT_TIME) { + guint old; + + old = src->cur_pack; + + if (s->format == sector_format) { + gint first, last; + gst_dvd_read_src_get_sector_bounds (src, &first, &last); + GST_DEBUG_OBJECT (src, "Format is sector, seeking to %" G_GINT64_FORMAT, + s->position); + src->cur_pack = s->position; + if (src->cur_pack < first) + src->cur_pack = first; + if (src->cur_pack > last) + src->cur_pack = last; + } else if (s->format == GST_FORMAT_TIME) { + gint sector; + GST_DEBUG_OBJECT (src, "Format is time"); + + sector = gst_dvd_read_src_get_sector_from_time (src, s->position); + + GST_DEBUG_OBJECT (src, "Time %" GST_TIME_FORMAT " => sector %d", + GST_TIME_ARGS (s->position), sector); + + /* really shouldn't happen, we've checked this earlier ... */ + g_return_val_if_fail (sector >= 0, FALSE); + + src->cur_pack = sector; + } else { + /* byte format */ + gint first, last; + gst_dvd_read_src_get_sector_bounds (src, &first, &last); + GST_DEBUG_OBJECT (src, "Format is byte"); + src->cur_pack = s->position / DVD_VIDEO_LB_LEN; + if (((gint64) src->cur_pack * DVD_VIDEO_LB_LEN) != s->position) { + GST_LOG_OBJECT (src, "rounded down offset %" G_GINT64_FORMAT " => %" + G_GINT64_FORMAT, s->position, + (gint64) src->cur_pack * DVD_VIDEO_LB_LEN); + } + src->cur_pack += first; + } + + if (!gst_dvd_read_src_goto_sector (src, src->angle)) { + GST_DEBUG_OBJECT (src, "seek to sector 0x%08x failed", src->cur_pack); + src->cur_pack = old; + return FALSE; + } + + GST_LOG_OBJECT (src, "seek to sector 0x%08x ok", src->cur_pack); + } else if (s->format == chapter_format) { + if (!gst_dvd_read_src_goto_chapter (src, (gint) s->position)) { + GST_DEBUG_OBJECT (src, "seek to chapter %d failed", + (gint) s->position + 1); + return FALSE; + } + GST_INFO_OBJECT (src, "seek to chapter %d ok", (gint) s->position + 1); + src->chapter = s->position; + } else if (s->format == title_format) { + if (!gst_dvd_read_src_goto_title (src, (gint) s->position, src->angle) || + !gst_dvd_read_src_goto_chapter (src, 0)) { + GST_DEBUG_OBJECT (src, "seek to title %d failed", (gint) s->position); + return FALSE; + } + src->title = (gint) s->position; + src->chapter = 0; + GST_INFO_OBJECT (src, "seek to title %d ok", src->title + 1); + } else { + g_return_val_if_reached (FALSE); + } + + src->need_newsegment = TRUE; + return TRUE; +} + +static gboolean +gst_dvd_read_src_src_event (GstBaseSrc * basesrc, GstEvent * event) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (basesrc); + gboolean res; + + GST_LOG_OBJECT (src, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + res = gst_dvd_read_src_handle_seek_event (src, event); + break; + default: + res = GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event); + break; + } + + return res; +} + +static GstEvent * +gst_dvd_read_src_make_clut_change_event (GstDvdReadSrc * src, + const guint32 * clut) +{ + GstStructure *structure; + gchar name[16]; + gint i; + + structure = gst_structure_new ("application/x-gst-dvd", + "event", G_TYPE_STRING, "dvd-spu-clut-change", NULL); + + /* Create a separate field for each value in the table. */ + for (i = 0; i < 16; i++) { + g_snprintf (name, sizeof (name), "clut%02d", i); + gst_structure_set (structure, name, G_TYPE_INT, (int) clut[i], NULL); + } + + /* Create the DVD event and put the structure into it. */ + return gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_STICKY, structure); +} + +static gint64 +gst_dvd_read_src_convert_timecode (dvd_time_t * time) +{ + gint64 ret_time; + const gint64 one_hour = 3600 * GST_SECOND; + const gint64 one_min = 60 * GST_SECOND; + + g_return_val_if_fail ((time->hour >> 4) < 0xa + && (time->hour & 0xf) < 0xa, -1); + g_return_val_if_fail ((time->minute >> 4) < 0x7 + && (time->minute & 0xf) < 0xa, -1); + g_return_val_if_fail ((time->second >> 4) < 0x7 + && (time->second & 0xf) < 0xa, -1); + + ret_time = ((time->hour >> 4) * 10 + (time->hour & 0xf)) * one_hour; + ret_time += ((time->minute >> 4) * 10 + (time->minute & 0xf)) * one_min; + ret_time += ((time->second >> 4) * 10 + (time->second & 0xf)) * GST_SECOND; + + return ret_time; +} + +static gboolean +gst_dvd_read_src_do_duration_query (GstDvdReadSrc * src, GstQuery * query) +{ + GstFormat format; + gint64 val = 0; + + gst_query_parse_duration (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME:{ + if (src->cur_pgc == NULL) + return FALSE; + val = gst_dvd_read_src_convert_timecode (&src->cur_pgc->playback_time); + if (val < 0) + return FALSE; + break; + } + case GST_FORMAT_BYTES:{ + if (!gst_dvd_read_src_get_size (src, &val)) + return FALSE; + break; + } + default:{ + if (format == sector_format) { + val = DVDFileSize (src->dvd_title); + } else if (format == title_format) { + val = src->tt_srpt->nr_of_srpts; + } else if (format == chapter_format) { + val = src->num_chapters; + } else if (format == angle_format) { + val = src->tt_srpt->title[src->title].nr_of_angles; + } else { + GST_DEBUG_OBJECT (src, "Don't know how to handle format %d (%s)", + format, gst_format_get_name (format)); + return FALSE; + } + break; + } + } + + GST_LOG_OBJECT (src, "duration = %" G_GINT64_FORMAT " %s", val, + gst_format_get_name (format)); + + gst_query_set_duration (query, format, val); + return TRUE; +} + +static gboolean +gst_dvd_read_src_do_position_query (GstDvdReadSrc * src, GstQuery * query) +{ + GstFormat format; + gint64 val; + + gst_query_parse_position (query, &format, NULL); + + switch (format) { + case GST_FORMAT_BYTES:{ + val = (gint64) src->cur_pack * DVD_VIDEO_LB_LEN; + break; + } + default:{ + if (format == sector_format) { + val = src->cur_pack; + } else if (format == title_format) { + val = src->title; + } else if (format == chapter_format) { + val = src->chapter; + } else if (format == angle_format) { + val = src->angle; + } else { + GST_DEBUG_OBJECT (src, "Don't know how to handle format %d (%s)", + format, gst_format_get_name (format)); + return FALSE; + } + break; + } + } + + GST_LOG_OBJECT (src, "position = %" G_GINT64_FORMAT " %s", val, + gst_format_get_name (format)); + + gst_query_set_position (query, format, val); + return TRUE; +} + +static gboolean +gst_dvd_read_src_do_convert_query (GstDvdReadSrc * src, GstQuery * query) +{ + GstFormat src_format, dest_format; + gboolean ret = FALSE; + gint64 src_val, dest_val = -1; + + gst_query_parse_convert (query, &src_format, &src_val, &dest_format, NULL); + + if (src_format == dest_format) { + dest_val = src_val; + ret = TRUE; + goto done; + } + + /* Formats to consider: TIME, DEFAULT, BYTES, title, chapter, sector. + * Note: title and chapter are counted as starting from 0 here, just like + * in the context of seek events. Another note: DEFAULT format is undefined */ + + if (src_format == GST_FORMAT_BYTES) { + src_format = sector_format; + src_val /= DVD_VIDEO_LB_LEN; + } + + if (src_format == sector_format) { + /* SECTOR => xyz */ + if (dest_format == GST_FORMAT_TIME && src_val < G_MAXUINT) { + dest_val = gst_dvd_read_src_get_time_for_sector (src, (guint) src_val); + ret = (dest_val >= 0); + } else if (dest_format == GST_FORMAT_BYTES) { + dest_val = src_val * DVD_VIDEO_LB_LEN; + ret = TRUE; + } else { + ret = FALSE; + } + } else if (src_format == title_format) { + /* TITLE => xyz */ + if (dest_format == GST_FORMAT_TIME) { + /* not really true, but we use this to trick the base source into + * handling seeks in title-format for us (the source won't know that + * we changed the title in this case) (changing titles should really + * be done with an interface rather than a seek, but for now we're + * stuck with this mechanism. Fix in 0.11) */ + dest_val = (GstClockTime) 0; + ret = TRUE; + } else { + ret = FALSE; + } + } else if (src_format == chapter_format) { + /* CHAPTER => xyz */ + if (dest_format == GST_FORMAT_TIME) { + if (src->num_chapters >= 0 && src_val < src->num_chapters) { + dest_val = src->chapter_starts[src_val]; + ret = TRUE; + } + } else if (dest_format == sector_format) { + } else { + ret = FALSE; + } + } else if (src_format == GST_FORMAT_TIME) { + /* TIME => xyz */ + if (dest_format == sector_format || dest_format == GST_FORMAT_BYTES) { + dest_val = gst_dvd_read_src_get_sector_from_time (src, src_val); + ret = (dest_val >= 0); + if (dest_format == GST_FORMAT_BYTES) + dest_val *= DVD_VIDEO_LB_LEN; + } else if (dest_format == chapter_format) { + if (src->chapter_starts != NULL) { + gint i; + + for (i = src->num_chapters - 1; i >= 0; --i) { + if (src->chapter_starts && src->chapter_starts[i] >= src_val) { + dest_val = i; + ret = TRUE; + break; + } + } + } else { + ret = FALSE; + } + } else { + ret = FALSE; + } + } else { + ret = FALSE; + } + +done: + + if (ret) { + gst_query_set_convert (query, src_format, src_val, dest_format, dest_val); + } + + return ret; +} + +static gboolean +gst_dvd_read_src_src_query (GstBaseSrc * basesrc, GstQuery * query) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (basesrc); + gboolean res = TRUE; + + GST_LOG_OBJECT (src, "handling %s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION: + GST_OBJECT_LOCK (src); + if (GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_FLAG_STARTED)) { + res = gst_dvd_read_src_do_duration_query (src, query); + } else { + GST_DEBUG_OBJECT (src, "query failed: not started"); + res = FALSE; + } + GST_OBJECT_UNLOCK (src); + break; + case GST_QUERY_POSITION: + GST_OBJECT_LOCK (src); + if (GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_FLAG_STARTED)) { + res = gst_dvd_read_src_do_position_query (src, query); + } else { + GST_DEBUG_OBJECT (src, "query failed: not started"); + res = FALSE; + } + GST_OBJECT_UNLOCK (src); + break; + case GST_QUERY_CONVERT: + GST_OBJECT_LOCK (src); + if (GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_FLAG_STARTED)) { + res = gst_dvd_read_src_do_convert_query (src, query); + } else { + GST_DEBUG_OBJECT (src, "query failed: not started"); + res = FALSE; + } + GST_OBJECT_UNLOCK (src); + break; + default: + res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); + break; + } + + return res; +} + +static gboolean +gst_dvd_read_src_goto_sector (GstDvdReadSrc * src, int angle) +{ + gint seek_to = src->cur_pack; + gint chapter, next, cur, i; + + /* retrieve position */ + src->cur_pack = 0; + GST_DEBUG_OBJECT (src, "Goto sector %d, angle %d, within %d chapters", + seek_to, angle, src->num_chapters); + + for (i = 0; i < src->num_chapters; i++) { + gint c1, c2; + + cur_title_get_chapter_bounds (src, i, &c1, &c2); + GST_DEBUG_OBJECT (src, " Looking in chapter %d, bounds: %d %d", i, c1, c2); + + for (next = cur = c1; cur < c2;) { + gint first = src->cur_pgc->cell_playback[cur].first_sector; + gint last = src->cur_pgc->cell_playback[cur].last_sector; + GST_DEBUG_OBJECT (src, "Cell %d sector bounds: %d %d", cur, first, last); + cur = next; + if (src->cur_pgc->cell_playback[cur].block_type == BLOCK_TYPE_ANGLE_BLOCK) + cur += angle; + next = gst_dvd_read_src_get_next_cell (src, src->cur_pgc, cur); + /* seeking to 0 should end up at first chapter in any case */ + if ((seek_to >= first && seek_to <= last) || (seek_to == 0 && i == 0)) { + GST_DEBUG_OBJECT (src, "Seek target found in chapter %d", i); + chapter = i; + goto done; + } + } + } + + GST_DEBUG_OBJECT (src, "Seek to sector %u failed", seek_to); + + return FALSE; + +done: + { + /* so chapter $chapter and cell $cur contain our sector + * of interest. Let's go there! */ + GST_INFO_OBJECT (src, "Seek succeeded, going to chapter %u, cell %u", + chapter + 1, cur); + + gst_dvd_read_src_goto_chapter (src, chapter); + src->cur_cell = cur; + src->next_cell = next; + src->new_cell = FALSE; + src->cur_pack = seek_to; + + return TRUE; + } +} + + +/*** URI interface ***/ + +static GstURIType +gst_dvd_read_src_uri_get_type (GType type) +{ + return GST_URI_SRC; +} + +static const gchar *const * +gst_dvd_read_src_uri_get_protocols (GType type) +{ + static const gchar *protocols[] = { "dvd", NULL }; + + return protocols; +} + +static gchar * +gst_dvd_read_src_uri_get_uri (GstURIHandler * handler) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (handler); + gchar *uri; + + GST_OBJECT_LOCK (src); + uri = g_strdup_printf ("dvd://%d,%d,%d", src->uri_title, src->uri_chapter, + src->uri_angle); + GST_OBJECT_UNLOCK (src); + + return uri; +} + +static gboolean +gst_dvd_read_src_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) +{ + GstDvdReadSrc *src = GST_DVD_READ_SRC (handler); + + /* parse out the new t/c/a and seek to them */ + { + gchar *location = NULL; + gchar **strs; + gchar **strcur; + gint pos = 0; + + location = gst_uri_get_location (uri); + + GST_OBJECT_LOCK (src); + + src->uri_title = 1; + src->uri_chapter = 1; + src->uri_angle = 1; + + if (!location) + goto empty_location; + + strcur = strs = g_strsplit (location, ",", 0); + while (strcur && *strcur) { + gint val; + + if (!sscanf (*strcur, "%d", &val)) + break; + + if (val <= 0) { + g_warning ("Invalid value %d in URI '%s'. Must be 1 or greater", + val, location); + break; + } + + switch (pos) { + case 0: + src->uri_title = val; + break; + case 1: + src->uri_chapter = val; + break; + case 2: + src->uri_angle = val; + break; + } + + strcur++; + pos++; + } + + if (pos > 0 && GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_FLAG_STARTED)) { + src->title = src->uri_title - 1; + src->chapter = src->uri_chapter - 1; + src->angle = src->uri_angle - 1; + src->new_seek = TRUE; + } + + g_strfreev (strs); + g_free (location); + + empty_location: + + GST_OBJECT_UNLOCK (src); + } + + return TRUE; +} + +static void +gst_dvd_read_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_dvd_read_src_uri_get_type; + iface->get_protocols = gst_dvd_read_src_uri_get_protocols; + iface->get_uri = gst_dvd_read_src_uri_get_uri; + iface->set_uri = gst_dvd_read_src_uri_set_uri; +} + +static gboolean +dvdread_element_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gstgst_dvd_read_src_debug, "dvdreadsrc", 0, + "DVD reader element based on dvdreadsrc"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + return gst_element_register (plugin, "dvdreadsrc", GST_RANK_NONE, + GST_TYPE_DVD_READ_SRC); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (dvdreadsrc, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + dvdread, + "Access a DVD with dvdread", + plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/dvdread/dvdreadsrc.h b/ext/dvdread/dvdreadsrc.h new file mode 100644 index 0000000000..d31c961f18 --- /dev/null +++ b/ext/dvdread/dvdreadsrc.h @@ -0,0 +1,103 @@ +/* GStreamer DVD title source + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2001> Billy Biggs . + * Copyright (C) <2006> Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_DVD_READ_SRC_H__ +#define __GST_DVD_READ_SRC_H__ + +#include +#include + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DVD_READ_SRC (gst_dvd_read_src_get_type()) +#define GST_DVD_READ_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVD_READ_SRC,GstDvdReadSrc)) +#define GST_DVD_READ_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVD_READ_SRC,GstDvdReadSrcClass)) +#define GST_IS_DVD_READ_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVD_READ_SRC)) +#define GST_IS_DVD_READ_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVD_READ_SRC)) + +typedef struct _GstDvdReadSrc GstDvdReadSrc; +typedef struct _GstDvdReadSrcClass GstDvdReadSrcClass; + +struct _GstDvdReadSrc { + GstPushSrc pushsrc; + + /* location */ + gchar *location; + + gboolean first_seek; + gboolean new_seek; + gboolean change_cell; + + gboolean new_cell; + + gint uri_title; /* set via the URI handler or properties, */ + gint uri_chapter; /* otherwise not touched; these values */ + gint uri_angle; /* start from 1 */ + + gint title; /* current position while open, set to the */ + gint chapter; /* URI-set values in ::start(). these */ + gint angle; /* values start from 0 */ + + gint start_cell, last_cell, cur_cell; + gint cur_pack; + gint next_cell; + dvd_reader_t *dvd; + ifo_handle_t *vmg_file; + + /* title stuff */ + gint ttn; + tt_srpt_t *tt_srpt; + ifo_handle_t *vts_file; + vts_ptt_srpt_t *vts_ptt_srpt; + vts_tmapt_t *vts_tmapt; + dvd_file_t *dvd_title; + gint num_chapters; + gint num_angles; + + GstClockTime *chapter_starts; /* start time of chapters within title */ + + /* which program chain to watch (based on title and chapter number) */ + pgc_t *cur_pgc; + gint pgc_id; + gint pgn; + + gboolean need_newsegment; + GstEvent *title_lang_event_pending; + GstEvent *pending_clut_event; +}; + +struct _GstDvdReadSrcClass { + GstPushSrcClass parent_class; +}; + +GType gst_dvd_read_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (dvdreadsrc); + +G_END_DECLS + +#endif /* __GST_DVD_READ_SRC_H__ */ + diff --git a/ext/dvdread/meson.build b/ext/dvdread/meson.build new file mode 100644 index 0000000000..f075d8462b --- /dev/null +++ b/ext/dvdread/meson.build @@ -0,0 +1,14 @@ +dvdread_dep = dependency('dvdread', version : '>= 0.5.0', required : get_option('dvdread')) + +if gmodule_dep.found() and dvdread_dep.found() + dvdread = library('gstdvdread', + ['dvdreadsrc.c'], + c_args : ugly_args, + include_directories : [configinc, libsinc], + dependencies : [gstbase_dep, gmodule_dep, dvdread_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(dvdread, install_dir : plugins_pkgconfig_install_dir) + plugins += [dvdread] +endif diff --git a/ext/meson.build b/ext/meson.build new file mode 100644 index 0000000000..c33bb1ca94 --- /dev/null +++ b/ext/meson.build @@ -0,0 +1,8 @@ +subdir('a52dec') +subdir('amrnb') +subdir('amrwbdec') +subdir('cdio') +subdir('dvdread') +subdir('mpeg2dec') +subdir('sidplay') +subdir('x264') diff --git a/ext/mpeg2dec/gstmpeg2dec.c b/ext/mpeg2dec/gstmpeg2dec.c new file mode 100644 index 0000000000..12b3cac121 --- /dev/null +++ b/ext/mpeg2dec/gstmpeg2dec.c @@ -0,0 +1,1180 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include + +#include "gstmpeg2dec.h" + +#include +#include + +/* 16byte-aligns a buffer for libmpeg2 */ +#define ALIGN_16(p) ((void *)(((uintptr_t)(p) + 15) & ~((uintptr_t)15))) + +GST_DEBUG_CATEGORY_STATIC (mpeg2dec_debug); +#define GST_CAT_DEFAULT mpeg2dec_debug +GST_DEBUG_CATEGORY_STATIC (CAT_PERFORMANCE); + +/* Send a warning message about decoding errors after receiving this many + * STATE_INVALID return values from mpeg2_parse. -1 means never. + */ +#define WARN_THRESHOLD (5) + +static GstStaticPadTemplate sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) [ 1, 2 ], " "systemstream = (boolean) false") + ); + +static GstStaticPadTemplate src_template_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw, " + "format = (string) { YV12, I420, Y42B, Y444 }, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0/1, 2147483647/1 ]") + ); + +#define gst_mpeg2dec_parent_class parent_class +G_DEFINE_TYPE (GstMpeg2dec, gst_mpeg2dec, GST_TYPE_VIDEO_DECODER); +GST_ELEMENT_REGISTER_DEFINE (mpeg2dec, "mpeg2dec", GST_RANK_SECONDARY, + GST_TYPE_MPEG2DEC); + +static void gst_mpeg2dec_finalize (GObject * object); + +/* GstVideoDecoder base class method */ +static gboolean gst_mpeg2dec_open (GstVideoDecoder * decoder); +static gboolean gst_mpeg2dec_close (GstVideoDecoder * decoder); +static gboolean gst_mpeg2dec_start (GstVideoDecoder * decoder); +static gboolean gst_mpeg2dec_stop (GstVideoDecoder * decoder); +static gboolean gst_mpeg2dec_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state); +static gboolean gst_mpeg2dec_flush (GstVideoDecoder * decoder); +static GstFlowReturn gst_mpeg2dec_finish (GstVideoDecoder * decoder); +static GstFlowReturn gst_mpeg2dec_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame); +static gboolean gst_mpeg2dec_decide_allocation (GstVideoDecoder * decoder, + GstQuery * query); + +static void gst_mpeg2dec_clear_buffers (GstMpeg2dec * mpeg2dec); +static gboolean gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, + GstVideoCodecFrame * in_frame, GstVideoFrame * in_vframe); + +static void +gst_mpeg2dec_class_init (GstMpeg2decClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *video_decoder_class = GST_VIDEO_DECODER_CLASS (klass); + + gobject_class->finalize = gst_mpeg2dec_finalize; + + gst_element_class_add_static_pad_template (element_class, + &src_template_factory); + gst_element_class_add_static_pad_template (element_class, + &sink_template_factory); + gst_element_class_set_static_metadata (element_class, + "mpeg1 and mpeg2 video decoder", "Codec/Decoder/Video", + "Uses libmpeg2 to decode MPEG video streams", + "Wim Taymans "); + + video_decoder_class->open = GST_DEBUG_FUNCPTR (gst_mpeg2dec_open); + video_decoder_class->close = GST_DEBUG_FUNCPTR (gst_mpeg2dec_close); + video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_mpeg2dec_start); + video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_mpeg2dec_stop); + video_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_mpeg2dec_flush); + video_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_mpeg2dec_set_format); + video_decoder_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_mpeg2dec_handle_frame); + video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_mpeg2dec_finish); + video_decoder_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_mpeg2dec_decide_allocation); + + GST_DEBUG_CATEGORY_INIT (mpeg2dec_debug, "mpeg2dec", 0, + "MPEG-2 Video Decoder"); + GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE"); +} + +static void +gst_mpeg2dec_init (GstMpeg2dec * mpeg2dec) +{ + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (mpeg2dec), TRUE); + gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (mpeg2dec), TRUE); + gst_video_decoder_set_use_default_pad_acceptcaps (GST_VIDEO_DECODER_CAST + (mpeg2dec), TRUE); + GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (mpeg2dec)); + + /* initialize the mpeg2dec acceleration */ +} + +static void +gst_mpeg2dec_finalize (GObject * object) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (object); + + if (mpeg2dec->decoder) { + GST_DEBUG_OBJECT (mpeg2dec, "closing decoder"); + mpeg2_close (mpeg2dec->decoder); + mpeg2dec->decoder = NULL; + } + + gst_mpeg2dec_clear_buffers (mpeg2dec); + g_free (mpeg2dec->dummybuf[3]); + mpeg2dec->dummybuf[3] = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_mpeg2dec_open (GstVideoDecoder * decoder) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + mpeg2_accel (MPEG2_ACCEL_DETECT); + if ((mpeg2dec->decoder = mpeg2_init ()) == NULL) + return FALSE; + mpeg2dec->info = mpeg2_info (mpeg2dec->decoder); + + return TRUE; +} + +static gboolean +gst_mpeg2dec_close (GstVideoDecoder * decoder) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + if (mpeg2dec->decoder) { + mpeg2_close (mpeg2dec->decoder); + mpeg2dec->decoder = NULL; + mpeg2dec->info = NULL; + } + gst_mpeg2dec_clear_buffers (mpeg2dec); + + return TRUE; +} + +static gboolean +gst_mpeg2dec_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + /* Save input state to be used as reference for output state */ + if (mpeg2dec->input_state) + gst_video_codec_state_unref (mpeg2dec->input_state); + mpeg2dec->input_state = gst_video_codec_state_ref (state); + + return TRUE; +} + +static gboolean +gst_mpeg2dec_start (GstVideoDecoder * decoder) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + + return TRUE; +} + +static gboolean +gst_mpeg2dec_stop (GstVideoDecoder * decoder) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + mpeg2_reset (mpeg2dec->decoder, 0); + mpeg2_skip (mpeg2dec->decoder, 1); + + gst_mpeg2dec_clear_buffers (mpeg2dec); + + if (mpeg2dec->input_state) + gst_video_codec_state_unref (mpeg2dec->input_state); + mpeg2dec->input_state = NULL; + + if (mpeg2dec->downstream_pool) { + gst_buffer_pool_set_active (mpeg2dec->downstream_pool, FALSE); + gst_object_unref (mpeg2dec->downstream_pool); + } + + return TRUE; +} + +static gboolean +gst_mpeg2dec_flush (GstVideoDecoder * decoder) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + + /* reset the initial video state */ + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + mpeg2_reset (mpeg2dec->decoder, 1); + mpeg2_skip (mpeg2dec->decoder, 1); + + gst_mpeg2dec_clear_buffers (mpeg2dec); + + if (mpeg2dec->downstream_pool) + gst_buffer_pool_set_active (mpeg2dec->downstream_pool, FALSE); + + return TRUE; +} + +static GstFlowReturn +gst_mpeg2dec_finish (GstVideoDecoder * decoder) +{ + return GST_FLOW_OK; +} + +static GstBufferPool * +gst_mpeg2dec_create_generic_pool (GstAllocator * allocator, + GstAllocationParams * params, GstCaps * caps, guint size, guint min, + guint max, GstStructure ** out_config) +{ + GstBufferPool *pool; + GstStructure *config; + + pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_set_allocator (config, allocator, params); + gst_buffer_pool_config_set_params (config, caps, size, min, max); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + *out_config = config; + return pool; +} + +static gboolean +gst_mpeg2dec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) +{ + GstMpeg2dec *dec = GST_MPEG2DEC (decoder); + GstBufferPool *pool; + guint size, min, max; + GstStructure *config, *down_config = NULL; + GstAllocator *allocator; + GstAllocationParams params; + gboolean update_allocator; + gboolean has_videometa = FALSE; + GstCaps *caps; + + /* Get rid of ancient pool */ + if (dec->downstream_pool) { + gst_buffer_pool_set_active (dec->downstream_pool, FALSE); + gst_object_unref (dec->downstream_pool); + dec->downstream_pool = NULL; + } + + /* Get negotiated allocation caps */ + gst_query_parse_allocation (query, &caps, NULL); + + /* Set allocation parameters to guarantee 16-byte aligned output buffers */ + if (gst_query_get_n_allocation_params (query) > 0) { + gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms); + update_allocator = TRUE; + } else { + allocator = NULL; + gst_allocation_params_init (¶ms); + update_allocator = FALSE; + } + + params.align = MAX (params.align, 15); + + if (update_allocator) + gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); + else + gst_query_add_allocation_param (query, allocator, ¶ms); + + /* Now chain up to the parent class to guarantee that we can + * get a buffer pool from the query */ + if (!GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder, + query)) { + if (allocator) + gst_object_unref (allocator); + return FALSE; + } + + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + + config = gst_buffer_pool_get_config (pool); + if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + has_videometa = TRUE; + } + + if (dec->need_alignment) { + /* If downstream does not support video meta, we will have to copy, keep + * the downstream pool to avoid double copying */ + if (!has_videometa) { + dec->downstream_pool = pool; + pool = NULL; + down_config = config; + config = NULL; + min = 2; + max = 0; + } + + /* In case downstream support video meta, but the downstream pool does not + * have alignment support, discard downstream pool and use video pool */ + else if (!gst_buffer_pool_has_option (pool, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT)) { + gst_object_unref (pool); + pool = NULL; + gst_structure_free (config); + config = NULL; + } + + if (!pool) + pool = gst_mpeg2dec_create_generic_pool (allocator, ¶ms, caps, size, + min, max, &config); + + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_video_alignment (config, &dec->valign); + } + + if (allocator) + gst_object_unref (allocator); + + /* If we are copying out, we'll need to setup and activate the other pool */ + if (dec->downstream_pool) { + if (!gst_buffer_pool_set_config (dec->downstream_pool, down_config)) { + down_config = gst_buffer_pool_get_config (dec->downstream_pool); + if (!gst_buffer_pool_config_validate_params (down_config, caps, size, min, + max)) { + gst_structure_free (down_config); + goto config_failed; + } + + if (!gst_buffer_pool_set_config (dec->downstream_pool, down_config)) + goto config_failed; + } + + if (!gst_buffer_pool_set_active (dec->downstream_pool, TRUE)) + goto activate_failed; + } + + /* Now configure the pool, if the pool had made some changes, it will + * return FALSE. Validate the changes ...*/ + if (!gst_buffer_pool_set_config (pool, config)) { + config = gst_buffer_pool_get_config (pool); + + /* Check basic params */ + if (!gst_buffer_pool_config_validate_params (config, caps, size, min, max)) { + gst_structure_free (config); + goto config_failed; + } + + /* If needed, check that resulting alignment is still valid */ + if (dec->need_alignment) { + GstVideoAlignment valign; + + if (!gst_buffer_pool_config_get_video_alignment (config, &valign)) { + gst_structure_free (config); + goto config_failed; + } + + if (valign.padding_left != 0 || valign.padding_top != 0 + || valign.padding_right < dec->valign.padding_right + || valign.padding_bottom < dec->valign.padding_bottom) { + gst_structure_free (config); + goto config_failed; + } + } + + if (!gst_buffer_pool_set_config (pool, config)) + goto config_failed; + } + + /* For external pools, we need to check strides */ + if (!GST_IS_VIDEO_BUFFER_POOL (pool) && has_videometa) { + GstBuffer *buffer; + const GstVideoFormatInfo *finfo; + GstVideoMeta *vmeta; + gint uv_stride; + + if (!gst_buffer_pool_set_active (pool, TRUE)) + goto activate_failed; + + if (gst_buffer_pool_acquire_buffer (pool, &buffer, NULL) != GST_FLOW_OK) { + gst_buffer_pool_set_active (pool, FALSE); + goto acquire_failed; + } + + vmeta = gst_buffer_get_video_meta (buffer); + finfo = gst_video_format_get_info (vmeta->format); + + /* Check that strides are compatible. In this case, we can scale the + * stride directly since all the pixel strides for the formats we support + * is 1 */ + uv_stride = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, 1, vmeta->stride[0]); + if (uv_stride != vmeta->stride[1] || uv_stride != vmeta->stride[2]) { + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + + pool = gst_mpeg2dec_create_generic_pool (allocator, ¶ms, caps, size, + min, max, &config); + + if (dec->need_alignment) { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_video_alignment (config, &dec->valign); + } + + /* Generic pool don't fail on _set_config() */ + gst_buffer_pool_set_config (pool, config); + } + + gst_buffer_unref (buffer); + } + + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + gst_object_unref (pool); + + return TRUE; + +config_failed: + gst_object_unref (pool); + GST_ELEMENT_ERROR (dec, RESOURCE, SETTINGS, + ("Failed to configure buffer pool"), + ("Configuration is most likely invalid, please report this issue.")); + return FALSE; + +activate_failed: + gst_object_unref (pool); + GST_ELEMENT_ERROR (dec, RESOURCE, SETTINGS, + ("Failed to activate buffer pool"), (NULL)); + return FALSE; + +acquire_failed: + gst_object_unref (pool); + GST_ELEMENT_ERROR (dec, RESOURCE, SETTINGS, + ("Failed to acquire a buffer"), (NULL)); + return FALSE; +} + +static GstFlowReturn +gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, GstVideoCodecFrame * in_frame, + GstVideoFrame * input_vframe) +{ + GstVideoCodecState *state; + GstVideoInfo *info; + GstVideoInfo *dinfo; + GstVideoFrame output_frame; + GstFlowReturn ret; + GstBuffer *buffer = NULL; + + state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (dec)); + info = &state->info; + dinfo = &dec->decoded_info; + + GST_CAT_LOG_OBJECT (CAT_PERFORMANCE, dec, + "Copying input buffer %ux%u (%" G_GSIZE_FORMAT ") to output buffer " + "%ux%u (%" G_GSIZE_FORMAT ")", dinfo->width, dinfo->height, + dinfo->size, info->width, info->height, info->size); + + ret = gst_buffer_pool_acquire_buffer (dec->downstream_pool, &buffer, NULL); + if (ret != GST_FLOW_OK) + goto beach; + + if (!gst_video_frame_map (&output_frame, info, buffer, GST_MAP_WRITE)) + goto map_fail; + + if (in_frame->output_buffer) + gst_buffer_unref (in_frame->output_buffer); + in_frame->output_buffer = buffer; + + if (!gst_video_frame_copy (&output_frame, input_vframe)) + goto copy_failed; + + gst_video_frame_unmap (&output_frame); + + GST_BUFFER_FLAGS (in_frame->output_buffer) = + GST_BUFFER_FLAGS (input_vframe->buffer); + +beach: + gst_video_codec_state_unref (state); + + return ret; + +map_fail: + { + GST_ERROR_OBJECT (dec, "Failed to map output frame"); + gst_video_codec_state_unref (state); + return GST_FLOW_ERROR; + } + +copy_failed: + { + GST_ERROR_OBJECT (dec, "Failed to copy output frame"); + gst_video_frame_unmap (&output_frame); + gst_video_codec_state_unref (state); + return GST_FLOW_ERROR; + } +} + +typedef struct +{ + gint id; + GstVideoFrame frame; +} GstMpeg2DecBuffer; + +static void +gst_mpeg2dec_clear_buffers (GstMpeg2dec * mpeg2dec) +{ + GList *l; + while ((l = g_list_first (mpeg2dec->buffers))) { + GstMpeg2DecBuffer *mbuf = l->data; + gst_video_frame_unmap (&mbuf->frame); + g_slice_free (GstMpeg2DecBuffer, mbuf); + mpeg2dec->buffers = g_list_delete_link (mpeg2dec->buffers, l); + } +} + +static void +gst_mpeg2dec_save_buffer (GstMpeg2dec * mpeg2dec, gint id, + GstVideoFrame * frame) +{ + GstMpeg2DecBuffer *mbuf; + + GST_LOG_OBJECT (mpeg2dec, "Saving local info for frame %d", id); + + mbuf = g_slice_new0 (GstMpeg2DecBuffer); + mbuf->id = id; + mbuf->frame = *frame; + + mpeg2dec->buffers = g_list_prepend (mpeg2dec->buffers, mbuf); +} + +static gint +gst_mpeg2dec_buffer_compare (GstMpeg2DecBuffer * mbuf, gconstpointer id) +{ + if (mbuf->id == GPOINTER_TO_INT (id)) + return 0; + return -1; +} + +static void +gst_mpeg2dec_discard_buffer (GstMpeg2dec * mpeg2dec, gint id) +{ + GList *l = g_list_find_custom (mpeg2dec->buffers, GINT_TO_POINTER (id), + (GCompareFunc) gst_mpeg2dec_buffer_compare); + + if (l) { + GstMpeg2DecBuffer *mbuf = l->data; + gst_video_frame_unmap (&mbuf->frame); + g_slice_free (GstMpeg2DecBuffer, mbuf); + mpeg2dec->buffers = g_list_delete_link (mpeg2dec->buffers, l); + GST_LOG_OBJECT (mpeg2dec, "Discarded local info for frame %d", id); + } else { + GST_WARNING ("Could not find buffer %d, will be leaked until next reset", + id); + } +} + +static GstVideoFrame * +gst_mpeg2dec_get_buffer (GstMpeg2dec * mpeg2dec, gint id) +{ + GList *l = g_list_find_custom (mpeg2dec->buffers, GINT_TO_POINTER (id), + (GCompareFunc) gst_mpeg2dec_buffer_compare); + + if (l) { + GstMpeg2DecBuffer *mbuf = l->data; + return &mbuf->frame; + } + + return NULL; +} + +static void +init_dummybuf (GstMpeg2dec * mpeg2dec) +{ + g_free (mpeg2dec->dummybuf[3]); + + /* libmpeg2 needs 16 byte aligned buffers... care for this here */ + mpeg2dec->dummybuf[3] = g_malloc0 (mpeg2dec->decoded_info.size + 15); + mpeg2dec->dummybuf[0] = ALIGN_16 (mpeg2dec->dummybuf[3]); + mpeg2dec->dummybuf[1] = + mpeg2dec->dummybuf[0] + + GST_VIDEO_INFO_PLANE_OFFSET (&mpeg2dec->decoded_info, 1); + mpeg2dec->dummybuf[2] = + mpeg2dec->dummybuf[0] + + GST_VIDEO_INFO_PLANE_OFFSET (&mpeg2dec->decoded_info, 2); +} + +static GstFlowReturn +handle_sequence (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime latency; + const mpeg2_sequence_t *sequence; + GstVideoCodecState *state; + GstVideoInfo *vinfo; + GstVideoFormat format; + + sequence = info->sequence; + + if (sequence->frame_period == 0) + goto invalid_frame_period; + + /* mpeg2 video can only be from 16x16 to 4096x4096. Everything + * else is a corrupted file */ + if (sequence->width > 4096 || sequence->width < 16 || + sequence->height > 4096 || sequence->height < 16) + goto invalid_size; + + GST_DEBUG_OBJECT (mpeg2dec, + "widthxheight: %dx%d , decoded_widthxheight: %dx%d", + sequence->picture_width, sequence->picture_height, sequence->width, + sequence->height); + + gst_video_alignment_reset (&mpeg2dec->valign); + + if (sequence->picture_width < sequence->width || + sequence->picture_height < sequence->height) { + GST_DEBUG_OBJECT (mpeg2dec, "we need to crop"); + mpeg2dec->valign.padding_right = sequence->width - sequence->picture_width; + mpeg2dec->valign.padding_bottom = + sequence->height - sequence->picture_height; + mpeg2dec->need_alignment = TRUE; + } else if (sequence->picture_width == sequence->width || + sequence->picture_height == sequence->height) { + GST_DEBUG_OBJECT (mpeg2dec, "no cropping needed"); + mpeg2dec->need_alignment = FALSE; + } else { + goto invalid_picture; + } + + /* get subsampling */ + if (sequence->chroma_width < sequence->width) { + /* horizontally subsampled */ + if (sequence->chroma_height < sequence->height) { + /* and vertically subsamples */ + format = GST_VIDEO_FORMAT_I420; + } else { + format = GST_VIDEO_FORMAT_Y42B; + } + } else { + /* not subsampled */ + format = GST_VIDEO_FORMAT_Y444; + } + + state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (mpeg2dec), + format, sequence->picture_width, sequence->picture_height, + mpeg2dec->input_state); + vinfo = &state->info; + + /* If we don't have a valid upstream PAR override it */ + if (GST_VIDEO_INFO_PAR_N (vinfo) == 1 && + GST_VIDEO_INFO_PAR_D (vinfo) == 1 && + sequence->pixel_width != 0 && sequence->pixel_height != 0) { + guint pixel_width, pixel_height; + + if (mpeg2_guess_aspect (sequence, &pixel_width, &pixel_height)) { + vinfo->par_n = pixel_width; + vinfo->par_d = pixel_height; + } + GST_DEBUG_OBJECT (mpeg2dec, "Setting PAR %d x %d", + vinfo->par_n, vinfo->par_d); + } + vinfo->fps_n = 27000000; + vinfo->fps_d = sequence->frame_period; + + if (!(sequence->flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) + vinfo->interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED; + else + vinfo->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; + + vinfo->chroma_site = GST_VIDEO_CHROMA_SITE_MPEG2; + vinfo->colorimetry.range = GST_VIDEO_COLOR_RANGE_16_235; + + if (sequence->flags & SEQ_FLAG_COLOUR_DESCRIPTION) { + /* do color description */ + switch (sequence->colour_primaries) { + case 1: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case 4: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470M; + break; + case 5: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470BG; + break; + case 6: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M; + break; + case 7: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE240M; + break; + /* 0 forbidden */ + /* 2 unspecified */ + /* 3 reserved */ + /* 8-255 reserved */ + default: + vinfo->colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN; + break; + } + /* matrix coefficients */ + switch (sequence->matrix_coefficients) { + case 1: + vinfo->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + break; + case 4: + vinfo->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_FCC; + break; + case 5: + case 6: + vinfo->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + break; + case 7: + vinfo->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_SMPTE240M; + break; + /* 0 forbidden */ + /* 2 unspecified */ + /* 3 reserved */ + /* 8-255 reserved */ + default: + vinfo->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN; + break; + } + /* transfer characteristics */ + switch (sequence->transfer_characteristics) { + case 1: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + break; + case 4: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_GAMMA22; + break; + case 5: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_GAMMA28; + break; + case 6: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + break; + case 7: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_SMPTE240M; + break; + case 8: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_GAMMA10; + break; + /* 0 forbidden */ + /* 2 unspecified */ + /* 3 reserved */ + /* 9-255 reserved */ + default: + vinfo->colorimetry.transfer = GST_VIDEO_TRANSFER_UNKNOWN; + break; + } + } + + GST_DEBUG_OBJECT (mpeg2dec, + "sequence flags: %d, frame period: %d, frame rate: %d/%d", + sequence->flags, sequence->frame_period, vinfo->fps_n, vinfo->fps_d); + GST_DEBUG_OBJECT (mpeg2dec, "profile: %02x, colour_primaries: %d", + sequence->profile_level_id, sequence->colour_primaries); + GST_DEBUG_OBJECT (mpeg2dec, "transfer chars: %d, matrix coef: %d", + sequence->transfer_characteristics, sequence->matrix_coefficients); + GST_DEBUG_OBJECT (mpeg2dec, + "FLAGS: CONSTRAINED_PARAMETERS:%d, PROGRESSIVE_SEQUENCE:%d", + sequence->flags & SEQ_FLAG_CONSTRAINED_PARAMETERS, + sequence->flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE); + GST_DEBUG_OBJECT (mpeg2dec, "FLAGS: LOW_DELAY:%d, COLOUR_DESCRIPTION:%d", + sequence->flags & SEQ_FLAG_LOW_DELAY, + sequence->flags & SEQ_FLAG_COLOUR_DESCRIPTION); + + /* Save the padded video information */ + mpeg2dec->decoded_info = *vinfo; + gst_video_info_align (&mpeg2dec->decoded_info, &mpeg2dec->valign); + + /* Mpeg2dec has 2 frame latency to produce a picture and 1 frame latency in + * it's parser */ + latency = gst_util_uint64_scale (3 * GST_SECOND, vinfo->fps_d, vinfo->fps_n); + gst_video_decoder_set_latency (GST_VIDEO_DECODER (mpeg2dec), latency, + latency); + + if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (mpeg2dec))) + goto negotiation_fail; + + gst_video_codec_state_unref (state); + + mpeg2_custom_fbuf (mpeg2dec->decoder, 1); + + init_dummybuf (mpeg2dec); + + /* Pump in some null buffers, because otherwise libmpeg2 doesn't + * initialise the discard_fbuf->id */ + mpeg2_set_buf (mpeg2dec->decoder, mpeg2dec->dummybuf, NULL); + mpeg2_set_buf (mpeg2dec->decoder, mpeg2dec->dummybuf, NULL); + mpeg2_set_buf (mpeg2dec->decoder, mpeg2dec->dummybuf, NULL); + gst_mpeg2dec_clear_buffers (mpeg2dec); + + return ret; + +invalid_frame_period: + { + GST_WARNING_OBJECT (mpeg2dec, "Frame period is 0!"); + return GST_FLOW_ERROR; + } +invalid_size: + { + GST_ERROR_OBJECT (mpeg2dec, "Invalid frame dimensions: %d x %d", + sequence->width, sequence->height); + return GST_FLOW_ERROR; + } + +invalid_picture: + { + GST_ERROR_OBJECT (mpeg2dec, "Picture dimension bigger then frame: " + "%d x %d is bigger then %d x %d", sequence->picture_width, + sequence->picture_height, sequence->width, sequence->height); + return GST_FLOW_ERROR; + } + + +negotiation_fail: + { + GST_WARNING_OBJECT (mpeg2dec, "Failed to negotiate with downstream"); + gst_video_codec_state_unref (state); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +handle_picture (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info, + GstVideoCodecFrame * frame) +{ + GstVideoDecoder *decoder = (GstVideoDecoder *) mpeg2dec; + GstFlowReturn ret; + gint type; + const gchar *type_str = NULL; + gboolean key_frame = FALSE; + const mpeg2_picture_t *picture = info->current_picture; + GstVideoFrame vframe; + guint8 *buf[3]; + + ret = gst_video_decoder_allocate_output_frame (decoder, frame); + if (ret != GST_FLOW_OK) + return ret; + + type = picture->flags & PIC_MASK_CODING_TYPE; + switch (type) { + case PIC_FLAG_CODING_TYPE_I: + key_frame = TRUE; + mpeg2_skip (mpeg2dec->decoder, 0); + type_str = "I"; + break; + case PIC_FLAG_CODING_TYPE_P: + type_str = "P"; + break; + case PIC_FLAG_CODING_TYPE_B: + type_str = "B"; + break; + default: + gst_video_codec_frame_ref (frame); + ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + GST_VIDEO_DECODER_ERROR (mpeg2dec, 1, STREAM, DECODE, + ("decoding error"), ("Invalid picture type"), ret); + return ret; + } + + GST_DEBUG_OBJECT (mpeg2dec, "handle picture type %s", type_str); + GST_DEBUG_OBJECT (mpeg2dec, "picture %s, frame %i", + key_frame ? ", kf," : " ", frame->system_frame_number); + + if (GST_VIDEO_INFO_IS_INTERLACED (&mpeg2dec->decoded_info)) { + /* This implies SEQ_FLAG_PROGRESSIVE_SEQUENCE is not set */ + if (picture->flags & PIC_FLAG_TOP_FIELD_FIRST) { + GST_BUFFER_FLAG_SET (frame->output_buffer, GST_VIDEO_BUFFER_FLAG_TFF); + } + if (!(picture->flags & PIC_FLAG_PROGRESSIVE_FRAME)) { + GST_BUFFER_FLAG_SET (frame->output_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED); + } + if (picture->flags & PIC_FLAG_REPEAT_FIRST_FIELD) { + GST_BUFFER_FLAG_SET (frame->output_buffer, GST_VIDEO_BUFFER_FLAG_RFF); + } + } + + if (mpeg2dec->discont_state == MPEG2DEC_DISC_NEW_PICTURE && key_frame) { + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_KEYFRAME; + } + + GST_DEBUG_OBJECT (mpeg2dec, + "picture: %s %s %s %s %s fields:%d ts:%" + GST_TIME_FORMAT, + (picture->flags & PIC_FLAG_PROGRESSIVE_FRAME ? "prog" : " "), + (picture->flags & PIC_FLAG_TOP_FIELD_FIRST ? "tff" : " "), + (picture->flags & PIC_FLAG_REPEAT_FIRST_FIELD ? "rff" : " "), + (picture->flags & PIC_FLAG_SKIP ? "skip" : " "), + (picture->flags & PIC_FLAG_COMPOSITE_DISPLAY ? "composite" : " "), + picture->nb_fields, GST_TIME_ARGS (frame->pts)); + + if (!gst_video_frame_map (&vframe, &mpeg2dec->decoded_info, + frame->output_buffer, GST_MAP_READ | GST_MAP_WRITE)) + goto map_fail; + + buf[0] = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0); + buf[1] = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1); + buf[2] = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 2); + + GST_DEBUG_OBJECT (mpeg2dec, "set_buf: %p %p %p, frame %i", + buf[0], buf[1], buf[2], frame->system_frame_number); + + /* Note: We use a non-null 'id' value to make the distinction + * between the dummy buffers (which have an id of NULL) and the + * ones we did */ + mpeg2_stride (mpeg2dec->decoder, vframe.info.stride[0]); + mpeg2_set_buf (mpeg2dec->decoder, buf, + GINT_TO_POINTER (frame->system_frame_number + 1)); + gst_mpeg2dec_save_buffer (mpeg2dec, frame->system_frame_number, &vframe); + + return ret; + +map_fail: + { + GST_ELEMENT_ERROR (mpeg2dec, RESOURCE, WRITE, ("Failed to map frame"), + (NULL)); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +handle_slice (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstVideoCodecFrame *frame; + const mpeg2_picture_t *picture; + gboolean key_frame = FALSE; + gboolean bidirect_frame = FALSE; + gboolean closed_gop = FALSE; + + GST_DEBUG_OBJECT (mpeg2dec, + "fbuf:%p display_picture:%p current_picture:%p fbuf->id:%d", + info->display_fbuf, info->display_picture, info->current_picture, + GPOINTER_TO_INT (info->display_fbuf->id) - 1); + + /* Note, the fbuf-id is shifted by 1 to make the difference between + * NULL values (used by dummy buffers) and 'real' values */ + frame = gst_video_decoder_get_frame (GST_VIDEO_DECODER (mpeg2dec), + GPOINTER_TO_INT (info->display_fbuf->id) - 1); + if (!frame) + goto no_frame; + picture = info->display_picture; + key_frame = (picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I; + bidirect_frame = + (picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B; + closed_gop = (info->gop->flags & GOP_FLAG_CLOSED_GOP); + + GST_DEBUG_OBJECT (mpeg2dec, "picture flags: %d, type: %d, keyframe: %d", + picture->flags, picture->flags & PIC_MASK_CODING_TYPE, key_frame); + + if (key_frame) { + mpeg2_skip (mpeg2dec->decoder, 0); + } + + if (mpeg2dec->discont_state == MPEG2DEC_DISC_NEW_KEYFRAME && key_frame) + mpeg2dec->discont_state = MPEG2DEC_DISC_NONE; + + if (picture->flags & PIC_FLAG_SKIP) { + GST_DEBUG_OBJECT (mpeg2dec, "dropping buffer because of skip flag"); + ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + mpeg2_skip (mpeg2dec->decoder, 1); + return ret; + } + + /* Skip B-frames if GOP is not closed and waiting for the first keyframe. */ + if (mpeg2dec->discont_state != MPEG2DEC_DISC_NONE) { + if (bidirect_frame && !closed_gop) { + GST_DEBUG_OBJECT (mpeg2dec, "dropping buffer, discont state %d", + mpeg2dec->discont_state); + ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + return ret; + } + } + + /* do cropping if the target region is smaller than the input one */ + if (mpeg2dec->downstream_pool) { + GstVideoFrame *vframe; + + if (gst_video_decoder_get_max_decode_time (GST_VIDEO_DECODER (mpeg2dec), + frame) < 0) { + GST_DEBUG_OBJECT (mpeg2dec, "dropping buffer crop, too late"); + return gst_video_decoder_drop_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + } + + GST_DEBUG_OBJECT (mpeg2dec, "Doing a crop copy of the decoded buffer"); + + vframe = gst_mpeg2dec_get_buffer (mpeg2dec, frame->system_frame_number); + g_assert (vframe != NULL); + ret = gst_mpeg2dec_crop_buffer (mpeg2dec, frame, vframe); + + if (ret != GST_FLOW_OK) { + gst_video_decoder_drop_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + return ret; + } + } + + ret = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (mpeg2dec), frame); + + return ret; + +no_frame: + { + GST_DEBUG ("display buffer does not have a valid frame"); + return GST_FLOW_OK; + } +} + +static GstFlowReturn +gst_mpeg2dec_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder); + GstBuffer *buf = frame->input_buffer; + GstMapInfo minfo; + const mpeg2_info_t *info; + mpeg2_state_t state; + gboolean done = FALSE; + GstFlowReturn ret = GST_FLOW_OK; + + GST_LOG_OBJECT (mpeg2dec, "received frame %d, timestamp %" + GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, + frame->system_frame_number, + GST_TIME_ARGS (frame->pts), GST_TIME_ARGS (frame->duration)); + + gst_buffer_ref (buf); + if (!gst_buffer_map (buf, &minfo, GST_MAP_READ)) { + GST_ERROR_OBJECT (mpeg2dec, "Failed to map input buffer"); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + + info = mpeg2dec->info; + + GST_LOG_OBJECT (mpeg2dec, "calling mpeg2_buffer"); + mpeg2_buffer (mpeg2dec->decoder, minfo.data, minfo.data + minfo.size); + GST_LOG_OBJECT (mpeg2dec, "calling mpeg2_buffer done"); + + while (!done) { + GST_LOG_OBJECT (mpeg2dec, "calling parse"); + state = mpeg2_parse (mpeg2dec->decoder); + GST_DEBUG_OBJECT (mpeg2dec, "parse state %d", state); + + switch (state) { + case STATE_SEQUENCE_MODIFIED: + GST_DEBUG_OBJECT (mpeg2dec, "sequence modified"); + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + gst_mpeg2dec_clear_buffers (mpeg2dec); + /* fall through */ + case STATE_SEQUENCE: + ret = handle_sequence (mpeg2dec, info); + /* if there is an error handling the sequence + * reset the decoder, maybe something more elegant + * could be done. + */ + if (ret == GST_FLOW_ERROR) { + GST_VIDEO_DECODER_ERROR (decoder, 1, STREAM, DECODE, + ("decoding error"), ("Bad sequence header"), ret); + gst_video_decoder_drop_frame (decoder, frame); + gst_mpeg2dec_flush (decoder); + goto done; + } + break; + case STATE_SEQUENCE_REPEATED: + GST_DEBUG_OBJECT (mpeg2dec, "sequence repeated"); + break; + case STATE_GOP: + GST_DEBUG_OBJECT (mpeg2dec, "gop"); + break; + case STATE_PICTURE: + ret = handle_picture (mpeg2dec, info, frame); + break; + case STATE_SLICE_1ST: + GST_LOG_OBJECT (mpeg2dec, "1st slice of frame encountered"); + break; + case STATE_PICTURE_2ND: + GST_LOG_OBJECT (mpeg2dec, + "Second picture header encountered. Decoding 2nd field"); + break; + case STATE_INVALID_END: + GST_DEBUG_OBJECT (mpeg2dec, "invalid end"); + case STATE_END: + GST_DEBUG_OBJECT (mpeg2dec, "end"); + case STATE_SLICE: + GST_DEBUG_OBJECT (mpeg2dec, "display_fbuf:%p, discard_fbuf:%p", + info->display_fbuf, info->discard_fbuf); + if (info->display_fbuf && info->display_fbuf->id) { + ret = handle_slice (mpeg2dec, info); + } else { + GST_DEBUG_OBJECT (mpeg2dec, "no picture to display"); + } + if (info->discard_fbuf && info->discard_fbuf->id) + gst_mpeg2dec_discard_buffer (mpeg2dec, + GPOINTER_TO_INT (info->discard_fbuf->id) - 1); + if (state != STATE_SLICE) { + gst_mpeg2dec_clear_buffers (mpeg2dec); + } + break; + case STATE_BUFFER: + done = TRUE; + break; + /* error */ + case STATE_INVALID: + GST_VIDEO_DECODER_ERROR (decoder, 1, STREAM, DECODE, + ("decoding error"), ("Reached libmpeg2 invalid state"), ret); + continue; + default: + GST_ERROR_OBJECT (mpeg2dec, "Unknown libmpeg2 state %d, FIXME", state); + ret = GST_FLOW_OK; + gst_video_codec_frame_unref (frame); + goto done; + } + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (mpeg2dec, "exit loop, reason %s", + gst_flow_get_name (ret)); + break; + } + } + + gst_video_codec_frame_unref (frame); + +done: + gst_buffer_unmap (buf, &minfo); + gst_buffer_unref (buf); + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (mpeg2dec, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + mpeg2dec, + "LibMpeg2 decoder", plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN); diff --git a/ext/mpeg2dec/gstmpeg2dec.h b/ext/mpeg2dec/gstmpeg2dec.h new file mode 100644 index 0000000000..3ae4b7b6bb --- /dev/null +++ b/ext/mpeg2dec/gstmpeg2dec.h @@ -0,0 +1,90 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_MPEG2DEC_H__ +#define __GST_MPEG2DEC_H__ + + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MPEG2DEC \ + (gst_mpeg2dec_get_type()) +#define GST_MPEG2DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MPEG2DEC,GstMpeg2dec)) +#define GST_MPEG2DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MPEG2DEC,GstMpeg2decClass)) +#define GST_IS_MPEG2DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MPEG2DEC)) +#define GST_IS_MPEG2DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MPEG2DEC)) + +#define MPEG_TIME_TO_GST_TIME(time) ((time) == -1 ? -1 : ((time) * (GST_MSECOND/10)) / G_GINT64_CONSTANT(9)) +#define GST_TIME_TO_MPEG_TIME(time) ((time) == -1 ? -1 : ((time) * G_GINT64_CONSTANT(9)) / (GST_MSECOND/10)) + +typedef struct _GstMpeg2dec GstMpeg2dec; +typedef struct _GstMpeg2decClass GstMpeg2decClass; + +typedef enum +{ + MPEG2DEC_DISC_NONE = 0, + MPEG2DEC_DISC_NEW_PICTURE, + MPEG2DEC_DISC_NEW_KEYFRAME +} DiscontState; + +struct _GstMpeg2dec { + GstVideoDecoder element; + + mpeg2dec_t *decoder; + const mpeg2_info_t *info; + + /* Buffer lifetime management */ + GList *buffers; + + /* FIXME This should not be necessary. It is used to prevent image + * corruption when the parser does not behave the way it should. + * See https://bugzilla.gnome.org/show_bug.cgi?id=674238 + */ + DiscontState discont_state; + + /* video state */ + GstVideoCodecState *input_state; + GstVideoInfo decoded_info; + GstVideoAlignment valign; + GstBufferPool * downstream_pool; + gboolean need_alignment; + + guint8 *dummybuf[4]; +}; + +struct _GstMpeg2decClass { + GstVideoDecoderClass parent_class; +}; + +GType gst_mpeg2dec_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (mpeg2dec); + +G_END_DECLS + +#endif /* __GST_MPEG2DEC_H__ */ diff --git a/ext/mpeg2dec/meson.build b/ext/mpeg2dec/meson.build new file mode 100644 index 0000000000..aa5262ac59 --- /dev/null +++ b/ext/mpeg2dec/meson.build @@ -0,0 +1,14 @@ +mpeg2_dep = dependency('libmpeg2', version : '>= 0.4.0', required : get_option('mpeg2dec')) + +if mpeg2_dep.found() + mpeg2dec = library('gstmpeg2dec', + ['gstmpeg2dec.c'], + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstvideo_dep, mpeg2_dep], + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(mpeg2dec, install_dir : plugins_pkgconfig_install_dir) + plugins += [mpeg2dec] +endif diff --git a/ext/sidplay/gstsiddec.cc b/ext/sidplay/gstsiddec.cc new file mode 100644 index 0000000000..1a7c91ea9c --- /dev/null +++ b/ext/sidplay/gstsiddec.cc @@ -0,0 +1,780 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * (C) <2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-siddec + * + * This element decodes .sid files to raw audio. .sid files are in fact + * small Commodore 64 programs that are executed on an emulated 6502 CPU and a + * MOS 6581 sound chip. + * + * This plugin will first load the complete program into memory before starting + * the emulator and producing output. + * + * Seeking is not (and cannot be) implemented. + * + * ## Example pipelines + * + * |[ + * gst-launch-1.0 -v filesrc location=Hawkeye.sid ! siddec ! audioconvert ! audioresample ! autoaudiosink + * ]| Decode a sid file and play it back. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstsiddec.h" + +#define DEFAULT_TUNE 0 +#define DEFAULT_CLOCK SIDTUNE_CLOCK_PAL +#define DEFAULT_MEMORY MPU_BANK_SWITCHING +#define DEFAULT_FILTER TRUE +#define DEFAULT_MEASURED_VOLUME TRUE +#define DEFAULT_MOS8580 FALSE +#define DEFAULT_FORCE_SPEED FALSE +#define DEFAULT_BLOCKSIZE 4096 + +enum +{ + PROP_0, + PROP_TUNE, + PROP_CLOCK, + PROP_MEMORY, + PROP_FILTER, + PROP_MEASURED_VOLUME, + PROP_MOS8580, + PROP_FORCE_SPEED, + PROP_BLOCKSIZE, + PROP_METADATA +}; + +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-sid") + ); + +#define FORMATS "{ " GST_AUDIO_NE(S16) "," GST_AUDIO_NE(U16) ", S8, U8 }" + +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " FORMATS ", " + "layout = (string) interleaved, " + "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); + +GST_DEBUG_CATEGORY_STATIC (gst_siddec_debug); +#define GST_CAT_DEFAULT gst_siddec_debug + +#define GST_TYPE_SID_CLOCK (gst_sid_clock_get_type()) +static GType +gst_sid_clock_get_type (void) +{ + static GType sid_clock_type = 0; + static const GEnumValue sid_clock[] = { + {SIDTUNE_CLOCK_PAL, "PAL", "pal"}, + {SIDTUNE_CLOCK_NTSC, "NTSC", "ntsc"}, + {0, NULL, NULL}, + }; + + if (!sid_clock_type) { + sid_clock_type = g_enum_register_static ("GstSidClock", sid_clock); + } + return sid_clock_type; +} + +#define GST_TYPE_SID_MEMORY (gst_sid_memory_get_type()) +static GType +gst_sid_memory_get_type (void) +{ + static GType sid_memory_type = 0; + static const GEnumValue sid_memory[] = { + {MPU_BANK_SWITCHING, "Bank Switching", "bank-switching"}, + {MPU_TRANSPARENT_ROM, "Transparent ROM", "transparent-rom"}, + {MPU_PLAYSID_ENVIRONMENT, "Playsid Environment", "playsid-environment"}, + {0, NULL, NULL}, + }; + + if (!sid_memory_type) { + sid_memory_type = g_enum_register_static ("GstSidMemory", sid_memory); + } + return sid_memory_type; +} + +static void gst_siddec_finalize (GObject * object); + +static GstFlowReturn gst_siddec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static gboolean gst_siddec_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); + +static gboolean gst_siddec_src_convert (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static gboolean gst_siddec_src_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_siddec_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); + +static void gst_siddec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_siddec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +#define gst_siddec_parent_class parent_class +G_DEFINE_TYPE (GstSidDec, gst_siddec, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (siddec, "siddec", GST_RANK_PRIMARY, + GST_TYPE_SIDDEC); + +static void +gst_siddec_class_init (GstSidDecClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_siddec_finalize; + gobject_class->set_property = gst_siddec_set_property; + gobject_class->get_property = gst_siddec_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TUNE, + g_param_spec_int ("tune", "tune", "tune", + 0, 100, DEFAULT_TUNE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CLOCK, + g_param_spec_enum ("clock", "clock", "clock", + GST_TYPE_SID_CLOCK, DEFAULT_CLOCK, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MEMORY, + g_param_spec_enum ("memory", "memory", "memory", GST_TYPE_SID_MEMORY, + DEFAULT_MEMORY, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILTER, + g_param_spec_boolean ("filter", "filter", "filter", DEFAULT_FILTER, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MEASURED_VOLUME, + g_param_spec_boolean ("measured-volume", "measured_volume", + "measured_volume", DEFAULT_MEASURED_VOLUME, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MOS8580, + g_param_spec_boolean ("mos8580", "mos8580", "mos8580", DEFAULT_MOS8580, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FORCE_SPEED, + g_param_spec_boolean ("force-speed", "force_speed", "force_speed", + DEFAULT_FORCE_SPEED, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BLOCKSIZE, + g_param_spec_uint ("blocksize", "Block size", + "Size in bytes to output per buffer", 1, G_MAXUINT, + DEFAULT_BLOCKSIZE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_METADATA, + g_param_spec_boxed ("metadata", "Metadata", "Metadata", GST_TYPE_CAPS, + (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + + gst_element_class_set_static_metadata (gstelement_class, "Sid decoder", + "Codec/Decoder/Audio", "Use libsidplay to decode SID audio tunes", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (gstelement_class, &src_templ); + gst_element_class_add_static_pad_template (gstelement_class, &sink_templ); + + GST_DEBUG_CATEGORY_INIT (gst_siddec_debug, "siddec", 0, + "C64 sid song player"); + + gst_type_mark_as_plugin_api (GST_TYPE_SID_CLOCK, static_cast(0)); + gst_type_mark_as_plugin_api (GST_TYPE_SID_MEMORY, static_cast(0)); +} + +static void +gst_siddec_init (GstSidDec * siddec) +{ + siddec->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); + gst_pad_set_event_function (siddec->sinkpad, gst_siddec_sink_event); + gst_pad_set_chain_function (siddec->sinkpad, gst_siddec_chain); + gst_element_add_pad (GST_ELEMENT (siddec), siddec->sinkpad); + + siddec->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); + gst_pad_set_event_function (siddec->srcpad, gst_siddec_src_event); + gst_pad_set_query_function (siddec->srcpad, gst_siddec_src_query); + gst_pad_use_fixed_caps (siddec->srcpad); + gst_element_add_pad (GST_ELEMENT (siddec), siddec->srcpad); + + siddec->engine = new emuEngine (); + siddec->tune = new sidTune (0); + siddec->config = (emuConfig *) g_malloc (sizeof (emuConfig)); + + /* get default config parameters */ + siddec->engine->getConfig (*siddec->config); + + siddec->config->mos8580 = DEFAULT_MOS8580; // mos8580 + siddec->config->memoryMode = DEFAULT_MEMORY; // memory mode + siddec->config->clockSpeed = DEFAULT_CLOCK; // clock speed + siddec->config->forceSongSpeed = DEFAULT_FORCE_SPEED; // force song speed + + siddec->engine->setConfig (*siddec->config); + + siddec->tune_buffer = (guchar *) g_malloc (maxSidtuneFileLen); + siddec->tune_len = 0; + siddec->tune_number = 0; + siddec->total_bytes = 0; + siddec->blocksize = DEFAULT_BLOCKSIZE; + + siddec->have_group_id = FALSE; + siddec->group_id = G_MAXUINT; +} + +static void +gst_siddec_finalize (GObject * object) +{ + GstSidDec *siddec = GST_SIDDEC (object); + + g_free (siddec->config); + g_free (siddec->tune_buffer); + + delete (siddec->tune); + delete (siddec->engine); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +update_tags (GstSidDec * siddec) +{ + sidTuneInfo info; + GstTagList *list; + + if (siddec->tune->getInfo (info)) { + list = gst_tag_list_new_empty (); + + if (info.nameString) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_TITLE, info.nameString, (void *) NULL); + } + if (info.authorString) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_ARTIST, info.authorString, (void *) NULL); + } + if (info.copyrightString) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_COPYRIGHT, info.copyrightString, (void *) NULL); + } + gst_pad_push_event (siddec->srcpad, gst_event_new_tag (list)); + } +} + +static gboolean +siddec_negotiate (GstSidDec * siddec) +{ + GstCaps *allowed; + GstStructure *structure; + int rate = 44100; + int channels = 1; + GstCaps *caps; + const gchar *str; + GstAudioFormat format; + GstEvent *event; + gchar *stream_id; + + allowed = gst_pad_get_allowed_caps (siddec->srcpad); + if (!allowed) + goto nothing_allowed; + + GST_DEBUG_OBJECT (siddec, "allowed caps: %" GST_PTR_FORMAT, allowed); + + allowed = gst_caps_normalize (allowed); + + structure = gst_caps_get_structure (allowed, 0); + + str = gst_structure_get_string (structure, "format"); + if (str == NULL) + goto invalid_format; + + format = gst_audio_format_from_string (str); + switch (format) { + case GST_AUDIO_FORMAT_S8: + siddec->config->bitsPerSample = 8; + siddec->config->sampleFormat = SIDEMU_SIGNED_PCM; + break; + case GST_AUDIO_FORMAT_U8: + siddec->config->bitsPerSample = 8; + siddec->config->sampleFormat = SIDEMU_UNSIGNED_PCM; + break; + case GST_AUDIO_FORMAT_S16: + siddec->config->bitsPerSample = 16; + siddec->config->sampleFormat = SIDEMU_SIGNED_PCM; + break; + case GST_AUDIO_FORMAT_U16: + siddec->config->bitsPerSample = 16; + siddec->config->sampleFormat = SIDEMU_UNSIGNED_PCM; + break; + default: + goto invalid_format; + } + + gst_structure_get_int (structure, "rate", &rate); + siddec->config->frequency = rate; + gst_structure_get_int (structure, "channels", &channels); + siddec->config->channels = channels; + + stream_id = + gst_pad_create_stream_id (siddec->srcpad, GST_ELEMENT_CAST (siddec), + NULL); + + event = gst_pad_get_sticky_event (siddec->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &siddec->group_id)) + siddec->have_group_id = TRUE; + else + siddec->have_group_id = FALSE; + gst_event_unref (event); + } else if (!siddec->have_group_id) { + siddec->have_group_id = TRUE; + siddec->group_id = gst_util_group_id_next (); + } + + event = gst_event_new_stream_start (stream_id); + if (siddec->have_group_id) + gst_event_set_group_id (event, siddec->group_id); + + gst_pad_push_event (siddec->srcpad, event); + g_free (stream_id); + + caps = gst_caps_new_simple ("audio/x-raw", + "format", G_TYPE_STRING, gst_audio_format_to_string (format), + "layout", G_TYPE_STRING, "interleaved", + "rate", G_TYPE_INT, siddec->config->frequency, + "channels", G_TYPE_INT, siddec->config->channels, NULL); + gst_pad_set_caps (siddec->srcpad, caps); + gst_caps_unref (caps); + + gst_caps_unref (allowed); + + siddec->engine->setConfig (*siddec->config); + + return TRUE; + + /* ERRORS */ +nothing_allowed: + { + GST_DEBUG_OBJECT (siddec, "could not get allowed caps"); + return FALSE; + } +invalid_format: + { + GST_DEBUG_OBJECT (siddec, "invalid audio caps"); + gst_caps_unref (allowed); + return FALSE; + } +} + +static void +play_loop (GstPad * pad) +{ + GstFlowReturn ret; + GstSidDec *siddec; + GstBuffer *out; + GstMapInfo outmap; + gint64 value, offset, time = 0; + GstFormat format; + + siddec = GST_SIDDEC (gst_pad_get_parent (pad)); + + out = gst_buffer_new_and_alloc (siddec->blocksize); + + gst_buffer_map (out, &outmap, GST_MAP_WRITE); + sidEmuFillBuffer (*siddec->engine, *siddec->tune, + outmap.data, siddec->blocksize); + gst_buffer_unmap (out, &outmap); + + /* get offset in samples */ + format = GST_FORMAT_DEFAULT; + if (gst_siddec_src_convert (siddec->srcpad, + GST_FORMAT_BYTES, siddec->total_bytes, &format, &offset)) + GST_BUFFER_OFFSET (out) = offset; + + /* get current timestamp */ + format = GST_FORMAT_TIME; + if (gst_siddec_src_convert (siddec->srcpad, + GST_FORMAT_BYTES, siddec->total_bytes, &format, &time)) + GST_BUFFER_TIMESTAMP (out) = time; + + /* update position and get new timestamp to calculate duration */ + siddec->total_bytes += siddec->blocksize; + + /* get offset in samples */ + format = GST_FORMAT_DEFAULT; + if (gst_siddec_src_convert (siddec->srcpad, + GST_FORMAT_BYTES, siddec->total_bytes, &format, &value)) + GST_BUFFER_OFFSET_END (out) = value; + + format = GST_FORMAT_TIME; + if (gst_siddec_src_convert (siddec->srcpad, + GST_FORMAT_BYTES, siddec->total_bytes, &format, &value)) + GST_BUFFER_DURATION (out) = value - time; + + if ((ret = gst_pad_push (siddec->srcpad, out)) != GST_FLOW_OK) + goto pause; + +done: + gst_object_unref (siddec); + + return; + + /* ERRORS */ +pause: + { + if (ret == GST_FLOW_EOS) { + /* perform EOS logic, FIXME, segment seek? */ + gst_pad_push_event (pad, gst_event_new_eos ()); + } else if (ret < GST_FLOW_EOS || ret == GST_FLOW_NOT_LINKED) { + /* for fatal errors we post an error message */ + GST_ELEMENT_FLOW_ERROR (siddec, ret); + gst_pad_push_event (pad, gst_event_new_eos ()); + } + + GST_INFO_OBJECT (siddec, "pausing task, reason: %s", + gst_flow_get_name (ret)); + gst_pad_pause_task (pad); + goto done; + } +} + +static gboolean +start_play_tune (GstSidDec * siddec) +{ + gboolean res; + GstSegment segment; + + if (!siddec->tune->load (siddec->tune_buffer, siddec->tune_len)) + goto could_not_load; + + update_tags (siddec); + + if (!siddec_negotiate (siddec)) + goto could_not_negotiate; + + if (!sidEmuInitializeSong (*siddec->engine, *siddec->tune, + siddec->tune_number)) + goto could_not_init; + + gst_segment_init (&segment, GST_FORMAT_TIME); + gst_pad_push_event (siddec->srcpad, gst_event_new_segment (&segment)); + siddec->total_bytes = 0; + siddec->have_group_id = FALSE; + siddec->group_id = G_MAXUINT; + + res = gst_pad_start_task (siddec->srcpad, + (GstTaskFunction) play_loop, siddec->srcpad, NULL); + return res; + + /* ERRORS */ +could_not_load: + { + GST_ELEMENT_ERROR (siddec, LIBRARY, INIT, + ("Could not load tune"), ("Could not load tune")); + return FALSE; + } +could_not_negotiate: + { + GST_ELEMENT_ERROR (siddec, CORE, NEGOTIATION, + ("Could not negotiate format"), ("Could not negotiate format")); + return FALSE; + } +could_not_init: + { + GST_ELEMENT_ERROR (siddec, LIBRARY, INIT, + ("Could not initialize song"), ("Could not initialize song")); + return FALSE; + } +} + +static gboolean +gst_siddec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstSidDec *siddec; + gboolean res; + + siddec = GST_SIDDEC (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + res = start_play_tune (siddec); + break; + case GST_EVENT_SEGMENT: + res = TRUE; + break; + default: + res = TRUE; + break; + } + gst_event_unref (event); + + return res; +} + +static GstFlowReturn +gst_siddec_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) +{ + GstSidDec *siddec; + guint64 size; + + siddec = GST_SIDDEC (parent); + + size = gst_buffer_get_size (buffer); + if (siddec->tune_len + size > maxSidtuneFileLen) + goto overflow; + + gst_buffer_extract (buffer, 0, siddec->tune_buffer + siddec->tune_len, size); + + siddec->tune_len += size; + + gst_buffer_unref (buffer); + + return GST_FLOW_OK; + + /* ERRORS */ +overflow: + { + GST_ELEMENT_ERROR (siddec, STREAM, DECODE, + (NULL), ("Input data bigger than allowed buffer size")); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_siddec_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) +{ + gboolean res = TRUE; + guint scale = 1; + GstSidDec *siddec; + gint bytes_per_sample; + + siddec = GST_SIDDEC (gst_pad_get_parent (pad)); + + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + + bytes_per_sample = + (siddec->config->bitsPerSample >> 3) * siddec->config->channels; + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + if (bytes_per_sample == 0) + return FALSE; + *dest_value = src_value / bytes_per_sample; + break; + case GST_FORMAT_TIME: + { + gint byterate = bytes_per_sample * siddec->config->frequency; + + if (byterate == 0) + return FALSE; + *dest_value = + gst_util_uint64_scale_int (src_value, GST_SECOND, byterate); + break; + } + default: + res = FALSE; + } + break; + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_BYTES: + *dest_value = src_value * bytes_per_sample; + break; + case GST_FORMAT_TIME: + if (siddec->config->frequency == 0) + return FALSE; + *dest_value = + gst_util_uint64_scale_int (src_value, GST_SECOND, + siddec->config->frequency); + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + scale = bytes_per_sample; + /* fallthrough */ + case GST_FORMAT_DEFAULT: + *dest_value = + gst_util_uint64_scale_int (src_value, + scale * siddec->config->frequency, GST_SECOND); + break; + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + + return res; +} + +static gboolean +gst_siddec_src_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + gboolean res = FALSE; + + switch (GST_EVENT_TYPE (event)) { + default: + break; + } + gst_event_unref (event); + + return res; +} + +static gboolean +gst_siddec_src_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + gboolean res = TRUE; + GstSidDec *siddec; + + siddec = GST_SIDDEC (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + gint64 current; + + gst_query_parse_position (query, &format, NULL); + + /* we only know about our bytes, convert to requested format */ + res &= gst_siddec_src_convert (pad, + GST_FORMAT_BYTES, siddec->total_bytes, &format, ¤t); + if (res) { + gst_query_set_position (query, format, current); + } + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + +static void +gst_siddec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstSidDec *siddec = GST_SIDDEC (object); + + switch (prop_id) { + case PROP_TUNE: + siddec->tune_number = g_value_get_int (value); + break; + case PROP_CLOCK: + siddec->config->clockSpeed = g_value_get_enum (value); + break; + case PROP_MEMORY: + siddec->config->memoryMode = g_value_get_enum (value); + break; + case PROP_FILTER: + siddec->config->emulateFilter = g_value_get_boolean (value); + break; + case PROP_MEASURED_VOLUME: + siddec->config->measuredVolume = g_value_get_boolean (value); + break; + case PROP_MOS8580: + siddec->config->mos8580 = g_value_get_boolean (value); + break; + case PROP_BLOCKSIZE: + siddec->blocksize = g_value_get_uint (value); + break; + case PROP_FORCE_SPEED: + siddec->config->forceSongSpeed = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + return; + } + siddec->engine->setConfig (*siddec->config); +} + +static void +gst_siddec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstSidDec *siddec = GST_SIDDEC (object); + + switch (prop_id) { + case PROP_TUNE: + g_value_set_int (value, siddec->tune_number); + break; + case PROP_CLOCK: + g_value_set_enum (value, siddec->config->clockSpeed); + break; + case PROP_MEMORY: + g_value_set_enum (value, siddec->config->memoryMode); + break; + case PROP_FILTER: + g_value_set_boolean (value, siddec->config->emulateFilter); + break; + case PROP_MEASURED_VOLUME: + g_value_set_boolean (value, siddec->config->measuredVolume); + break; + case PROP_MOS8580: + g_value_set_boolean (value, siddec->config->mos8580); + break; + case PROP_FORCE_SPEED: + g_value_set_boolean (value, siddec->config->forceSongSpeed); + break; + case PROP_BLOCKSIZE: + g_value_set_uint (value, siddec->blocksize); + break; + case PROP_METADATA: + g_value_set_boxed (value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (siddec, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + sid, + "Uses libsidplay to decode .sid files", + plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/sidplay/gstsiddec.h b/ext/sidplay/gstsiddec.h new file mode 100644 index 0000000000..15fa88e0dd --- /dev/null +++ b/ext/sidplay/gstsiddec.h @@ -0,0 +1,76 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_SIDDEC_H__ +#define __GST_SIDDEC_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SIDDEC \ + (gst_siddec_get_type()) +#define GST_SIDDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SIDDEC,GstSidDec)) +#define GST_SIDDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SIDDEC,GstSidDecClass)) +#define GST_IS_SIDDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SIDDEC)) +#define GST_IS_SIDDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SIDDEC)) + +typedef struct _GstSidDec GstSidDec; +typedef struct _GstSidDecClass GstSidDecClass; + +struct _GstSidDec { + GstElement element; + + /* pads */ + GstPad *sinkpad, + *srcpad; + + gboolean have_group_id; + guint group_id; + + guchar *tune_buffer; + gint tune_len; + gint tune_number; + guint64 total_bytes; + + emuEngine *engine; + sidTune *tune; + emuConfig *config; + + guint blocksize; +}; + +struct _GstSidDecClass { + GstElementClass parent_class; +}; + +GType gst_siddec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (siddec); + +G_END_DECLS + +#endif /* __GST_SIDDEC_H__ */ diff --git a/ext/sidplay/meson.build b/ext/sidplay/meson.build new file mode 100644 index 0000000000..6310652f36 --- /dev/null +++ b/ext/sidplay/meson.build @@ -0,0 +1,38 @@ +sidplay_option = get_option('sidplay') +if sidplay_option.disabled() + subdir_done() +endif + +if not add_languages('cpp', native: false, required: sidplay_option) + subdir_done() +endif + +if not cxx.has_header('sidplay/player.h', required: sidplay_option) + subdir_done() +endif + +sidplay_dep = cxx.find_library('sidplay', required: sidplay_option) +if not sidplay_dep.found() + subdir_done() +endif + +# sidplay plugin works with libsidplay 1.36.x (not 2.x.x) +sid_code = '''#include + void somefunc (void) { + sidTune tune = sidTune(0); + }''' +if not cxx.compiles(sid_code, dependencies: sidplay_dep, name : 'sidplay usage') + if sidplay_option.enabled() + error('sidplay headers and libraries were found, but were not usable') + endif + subdir_done() +endif + +gstsid = library('gstsid', 'gstsiddec.cc', + cpp_args : ugly_args, + include_directories : [configinc], + dependencies : [gstaudio_dep, sidplay_dep], + install : true, + install_dir : plugins_install_dir) +pkgconfig.generate(gstsid, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstsid] diff --git a/ext/x264/GstX264Enc.prs b/ext/x264/GstX264Enc.prs new file mode 100644 index 0000000000..4ad3c82888 --- /dev/null +++ b/ext/x264/GstX264Enc.prs @@ -0,0 +1,54 @@ +[_presets_] +version=0.10 +element-name=GstX264Enc + +[Profile Baseline] +_meta/comment=Baseline Profile +bframes=0 +cabac=false +dct8x8=false + +[Profile Main] +_meta/comment=Main Profile +cabac=true +dct8x8=false + +[Profile High] +_meta/comment=High Profile +cabac=true +dct8x8=true + +[Quality Low] +_meta/comment=Low quality +pass=qual +quantizer=27 +subme=4 +threads=0 + +[Quality Normal] +_meta/comment=Normal quality +pass=qual +quantizer=21 +me=umh +subme=6 +ref=3 +threads=0 + +[Quality High] +_meta/comment=High quality +pass=qual +quantizer=18 +me=umh +subme=6 +ref=3 +threads=0 + +[Profile YouTube] +_meta/comment=YouTube recommended settings (https://support.google.com/youtube/answer/1722171) +pass=qual +cabac=true +dct8x8=true +bframes=2 + +[Zero Latency] +tune=zerolatency diff --git a/ext/x264/gstencoderbitrateprofilemanager.c b/ext/x264/gstencoderbitrateprofilemanager.c new file mode 100644 index 0000000000..ed2371e12d --- /dev/null +++ b/ext/x264/gstencoderbitrateprofilemanager.c @@ -0,0 +1,224 @@ +/* GStreamer + * Copyright (C) 2019 Thibault Saunier + * + * gstencoderbitrateprofilemanager.c + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstencoderbitrateprofilemanager.h" + +GST_DEBUG_CATEGORY_STATIC (encoderbitratemanager_debug); +#define GST_CAT_DEFAULT encoderbitratemanager_debug + +typedef struct +{ + gchar *name; + gsize n_vals; + GstEncoderBitrateTargetForPixelsMap *map; +} GstEncoderBitrateProfile; + +struct _GstEncoderBitrateProfileManager +{ + GList *profiles; + gchar *preset; + guint bitrate; + + gboolean setting_preset; + gboolean user_bitrate; +}; + +/* *INDENT-OFF* */ +/* Copied from https://support.google.com/youtube/answer/1722171?hl=en */ +static const GstEncoderBitrateTargetForPixelsMap youtube_bitrate_profiles[] = { + { + .n_pixels = 3840 * 2160, + .low_framerate_bitrate = 40000, + .high_framerate_bitrate = 60000, + }, + { + .n_pixels = 2560 * 1440, + .low_framerate_bitrate = 16000, + .high_framerate_bitrate = 24000, + }, + { + .n_pixels = 1920 * 1080, + .low_framerate_bitrate = 8000, + .high_framerate_bitrate = 12000, + }, + { + .n_pixels = 1080 * 720, + .low_framerate_bitrate = 5000, + .high_framerate_bitrate = 7500, + }, + { + .n_pixels = 640 * 480, + .low_framerate_bitrate = 2500, + .high_framerate_bitrate = 4000, + }, + { + .n_pixels = 0, + .low_framerate_bitrate = 2500, + .high_framerate_bitrate = 4000, + }, + { + .n_pixels = 0, + .low_framerate_bitrate = 0, + .high_framerate_bitrate = 0, + }, +}; +/* *INDENT-ON* */ + +static void +gst_encoder_bitrate_profile_free (GstEncoderBitrateProfile * profile) +{ + g_free (profile->name); + g_free (profile->map); + g_free (profile); +} + +void +gst_encoder_bitrate_profile_manager_add_profile (GstEncoderBitrateProfileManager + * self, const gchar * profile_name, + const GstEncoderBitrateTargetForPixelsMap * map) +{ + guint n_vals; + GstEncoderBitrateProfile *profile; + + for (n_vals = 0; + map[n_vals].low_framerate_bitrate != 0 + && map[n_vals].high_framerate_bitrate != 0; n_vals++); + n_vals++; + + profile = g_new0 (GstEncoderBitrateProfile, 1); + profile->name = g_strdup (profile_name); + profile->n_vals = n_vals; + profile->map + = g_memdup2 (map, sizeof (GstEncoderBitrateTargetForPixelsMap) * n_vals); + self->profiles = g_list_prepend (self->profiles, profile); +} + +guint +gst_encoder_bitrate_profile_manager_get_bitrate (GstEncoderBitrateProfileManager + * self, GstVideoInfo * info) +{ + gint i; + gboolean high_fps; + guint num_pix; + GList *tmp; + + GstEncoderBitrateProfile *profile = NULL; + + g_return_val_if_fail (self != NULL, -1); + + if (!info || info->finfo == NULL + || info->finfo->format == GST_VIDEO_FORMAT_UNKNOWN) { + GST_INFO ("Video info %p not usable, returning current bitrate", info); + return self->bitrate; + } + + if (!self->preset) { + GST_INFO ("No preset used, returning current bitrate"); + return self->bitrate; + + } + + for (tmp = self->profiles; tmp; tmp = tmp->next) { + GstEncoderBitrateProfile *tmpprof = tmp->data; + if (!g_strcmp0 (tmpprof->name, self->preset)) { + profile = tmpprof; + break; + } + } + + if (!profile) { + GST_INFO ("Could not find map for profile: %s", self->preset); + + return self->bitrate; + } + + high_fps = GST_VIDEO_INFO_FPS_N (info) / GST_VIDEO_INFO_FPS_D (info) > 30.0; + num_pix = GST_VIDEO_INFO_WIDTH (info) * GST_VIDEO_INFO_HEIGHT (info); + for (i = 0; i < profile->n_vals; i++) { + GstEncoderBitrateTargetForPixelsMap *bitrate_values = &profile->map[i]; + + if (num_pix < bitrate_values->n_pixels) + continue; + + self->bitrate = + high_fps ? bitrate_values-> + high_framerate_bitrate : bitrate_values->low_framerate_bitrate; + GST_INFO ("Using %s bitrate! %d", self->preset, self->bitrate); + return self->bitrate; + } + + return -1; +} + +void gst_encoder_bitrate_profile_manager_start_loading_preset + (GstEncoderBitrateProfileManager * self) +{ + self->setting_preset = TRUE; +} + +void gst_encoder_bitrate_profile_manager_end_loading_preset + (GstEncoderBitrateProfileManager * self, const gchar * preset) +{ + self->setting_preset = FALSE; + g_free (self->preset); + self->preset = g_strdup (preset); +} + +void +gst_encoder_bitrate_profile_manager_set_bitrate (GstEncoderBitrateProfileManager + * self, guint bitrate) +{ + self->bitrate = bitrate; + self->user_bitrate = !self->setting_preset; +} + +void +gst_encoder_bitrate_profile_manager_free (GstEncoderBitrateProfileManager * + self) +{ + g_free (self->preset); + g_list_free_full (self->profiles, + (GDestroyNotify) gst_encoder_bitrate_profile_free); + g_free (self); +} + +GstEncoderBitrateProfileManager * +gst_encoder_bitrate_profile_manager_new (guint default_bitrate) +{ + GstEncoderBitrateProfileManager *self = + g_new0 (GstEncoderBitrateProfileManager, 1); + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "encoderbitratemanager", 0, + "Encoder bitrate manager"); + g_once_init_leave (&_init, 1); + } + + self->bitrate = default_bitrate; + gst_encoder_bitrate_profile_manager_add_profile (self, + "Profile YouTube", youtube_bitrate_profiles); + + return self; +} diff --git a/ext/x264/gstencoderbitrateprofilemanager.h b/ext/x264/gstencoderbitrateprofilemanager.h new file mode 100644 index 0000000000..d6db733b1f --- /dev/null +++ b/ext/x264/gstencoderbitrateprofilemanager.h @@ -0,0 +1,46 @@ +/* GStreamer + * Copyright (C) 2019 Thibault Saunier + * + * gstencoderbitrateprofilemanager.h + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include + +typedef struct _GstEncoderBitrateProfileManager GstEncoderBitrateProfileManager; + +typedef struct _GstEncoderBitrateTargetForPixelsMap +{ + guint n_pixels; + guint low_framerate_bitrate; + guint high_framerate_bitrate; + + gpointer _gst_reserved[GST_PADDING_LARGE]; +} GstEncoderBitrateTargetForPixelsMap; + +void +gst_encoder_bitrate_profile_manager_add_profile(GstEncoderBitrateProfileManager* self, + const gchar* profile_name, const GstEncoderBitrateTargetForPixelsMap* map); +guint gst_encoder_bitrate_profile_manager_get_bitrate(GstEncoderBitrateProfileManager* self, GstVideoInfo* info); +void gst_encoder_bitrate_profile_manager_start_loading_preset (GstEncoderBitrateProfileManager* self); +void gst_encoder_bitrate_profile_manager_end_loading_preset(GstEncoderBitrateProfileManager* self, const gchar* preset); +void gst_encoder_bitrate_profile_manager_set_bitrate(GstEncoderBitrateProfileManager* self, guint bitrate); +GstEncoderBitrateProfileManager* gst_encoder_bitrate_profile_manager_new(guint default_bitrate); +void gst_encoder_bitrate_profile_manager_free(GstEncoderBitrateProfileManager* self); \ No newline at end of file diff --git a/ext/x264/gstx264enc.c b/ext/x264/gstx264enc.c new file mode 100644 index 0000000000..2604506f17 --- /dev/null +++ b/ext/x264/gstx264enc.c @@ -0,0 +1,3057 @@ +/* GStreamer H264 encoder plugin + * Copyright (C) 2005 Michal Benes + * Copyright (C) 2005 Josef Zlomek + * Copyright (C) 2008 Mark Nauwelaerts + * Copyright (C) 2016 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-x264enc + * @title: x264enc + * @see_also: faac + * + * This element encodes raw video into H264 compressed data, + * also otherwise known as MPEG-4 AVC (Advanced Video Codec). + * + * The #GstX264Enc:pass property controls the type of encoding. In case of Constant + * Bitrate Encoding (actually ABR), the #GstX264Enc:bitrate will determine the quality + * of the encoding. This will similarly be the case if this target bitrate + * is to obtained in multiple (2 or 3) pass encoding. + * Alternatively, one may choose to perform Constant Quantizer or Quality encoding, + * in which case the #GstX264Enc:quantizer property controls much of the outcome, in that case #GstX264Enc:bitrate is the maximum bitrate. + * + * The H264 profile that is eventually used depends on a few settings. + * If #GstX264Enc:dct8x8 is enabled, then High profile is used. + * Otherwise, if #GstX264Enc:cabac entropy coding is enabled or #GstX264Enc:bframes + * are allowed, then Main Profile is in effect, and otherwise Baseline profile + * applies. The high profile is imposed by default, + * which is fine for most software players and settings, + * but in some cases (e.g. hardware platforms) a more restricted profile/level + * may be necessary. The recommended way to set a profile is to set it in the + * downstream caps. + * + * If a preset/tuning are specified then these will define the default values and + * the property defaults will be ignored. After this the option-string property is + * applied, followed by the user-set properties, fast first pass restrictions and + * finally the profile restrictions. + * + * > Some settings, including the default settings, may lead to quite + * > some latency (i.e. frame buffering) in the encoder. This may cause problems + * > with pipeline stalling in non-trivial pipelines, because the encoder latency + * > is often considerably higher than the default size of a simple queue + * > element. Such problems are caused by one of the queues in the other + * > non-x264enc streams/branches filling up and blocking upstream. They can + * > be fixed by relaxing the default time/size/buffer limits on the queue + * > elements in the non-x264 branches, or using a (single) multiqueue element + * > for all branches. Also see the last example below. You can also work around + * > this problem by setting the tune=zerolatency property, but this will affect + * > overall encoding quality so may not be appropriate for your use case. + * + * ## Example pipeline + * |[ + * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc qp-min=18 ! \ + * avimux ! filesink location=videotestsrc.avi + * ]| This example pipeline will encode a test video source to H264 muxed in an + * AVI container, while ensuring a sane minimum quantization factor to avoid + * some (excessive) waste. You should ideally never put H264 into an AVI + * container (or really anything else, for that matter) - use Matroska or + * MP4/QuickTime or MPEG-TS instead. + * |[ + * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc pass=quant ! \ + * matroskamux ! filesink location=videotestsrc.mkv + * ]| This example pipeline will encode a test video source to H264 using fixed + * quantization, and muxes it in a Matroska container. + * |[ + * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc pass=5 quantizer=25 speed-preset=6 ! video/x-h264, profile=baseline ! \ + * qtmux ! filesink location=videotestsrc.mov + * ]| This example pipeline will encode a test video source to H264 using + * constant quality at around Q25 using the 'medium' speed/quality preset and + * restricting the options used so that the output is H.264 Baseline Profile + * compliant and finally multiplexing the output in Quicktime mov format. + * |[ + * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! tee name=t ! queue ! videoconvert ! autovideosink \ + * t. ! queue ! x264enc rc-lookahead=5 ! fakesink + * ]| This example pipeline will encode a test video source to H264 while + * displaying the input material at the same time. As mentioned above, + * specific settings are needed in this case to avoid pipeline stalling. + * Depending on goals and context, other approaches are possible, e.g. + * tune=zerolatency might be configured, or queue sizes increased. + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstx264enc.h" + +#include +#include +#include +#include + +#include +#include +#include + +GST_DEBUG_CATEGORY_STATIC (x264_enc_debug); +#define GST_CAT_DEFAULT x264_enc_debug + +struct _GstX264EncVTable +{ + GModule *module; + +#if X264_BUILD < 153 + const int *x264_bit_depth; +#endif + const int *x264_chroma_format; + void (*x264_encoder_close) (x264_t *); + int (*x264_encoder_delayed_frames) (x264_t *); + int (*x264_encoder_encode) (x264_t *, x264_nal_t ** pp_nal, int *pi_nal, + x264_picture_t * pic_in, x264_picture_t * pic_out); + int (*x264_encoder_headers) (x264_t *, x264_nal_t ** pp_nal, int *pi_nal); + void (*x264_encoder_intra_refresh) (x264_t *); + int (*x264_encoder_maximum_delayed_frames) (x264_t *); + x264_t *(*x264_encoder_open) (x264_param_t *); + int (*x264_encoder_reconfig) (x264_t *, x264_param_t *); + const x264_level_t (*x264_levels)[]; + void (*x264_param_apply_fastfirstpass) (x264_param_t *); + int (*x264_param_apply_profile) (x264_param_t *, const char *); + int (*x264_param_default_preset) (x264_param_t *, const char *preset, + const char *tune); + int (*x264_param_parse) (x264_param_t *, const char *name, const char *value); +}; + +static GstX264EncVTable default_vtable; + +static GstX264EncVTable *vtable_8bit = NULL, *vtable_10bit = NULL; + +#if X264_BUILD < 153 +#define LOAD_SYMBOL(name) G_STMT_START { \ + if (!g_module_symbol (module, #name, (gpointer *) &vtable->name)) { \ + GST_ERROR ("Failed to load '" #name "' from '%s'", filename); \ + goto error; \ + } \ +} G_STMT_END; + +#ifdef HAVE_X264_ADDITIONAL_LIBRARIES +static GstX264EncVTable * +load_x264 (const gchar * filename) +{ + GModule *module; + GstX264EncVTable *vtable; + + module = g_module_open (filename, G_MODULE_BIND_LOCAL); + if (!module) { + GST_ERROR ("Failed to load '%s'", filename); + return NULL; + } + + vtable = g_new0 (GstX264EncVTable, 1); + vtable->module = module; + + if (!g_module_symbol (module, G_STRINGIFY (x264_encoder_open), + (gpointer *) & vtable->x264_encoder_open)) { + GST_ERROR ("Failed to load '" G_STRINGIFY (x264_encoder_open) + "' from '%s'. Incompatible version?", filename); + goto error; + } + LOAD_SYMBOL (x264_bit_depth); + LOAD_SYMBOL (x264_chroma_format); + LOAD_SYMBOL (x264_encoder_close); + LOAD_SYMBOL (x264_encoder_delayed_frames); + LOAD_SYMBOL (x264_encoder_encode); + LOAD_SYMBOL (x264_encoder_headers); + LOAD_SYMBOL (x264_encoder_intra_refresh); + LOAD_SYMBOL (x264_encoder_maximum_delayed_frames); + LOAD_SYMBOL (x264_encoder_reconfig); + LOAD_SYMBOL (x264_levels); + LOAD_SYMBOL (x264_param_apply_fastfirstpass); + LOAD_SYMBOL (x264_param_apply_profile); + LOAD_SYMBOL (x264_param_default_preset); + LOAD_SYMBOL (x264_param_parse); + + return vtable; + +error: + g_module_close (vtable->module); + g_free (vtable); + return NULL; +} + +static void +unload_x264 (GstX264EncVTable * vtable) +{ + if (vtable->module) { + g_module_close (vtable->module); + g_free (vtable); + } +} +#endif + +#undef LOAD_SYMBOL +#endif + +static gboolean +gst_x264_enc_add_x264_chroma_format (GstStructure * s, + gboolean allow_420_8, gboolean allow_420_10, gboolean allow_422, + gboolean allow_444) +{ + GValue fmts = G_VALUE_INIT; + GValue fmt = G_VALUE_INIT; + gboolean ret = FALSE; + + g_value_init (&fmts, GST_TYPE_LIST); + g_value_init (&fmt, G_TYPE_STRING); + + if (vtable_8bit) { + gint chroma_format = *vtable_8bit->x264_chroma_format; + + if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { + g_value_set_string (&fmt, "Y444"); + gst_value_list_append_value (&fmts, &fmt); + } + + if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { + g_value_set_string (&fmt, "Y42B"); + gst_value_list_append_value (&fmts, &fmt); + } + + if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_8) { + g_value_set_string (&fmt, "I420"); + gst_value_list_append_value (&fmts, &fmt); + g_value_set_string (&fmt, "YV12"); + gst_value_list_append_value (&fmts, &fmt); + g_value_set_string (&fmt, "NV12"); + gst_value_list_append_value (&fmts, &fmt); + } + } + + if (vtable_10bit) { + gint chroma_format = *vtable_10bit->x264_chroma_format; + + if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { + if (G_BYTE_ORDER == G_LITTLE_ENDIAN) + g_value_set_string (&fmt, "Y444_10LE"); + else + g_value_set_string (&fmt, "Y444_10BE"); + + gst_value_list_append_value (&fmts, &fmt); + } + + if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { + if (G_BYTE_ORDER == G_LITTLE_ENDIAN) + g_value_set_string (&fmt, "I422_10LE"); + else + g_value_set_string (&fmt, "I422_10BE"); + + gst_value_list_append_value (&fmts, &fmt); + } + + if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_10) { + if (G_BYTE_ORDER == G_LITTLE_ENDIAN) + g_value_set_string (&fmt, "I420_10LE"); + else + g_value_set_string (&fmt, "I420_10BE"); + + gst_value_list_append_value (&fmts, &fmt); + } + } + + if (gst_value_list_get_size (&fmts) != 0) { + gst_structure_take_value (s, "format", &fmts); + ret = TRUE; + } else { + g_value_unset (&fmts); + } + + g_value_unset (&fmt); + + return ret; +} + +#if X264_BUILD < 153 +static gboolean +load_x264_libraries (void) +{ + if (*default_vtable.x264_bit_depth == 8) { + vtable_8bit = &default_vtable; + GST_INFO ("8-bit depth supported"); + } else if (*default_vtable.x264_bit_depth == 10) { + vtable_10bit = &default_vtable; + GST_INFO ("10-bit depth supported"); + } +#ifdef HAVE_X264_ADDITIONAL_LIBRARIES + { + gchar **libraries = g_strsplit (HAVE_X264_ADDITIONAL_LIBRARIES, ":", -1); + gchar **p = libraries; + + while (*p && (!vtable_8bit || !vtable_10bit)) { + GstX264EncVTable *vtable = load_x264 (*p); + + if (vtable) { + if (!vtable_8bit && *vtable->x264_bit_depth == 8) { + GST_INFO ("8-bit depth support loaded from %s", *p); + vtable_8bit = vtable; + } else if (!vtable_10bit && *vtable->x264_bit_depth == 10) { + GST_INFO ("10-bit depth support loaded from %s", *p); + vtable_10bit = vtable; + } else { + unload_x264 (vtable); + } + } + + p++; + } + g_strfreev (libraries); + } +#endif + + if (!vtable_8bit && !vtable_10bit) + return FALSE; + + return TRUE; +} + +#else /* X264_BUILD >= 153 */ + +static gboolean +load_x264_libraries (void) +{ +#if X264_BIT_DEPTH == 0 /* all */ + GST_INFO ("8-bit depth and 10-bit depth supported"); + vtable_8bit = &default_vtable; + vtable_10bit = &default_vtable; +#elif X264_BIT_DEPTH == 8 + GST_INFO ("Only 8-bit depth supported"); + vtable_8bit = &default_vtable; +#elif X264_BIT_DEPTH == 10 + GST_INFO ("Only 10-bit depth supported"); + vtable_10bit = &default_vtable; +#else +#error "unexpected X264_BIT_DEPTH value" +#endif + +#ifdef HAVE_X264_ADDITIONAL_LIBRARIES + GST_WARNING ("Ignoring configured additional libraries %s, using libx264 " + "version enabled for multiple bit depths", + HAVE_X264_ADDITIONAL_LIBRARIES); +#endif + + return TRUE; +} + +#endif + +enum +{ + ARG_0, + ARG_THREADS, + ARG_SLICED_THREADS, + ARG_SYNC_LOOKAHEAD, + ARG_PASS, + ARG_QUANTIZER, + ARG_MULTIPASS_CACHE_FILE, + ARG_BYTE_STREAM, + ARG_BITRATE, + ARG_INTRA_REFRESH, + ARG_VBV_BUF_CAPACITY, + ARG_ME, + ARG_SUBME, + ARG_ANALYSE, + ARG_DCT8x8, + ARG_REF, + ARG_BFRAMES, + ARG_B_ADAPT, + ARG_B_PYRAMID, + ARG_WEIGHTB, + ARG_SPS_ID, + ARG_AU_NALU, + ARG_TRELLIS, + ARG_KEYINT_MAX, + ARG_CABAC, + ARG_QP_MIN, + ARG_QP_MAX, + ARG_QP_STEP, + ARG_IP_FACTOR, + ARG_PB_FACTOR, + ARG_RC_MB_TREE, + ARG_RC_LOOKAHEAD, + ARG_NR, + ARG_INTERLACED, + ARG_OPTION_STRING, + ARG_SPEED_PRESET, + ARG_PSY_TUNE, + ARG_TUNE, + ARG_FRAME_PACKING, + ARG_INSERT_VUI, +}; + +#define ARG_THREADS_DEFAULT 0 /* 0 means 'auto' which is 1.5x number of CPU cores */ +#define ARG_PASS_DEFAULT 0 +#define ARG_QUANTIZER_DEFAULT 21 +#define ARG_MULTIPASS_CACHE_FILE_DEFAULT "x264.log" +#define ARG_BYTE_STREAM_DEFAULT FALSE +#define ARG_BITRATE_DEFAULT (2 * 1024) +#define ARG_VBV_BUF_CAPACITY_DEFAULT 600 +#define ARG_ME_DEFAULT X264_ME_HEX +#define ARG_SUBME_DEFAULT 1 +#define ARG_ANALYSE_DEFAULT 0 +#define ARG_DCT8x8_DEFAULT FALSE +#define ARG_REF_DEFAULT 3 +#define ARG_BFRAMES_DEFAULT 0 +#define ARG_B_ADAPT_DEFAULT TRUE +#define ARG_B_PYRAMID_DEFAULT FALSE +#define ARG_WEIGHTB_DEFAULT FALSE +#define ARG_SPS_ID_DEFAULT 0 +#define ARG_AU_NALU_DEFAULT TRUE +#define ARG_TRELLIS_DEFAULT TRUE +#define ARG_KEYINT_MAX_DEFAULT 0 +#define ARG_CABAC_DEFAULT TRUE +#define ARG_QP_MIN_DEFAULT 10 +#define ARG_QP_MAX_DEFAULT 51 +#define ARG_QP_STEP_DEFAULT 4 +#define ARG_IP_FACTOR_DEFAULT 1.4 +#define ARG_PB_FACTOR_DEFAULT 1.3 +#define ARG_NR_DEFAULT 0 +#define ARG_INTERLACED_DEFAULT FALSE +#define ARG_SLICED_THREADS_DEFAULT FALSE +#define ARG_SYNC_LOOKAHEAD_DEFAULT -1 +#define ARG_RC_MB_TREE_DEFAULT TRUE +#define ARG_RC_LOOKAHEAD_DEFAULT 40 +#define ARG_INTRA_REFRESH_DEFAULT FALSE +#define ARG_OPTION_STRING_DEFAULT "" +static GString *x264enc_defaults; +#define ARG_SPEED_PRESET_DEFAULT 6 /* 'medium' preset - matches x264 CLI default */ +#define ARG_PSY_TUNE_DEFAULT 0 /* no psy tuning */ +#define ARG_TUNE_DEFAULT 0 /* no tuning */ +#define ARG_FRAME_PACKING_DEFAULT -1 /* automatic (none, or from input caps) */ +#define ARG_INSERT_VUI_DEFAULT TRUE + +enum +{ + GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY, + GST_X264_ENC_STREAM_FORMAT_AVC, + GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM +}; + +enum +{ + GST_X264_ENC_PASS_CBR = 0, + GST_X264_ENC_PASS_QUANT = 0x04, + GST_X264_ENC_PASS_QUAL, + GST_X264_ENC_PASS_PASS1 = 0x11, + GST_X264_ENC_PASS_PASS2, + GST_X264_ENC_PASS_PASS3 +}; + +#define GST_X264_ENC_PASS_TYPE (gst_x264_enc_pass_get_type()) +static GType +gst_x264_enc_pass_get_type (void) +{ + static GType pass_type = 0; + + static const GEnumValue pass_types[] = { + {GST_X264_ENC_PASS_CBR, "Constant Bitrate Encoding", "cbr"}, + {GST_X264_ENC_PASS_QUANT, "Constant Quantizer", "quant"}, + {GST_X264_ENC_PASS_QUAL, "Constant Quality", "qual"}, + {GST_X264_ENC_PASS_PASS1, "VBR Encoding - Pass 1", "pass1"}, + {GST_X264_ENC_PASS_PASS2, "VBR Encoding - Pass 2", "pass2"}, + {GST_X264_ENC_PASS_PASS3, "VBR Encoding - Pass 3", "pass3"}, + {0, NULL, NULL} + }; + + if (!pass_type) { + pass_type = g_enum_register_static ("GstX264EncPass", pass_types); + } + return pass_type; +} + +#define GST_X264_ENC_ME_TYPE (gst_x264_enc_me_get_type()) +static GType +gst_x264_enc_me_get_type (void) +{ + static GType me_type = 0; + static GEnumValue *me_types; + int n, i; + + if (me_type != 0) + return me_type; + + n = 0; + while (x264_motion_est_names[n] != NULL) + n++; + + me_types = g_new0 (GEnumValue, n + 1); + + for (i = 0; i < n; i++) { + me_types[i].value = i; + me_types[i].value_name = x264_motion_est_names[i]; + me_types[i].value_nick = x264_motion_est_names[i]; + } + + me_type = g_enum_register_static ("GstX264EncMe", me_types); + + return me_type; +} + +#define GST_X264_ENC_ANALYSE_TYPE (gst_x264_enc_analyse_get_type()) +static GType +gst_x264_enc_analyse_get_type (void) +{ + static GType analyse_type = 0; + static const GFlagsValue analyse_types[] = { + {X264_ANALYSE_I4x4, "i4x4", "i4x4"}, + {X264_ANALYSE_I8x8, "i8x8", "i8x8"}, + {X264_ANALYSE_PSUB16x16, "p8x8", "p8x8"}, + {X264_ANALYSE_PSUB8x8, "p4x4", "p4x4"}, + {X264_ANALYSE_BSUB16x16, "b8x8", "b8x8"}, + {0, NULL, NULL}, + }; + + if (!analyse_type) { + analyse_type = g_flags_register_static ("GstX264EncAnalyse", analyse_types); + } + return analyse_type; +} + +#define GST_X264_ENC_SPEED_PRESET_TYPE (gst_x264_enc_speed_preset_get_type()) +static GType +gst_x264_enc_speed_preset_get_type (void) +{ + static GType speed_preset_type = 0; + static GEnumValue *speed_preset_types; + int n, i; + + if (speed_preset_type != 0) + return speed_preset_type; + + n = 0; + while (x264_preset_names[n] != NULL) + n++; + + speed_preset_types = g_new0 (GEnumValue, n + 2); + + speed_preset_types[0].value = 0; + speed_preset_types[0].value_name = "No preset"; + speed_preset_types[0].value_nick = "None"; + + for (i = 1; i <= n; i++) { + speed_preset_types[i].value = i; + speed_preset_types[i].value_name = x264_preset_names[i - 1]; + speed_preset_types[i].value_nick = x264_preset_names[i - 1]; + } + + speed_preset_type = + g_enum_register_static ("GstX264EncPreset", speed_preset_types); + + return speed_preset_type; +} + +static const GFlagsValue tune_types[] = { + {0x0, "No tuning", "none"}, + {0x1, "Still image", "stillimage"}, + {0x2, "Fast decode", "fastdecode"}, + {0x4, "Zero latency", "zerolatency"}, + {0, NULL, NULL}, +}; + +#define GST_X264_ENC_TUNE_TYPE (gst_x264_enc_tune_get_type()) +static GType +gst_x264_enc_tune_get_type (void) +{ + static GType tune_type = 0; + + if (!tune_type) { + tune_type = g_flags_register_static ("GstX264EncTune", tune_types + 1); + } + return tune_type; +} + +enum +{ + GST_X264_ENC_TUNE_NONE, + GST_X264_ENC_TUNE_FILM, + GST_X264_ENC_TUNE_ANIMATION, + GST_X264_ENC_TUNE_GRAIN, + GST_X264_ENC_TUNE_PSNR, + GST_X264_ENC_TUNE_SSIM, + GST_X264_ENC_TUNE_LAST +}; + +static const GEnumValue psy_tune_types[] = { + {GST_X264_ENC_TUNE_NONE, "No tuning", "none"}, + {GST_X264_ENC_TUNE_FILM, "Film", "film"}, + {GST_X264_ENC_TUNE_ANIMATION, "Animation", "animation"}, + {GST_X264_ENC_TUNE_GRAIN, "Grain", "grain"}, + {GST_X264_ENC_TUNE_PSNR, "PSNR", "psnr"}, + {GST_X264_ENC_TUNE_SSIM, "SSIM", "ssim"}, + {0, NULL, NULL}, +}; + +#define GST_X264_ENC_PSY_TUNE_TYPE (gst_x264_enc_psy_tune_get_type()) +static GType +gst_x264_enc_psy_tune_get_type (void) +{ + static GType psy_tune_type = 0; + + if (!psy_tune_type) { + psy_tune_type = + g_enum_register_static ("GstX264EncPsyTune", psy_tune_types); + } + return psy_tune_type; +} + +static void +gst_x264_enc_build_tunings_string (GstX264Enc * x264enc) +{ + int i = 1; + + if (x264enc->tunings) + g_string_free (x264enc->tunings, TRUE); + + if (x264enc->psy_tune) { + x264enc->tunings = + g_string_new (psy_tune_types[x264enc->psy_tune].value_nick); + } else { + x264enc->tunings = g_string_new (NULL); + } + + while (tune_types[i].value_name) { + if (x264enc->tune & (1 << (i - 1))) + g_string_append_printf (x264enc->tunings, "%s%s", + x264enc->tunings->len ? "," : "", tune_types[i].value_nick); + i++; + } + + if (x264enc->tunings->len) + GST_DEBUG_OBJECT (x264enc, "Constructed tunings string: %s", + x264enc->tunings->str); +} + +#define GST_X264_ENC_FRAME_PACKING_TYPE (gst_x264_enc_frame_packing_get_type()) +static GType +gst_x264_enc_frame_packing_get_type (void) +{ + static GType fpa_type = 0; + + static const GEnumValue fpa_types[] = { + {-1, "Automatic (use incoming video information)", "auto"}, + {0, "checkerboard - Left and Right pixels alternate in a checkerboard pattern", "checkerboard"}, + {1, "column interleaved - Alternating pixel columns represent Left and Right views", "column-interleaved"}, + {2, "row interleaved - Alternating pixel rows represent Left and Right views", "row-interleaved"}, + {3, "side by side - The left half of the frame contains the Left eye view, the right half the Right eye view", "side-by-side"}, + {4, "top bottom - L is on top, R on bottom", "top-bottom"}, + {5, "frame interleaved - Each frame contains either Left or Right view alternately", "frame-interleaved"}, + {0, NULL, NULL} + }; + + if (!fpa_type) { + fpa_type = g_enum_register_static ("GstX264EncFramePacking", fpa_types); + } + return fpa_type; +} + +static gint +gst_x264_enc_mview_mode_to_frame_packing (GstVideoMultiviewMode mode) +{ + switch (mode) { + case GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD: + return 0; + case GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED: + return 1; + case GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED: + return 2; + case GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE: + return 3; + case GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM: + return 4; + case GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME: + return 5; + default: + break; + } + + return -1; +} + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h264, " + "framerate = (fraction) [0/1, MAX], " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ], " + "stream-format = (string) { avc, byte-stream }, " + "alignment = (string) au, " + "profile = (string) { high-4:4:4, high-4:2:2, high-10, high, main," + " baseline, constrained-baseline, high-4:4:4-intra, high-4:2:2-intra," + " high-10-intra }") + ); + +static void gst_x264_enc_finalize (GObject * object); +static gboolean gst_x264_enc_start (GstVideoEncoder * encoder); +static gboolean gst_x264_enc_stop (GstVideoEncoder * encoder); +static gboolean gst_x264_enc_flush (GstVideoEncoder * encoder); + +static gboolean gst_x264_enc_init_encoder (GstX264Enc * encoder); +static void gst_x264_enc_close_encoder (GstX264Enc * encoder); + +static GstFlowReturn gst_x264_enc_finish (GstVideoEncoder * encoder); +static GstFlowReturn gst_x264_enc_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame); +static void gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send); +static GstFlowReturn gst_x264_enc_encode_frame (GstX264Enc * encoder, + x264_picture_t * pic_in, GstVideoCodecFrame * input_frame, int *i_nal, + gboolean send); +static gboolean gst_x264_enc_set_format (GstVideoEncoder * video_enc, + GstVideoCodecState * state); +static gboolean gst_x264_enc_propose_allocation (GstVideoEncoder * encoder, + GstQuery * query); + +static void gst_x264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_x264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static gboolean x264_element_init (GstPlugin * plugin); + +typedef gboolean (*LoadPresetFunc) (GstPreset * preset, const gchar * name); + +LoadPresetFunc parent_load_preset = NULL; + +static gboolean +gst_x264_enc_load_preset (GstPreset * preset, const gchar * name) +{ + GstX264Enc *enc = GST_X264_ENC (preset); + gboolean res; + + gst_encoder_bitrate_profile_manager_start_loading_preset + (enc->bitrate_manager); + res = parent_load_preset (preset, name); + gst_encoder_bitrate_profile_manager_end_loading_preset (enc->bitrate_manager, + res ? name : NULL); + + return res; +} + +static void +gst_x264_enc_preset_interface_init (GstPresetInterface * iface) +{ + parent_load_preset = iface->load_preset; + iface->load_preset = gst_x264_enc_load_preset; +} + +#define gst_x264_enc_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstX264Enc, gst_x264_enc, GST_TYPE_VIDEO_ENCODER, + G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, + gst_x264_enc_preset_interface_init)); +GST_ELEMENT_REGISTER_DEFINE_CUSTOM (x264enc, x264_element_init) +/* don't forget to free the string after use */ + static const gchar *gst_x264_enc_build_partitions (gint analyse) +{ + GString *string; + + if (!analyse) + return NULL; + + string = g_string_new (NULL); + if (analyse & X264_ANALYSE_I4x4) + g_string_append (string, "i4x4"); + if (analyse & X264_ANALYSE_I8x8) + g_string_append (string, ",i8x8"); + if (analyse & X264_ANALYSE_PSUB16x16) + g_string_append (string, ",p8x8"); + if (analyse & X264_ANALYSE_PSUB8x8) + g_string_append (string, ",p4x4"); + if (analyse & X264_ANALYSE_BSUB16x16) + g_string_append (string, ",b8x8"); + + return (const gchar *) g_string_free (string, FALSE); +} + +static void +check_formats (const gchar * str, gboolean * has_420_8, gboolean * has_420_10, + gboolean * has_422, gboolean * has_444) +{ + if (g_str_has_prefix (str, "high-4:4:4")) + *has_444 = TRUE; + else if (g_str_has_prefix (str, "high-4:2:2")) + *has_422 = TRUE; + else if (g_str_has_prefix (str, "high-10")) + *has_420_10 = TRUE; + else + *has_420_8 = TRUE; +} + + +/* allowed input caps depending on whether libx264 was built for 8 or 10 bits */ +static GstCaps * +gst_x264_enc_sink_getcaps (GstVideoEncoder * enc, GstCaps * filter) +{ + GstCaps *supported_incaps; + GstCaps *allowed; + GstCaps *filter_caps, *fcaps; + gint i, j, k; + + supported_incaps = + gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SINK_PAD (enc)); + + /* Allow downstream to specify width/height/framerate/PAR constraints + * and forward them upstream for video converters to handle + */ + allowed = gst_pad_get_allowed_caps (enc->srcpad); + + if (!allowed || gst_caps_is_empty (allowed) || gst_caps_is_any (allowed)) { + fcaps = supported_incaps; + goto done; + } + + GST_LOG_OBJECT (enc, "template caps %" GST_PTR_FORMAT, supported_incaps); + GST_LOG_OBJECT (enc, "allowed caps %" GST_PTR_FORMAT, allowed); + + filter_caps = gst_caps_new_empty (); + + for (i = 0; i < gst_caps_get_size (supported_incaps); i++) { + GQuark q_name = + gst_structure_get_name_id (gst_caps_get_structure (supported_incaps, + i)); + + for (j = 0; j < gst_caps_get_size (allowed); j++) { + const GstStructure *allowed_s = gst_caps_get_structure (allowed, j); + const GValue *val; + GstStructure *s; + + /* FIXME Find a way to reuse gst_video_encoder_proxy_getcaps so that + * we do not need to copy that logic */ + s = gst_structure_new_id_empty (q_name); + if ((val = gst_structure_get_value (allowed_s, "width"))) + gst_structure_set_value (s, "width", val); + if ((val = gst_structure_get_value (allowed_s, "height"))) + gst_structure_set_value (s, "height", val); + if ((val = gst_structure_get_value (allowed_s, "framerate"))) + gst_structure_set_value (s, "framerate", val); + if ((val = gst_structure_get_value (allowed_s, "pixel-aspect-ratio"))) + gst_structure_set_value (s, "pixel-aspect-ratio", val); + if ((val = gst_structure_get_value (allowed_s, "colorimetry"))) + gst_structure_set_value (s, "colorimetry", val); + if ((val = gst_structure_get_value (allowed_s, "chroma-site"))) + gst_structure_set_value (s, "chroma-site", val); + + if ((val = gst_structure_get_value (allowed_s, "profile"))) { + gboolean has_420_8 = FALSE; + gboolean has_420_10 = FALSE; + gboolean has_422 = FALSE; + gboolean has_444 = FALSE; + + if (G_VALUE_HOLDS_STRING (val)) { + check_formats (g_value_get_string (val), &has_420_8, &has_420_10, + &has_422, &has_444); + } else if (GST_VALUE_HOLDS_LIST (val)) { + for (k = 0; k < gst_value_list_get_size (val); k++) { + const GValue *vlist = gst_value_list_get_value (val, k); + + if (G_VALUE_HOLDS_STRING (vlist)) + check_formats (g_value_get_string (vlist), &has_420_8, + &has_420_10, &has_422, &has_444); + } + } + + gst_x264_enc_add_x264_chroma_format (s, has_420_8, has_420_10, has_422, + has_444); + } + + filter_caps = gst_caps_merge_structure (filter_caps, s); + } + } + + fcaps = gst_caps_intersect (filter_caps, supported_incaps); + gst_caps_unref (filter_caps); + gst_caps_unref (supported_incaps); + + if (filter) { + GST_LOG_OBJECT (enc, "intersecting with %" GST_PTR_FORMAT, filter); + filter_caps = gst_caps_intersect (fcaps, filter); + gst_caps_unref (fcaps); + fcaps = filter_caps; + } + +done: + gst_caps_replace (&allowed, NULL); + + GST_LOG_OBJECT (enc, "proxy caps %" GST_PTR_FORMAT, fcaps); + + return fcaps; +} + +static gboolean +gst_x264_enc_sink_query (GstVideoEncoder * enc, GstQuery * query) +{ + GstPad *pad = GST_VIDEO_ENCODER_SINK_PAD (enc); + gboolean ret = FALSE; + + GST_DEBUG ("Received %s query on sinkpad, %" GST_PTR_FORMAT, + GST_QUERY_TYPE_NAME (query), query); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_ACCEPT_CAPS:{ + GstCaps *acceptable, *caps; + + acceptable = gst_pad_get_pad_template_caps (pad); + + gst_query_parse_accept_caps (query, &caps); + + gst_query_set_accept_caps_result (query, + gst_caps_is_subset (caps, acceptable)); + gst_caps_unref (acceptable); + ret = TRUE; + } + break; + default: + ret = GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (enc, query); + break; + } + + return ret; +} + +static void +gst_x264_enc_class_init (GstX264EncClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstVideoEncoderClass *gstencoder_class; + const gchar *partitions = NULL; + GstPadTemplate *sink_templ; + GstCaps *supported_sinkcaps; + + x264enc_defaults = g_string_new (""); + + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); + gstencoder_class = GST_VIDEO_ENCODER_CLASS (klass); + + gobject_class->set_property = gst_x264_enc_set_property; + gobject_class->get_property = gst_x264_enc_get_property; + gobject_class->finalize = gst_x264_enc_finalize; + + gstencoder_class->set_format = GST_DEBUG_FUNCPTR (gst_x264_enc_set_format); + gstencoder_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_x264_enc_handle_frame); + gstencoder_class->start = GST_DEBUG_FUNCPTR (gst_x264_enc_start); + gstencoder_class->stop = GST_DEBUG_FUNCPTR (gst_x264_enc_stop); + gstencoder_class->flush = GST_DEBUG_FUNCPTR (gst_x264_enc_flush); + gstencoder_class->finish = GST_DEBUG_FUNCPTR (gst_x264_enc_finish); + gstencoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_x264_enc_sink_getcaps); + gstencoder_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_x264_enc_propose_allocation); + gstencoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_x264_enc_sink_query); + + /* options for which we don't use string equivalents */ + g_object_class_install_property (gobject_class, ARG_PASS, + g_param_spec_enum ("pass", "Encoding pass/type", + "Encoding pass/type", GST_X264_ENC_PASS_TYPE, + ARG_PASS_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_QUANTIZER, + g_param_spec_uint ("quantizer", "Constant Quantizer", + "Constant quantizer or quality to apply", + 0, 50, ARG_QUANTIZER_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", "Bitrate in kbit/sec", 1, + 2000 * 1024, ARG_BITRATE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + g_object_class_install_property (gobject_class, ARG_VBV_BUF_CAPACITY, + g_param_spec_uint ("vbv-buf-capacity", "VBV buffer capacity", + "Size of the VBV buffer in milliseconds", + 0, 10000, ARG_VBV_BUF_CAPACITY_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + g_object_class_install_property (gobject_class, ARG_SPEED_PRESET, + g_param_spec_enum ("speed-preset", "Speed/quality preset", + "Preset name for speed/quality tradeoff options (can affect decode " + "compatibility - impose restrictions separately for your target decoder)", + GST_X264_ENC_SPEED_PRESET_TYPE, ARG_SPEED_PRESET_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_PSY_TUNE, + g_param_spec_enum ("psy-tune", "Psychovisual tuning preset", + "Preset name for psychovisual tuning options", + GST_X264_ENC_PSY_TUNE_TYPE, ARG_PSY_TUNE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_TUNE, + g_param_spec_flags ("tune", "Content tuning preset", + "Preset name for non-psychovisual tuning options", + GST_X264_ENC_TUNE_TYPE, ARG_TUNE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_OPTION_STRING, + g_param_spec_string ("option-string", "Option string", + "String of x264 options (overridden by element properties)" + " in the format \"key1=value1:key2=value2\".", + ARG_OPTION_STRING_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, ARG_FRAME_PACKING, + g_param_spec_enum ("frame-packing", "Frame Packing", + "Set frame packing mode for Stereoscopic content", + GST_X264_ENC_FRAME_PACKING_TYPE, ARG_FRAME_PACKING_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, ARG_INSERT_VUI, + g_param_spec_boolean ("insert-vui", "Insert VUI", + "Insert VUI NAL in stream", + ARG_INSERT_VUI_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* options for which we _do_ use string equivalents */ + g_object_class_install_property (gobject_class, ARG_THREADS, + g_param_spec_uint ("threads", "Threads", + "Number of threads used by the codec (0 for automatic)", + 0, G_MAXINT, ARG_THREADS_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /* NOTE: this first string append doesn't require the ':' delimiter but the + * rest do */ + g_string_append_printf (x264enc_defaults, "threads=%d", ARG_THREADS_DEFAULT); + g_object_class_install_property (gobject_class, ARG_SLICED_THREADS, + g_param_spec_boolean ("sliced-threads", "Sliced Threads", + "Low latency but lower efficiency threading", + ARG_SLICED_THREADS_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":sliced-threads=%d", + ARG_SLICED_THREADS_DEFAULT); + g_object_class_install_property (gobject_class, ARG_SYNC_LOOKAHEAD, + g_param_spec_int ("sync-lookahead", "Sync Lookahead", + "Number of buffer frames for threaded lookahead (-1 for automatic)", + -1, 250, ARG_SYNC_LOOKAHEAD_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":sync-lookahead=%d", + ARG_SYNC_LOOKAHEAD_DEFAULT); + g_object_class_install_property (gobject_class, ARG_MULTIPASS_CACHE_FILE, + g_param_spec_string ("multipass-cache-file", "Multipass Cache File", + "Filename for multipass cache file", + ARG_MULTIPASS_CACHE_FILE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":stats=%s", + ARG_MULTIPASS_CACHE_FILE_DEFAULT); + g_object_class_install_property (gobject_class, ARG_BYTE_STREAM, + g_param_spec_boolean ("byte-stream", "Byte Stream", + "Generate byte stream format of NALU", ARG_BYTE_STREAM_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":annexb=%d", + ARG_BYTE_STREAM_DEFAULT); + g_object_class_install_property (gobject_class, ARG_INTRA_REFRESH, + g_param_spec_boolean ("intra-refresh", "Intra Refresh", + "Use Periodic Intra Refresh instead of IDR frames", + ARG_INTRA_REFRESH_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":intra-refresh=%d", + ARG_INTRA_REFRESH_DEFAULT); + g_object_class_install_property (gobject_class, ARG_ME, + g_param_spec_enum ("me", "Motion Estimation", + "Integer pixel motion estimation method", GST_X264_ENC_ME_TYPE, + ARG_ME_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":me=%s", + x264_motion_est_names[ARG_ME_DEFAULT]); + g_object_class_install_property (gobject_class, ARG_SUBME, + g_param_spec_uint ("subme", "Subpixel Motion Estimation", + "Subpixel motion estimation and partition decision quality: 1=fast, 10=best", + 1, 10, ARG_SUBME_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":subme=%d", ARG_SUBME_DEFAULT); + g_object_class_install_property (gobject_class, ARG_ANALYSE, + g_param_spec_flags ("analyse", "Analyse", "Partitions to consider", + GST_X264_ENC_ANALYSE_TYPE, ARG_ANALYSE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + partitions = gst_x264_enc_build_partitions (ARG_ANALYSE_DEFAULT); + if (partitions) { + g_string_append_printf (x264enc_defaults, ":partitions=%s", partitions); + g_free ((gpointer) partitions); + } + g_object_class_install_property (gobject_class, ARG_DCT8x8, + g_param_spec_boolean ("dct8x8", "DCT8x8", + "Adaptive spatial transform size", ARG_DCT8x8_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":8x8dct=%d", ARG_DCT8x8_DEFAULT); + g_object_class_install_property (gobject_class, ARG_REF, + g_param_spec_uint ("ref", "Reference Frames", + "Number of reference frames", + 1, 16, ARG_REF_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":ref=%d", ARG_REF_DEFAULT); + g_object_class_install_property (gobject_class, ARG_BFRAMES, + g_param_spec_uint ("bframes", "B-Frames", + "Number of B-frames between I and P", + 0, 16, ARG_BFRAMES_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":bframes=%d", ARG_BFRAMES_DEFAULT); + g_object_class_install_property (gobject_class, ARG_B_ADAPT, + g_param_spec_boolean ("b-adapt", "B-Adapt", + "Automatically decide how many B-frames to use", + ARG_B_ADAPT_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":b-adapt=%d", ARG_B_ADAPT_DEFAULT); + g_object_class_install_property (gobject_class, ARG_B_PYRAMID, + g_param_spec_boolean ("b-pyramid", "B-Pyramid", + "Keep some B-frames as references", ARG_B_PYRAMID_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":b-pyramid=%s", + x264_b_pyramid_names[ARG_B_PYRAMID_DEFAULT]); + g_object_class_install_property (gobject_class, ARG_WEIGHTB, + g_param_spec_boolean ("weightb", "Weighted B-Frames", + "Weighted prediction for B-frames", ARG_WEIGHTB_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":weightb=%d", ARG_WEIGHTB_DEFAULT); + g_object_class_install_property (gobject_class, ARG_SPS_ID, + g_param_spec_uint ("sps-id", "SPS ID", + "SPS and PPS ID number", + 0, 31, ARG_SPS_ID_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":sps-id=%d", ARG_SPS_ID_DEFAULT); + g_object_class_install_property (gobject_class, ARG_AU_NALU, + g_param_spec_boolean ("aud", "AUD", + "Use AU (Access Unit) delimiter", ARG_AU_NALU_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":aud=%d", ARG_AU_NALU_DEFAULT); + g_object_class_install_property (gobject_class, ARG_TRELLIS, + g_param_spec_boolean ("trellis", "Trellis quantization", + "Enable trellis searched quantization", ARG_TRELLIS_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":trellis=%d", ARG_TRELLIS_DEFAULT); + g_object_class_install_property (gobject_class, ARG_KEYINT_MAX, + g_param_spec_uint ("key-int-max", "Key-frame maximal interval", + "Maximal distance between two key-frames (0 for automatic)", + 0, G_MAXINT, ARG_KEYINT_MAX_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":keyint=%d", + ARG_KEYINT_MAX_DEFAULT); + g_object_class_install_property (gobject_class, ARG_CABAC, + g_param_spec_boolean ("cabac", "Use CABAC", "Enable CABAC entropy coding", + ARG_CABAC_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":cabac=%d", ARG_CABAC_DEFAULT); + g_object_class_install_property (gobject_class, ARG_QP_MIN, + g_param_spec_uint ("qp-min", "Minimum Quantizer", + "Minimum quantizer", 0, 63, ARG_QP_MIN_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":qpmin=%d", ARG_QP_MIN_DEFAULT); + g_object_class_install_property (gobject_class, ARG_QP_MAX, + g_param_spec_uint ("qp-max", "Maximum Quantizer", + "Maximum quantizer", 0, 63, ARG_QP_MAX_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":qpmax=%d", ARG_QP_MAX_DEFAULT); + g_object_class_install_property (gobject_class, ARG_QP_STEP, + g_param_spec_uint ("qp-step", "Maximum Quantizer Difference", + "Maximum quantizer difference between frames", + 0, 63, ARG_QP_STEP_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":qpstep=%d", ARG_QP_STEP_DEFAULT); + g_object_class_install_property (gobject_class, ARG_IP_FACTOR, + g_param_spec_float ("ip-factor", "IP-Factor", + "Quantizer factor between I- and P-frames", + 0, 2, ARG_IP_FACTOR_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":ip-factor=%f", + ARG_IP_FACTOR_DEFAULT); + g_object_class_install_property (gobject_class, ARG_PB_FACTOR, + g_param_spec_float ("pb-factor", "PB-Factor", + "Quantizer factor between P- and B-frames", 0, 2, + ARG_PB_FACTOR_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":pb-factor=%f", + ARG_PB_FACTOR_DEFAULT); + g_object_class_install_property (gobject_class, ARG_RC_MB_TREE, + g_param_spec_boolean ("mb-tree", "Macroblock Tree", + "Macroblock-Tree ratecontrol", + ARG_RC_MB_TREE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":mbtree=%d", + ARG_RC_MB_TREE_DEFAULT); + g_object_class_install_property (gobject_class, ARG_RC_LOOKAHEAD, + g_param_spec_int ("rc-lookahead", "Rate Control Lookahead", + "Number of frames for frametype lookahead", 0, 250, + ARG_RC_LOOKAHEAD_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":rc-lookahead=%d", + ARG_RC_LOOKAHEAD_DEFAULT); + g_object_class_install_property (gobject_class, ARG_NR, + g_param_spec_uint ("noise-reduction", "Noise Reduction", + "Noise reduction strength", + 0, 100000, ARG_NR_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":nr=%d", ARG_NR_DEFAULT); + g_object_class_install_property (gobject_class, ARG_INTERLACED, + g_param_spec_boolean ("interlaced", "Interlaced", + "Interlaced material", ARG_INTERLACED_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_string_append_printf (x264enc_defaults, ":interlaced=%d", + ARG_INTERLACED_DEFAULT); + + /* append deblock parameters */ + g_string_append_printf (x264enc_defaults, ":deblock=0,0"); + /* append weighted prediction parameter */ + g_string_append_printf (x264enc_defaults, ":weightp=0"); + + gst_element_class_set_static_metadata (element_class, + "x264enc", "Codec/Encoder/Video", "H264 Encoder", + "Josef Zlomek , " + "Mark Nauwelaerts "); + + supported_sinkcaps = gst_caps_new_simple ("video/x-raw", + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, + "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + + gst_x264_enc_add_x264_chroma_format (gst_caps_get_structure + (supported_sinkcaps, 0), TRUE, TRUE, TRUE, TRUE); + + sink_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, supported_sinkcaps); + + gst_caps_unref (supported_sinkcaps); + + gst_element_class_add_pad_template (element_class, sink_templ); + gst_element_class_add_static_pad_template (element_class, &src_factory); + + gst_type_mark_as_plugin_api (GST_X264_ENC_ANALYSE_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_FRAME_PACKING_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_ME_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_PASS_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_PSY_TUNE_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_SPEED_PRESET_TYPE, 0); + gst_type_mark_as_plugin_api (GST_X264_ENC_TUNE_TYPE, 0); +} + +/* *INDENT-OFF* */ +G_GNUC_PRINTF (3, 0) +/* *INDENT-ON* */ + +static void +gst_x264_enc_log_callback (gpointer private, gint level, const char *format, + va_list args) +{ +#ifndef GST_DISABLE_GST_DEBUG + GstDebugLevel gst_level; + GObject *object = (GObject *) private; + gchar *formatted; + + switch (level) { + case X264_LOG_NONE: + gst_level = GST_LEVEL_NONE; + break; + case X264_LOG_ERROR: + gst_level = GST_LEVEL_ERROR; + break; + case X264_LOG_WARNING: + gst_level = GST_LEVEL_WARNING; + break; + case X264_LOG_INFO: + gst_level = GST_LEVEL_INFO; + break; + default: + /* push x264enc debug down to our lower levels to avoid some clutter */ + gst_level = GST_LEVEL_LOG; + break; + } + + if (G_LIKELY (gst_level > _gst_debug_min)) + return; + + if (G_LIKELY (gst_level > gst_debug_category_get_threshold (GST_CAT_DEFAULT))) + return; + + formatted = g_strdup_vprintf (format, args); + g_strchomp (formatted); + + GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, gst_level, object, "%s", formatted); + + g_free (formatted); +#endif /* GST_DISABLE_GST_DEBUG */ +} + +/* initialize the new element + * instantiate pads and add them to element + * set functions + * initialize structure + */ +static void +gst_x264_enc_init (GstX264Enc * encoder) +{ + /* properties */ + encoder->threads = ARG_THREADS_DEFAULT; + encoder->sliced_threads = ARG_SLICED_THREADS_DEFAULT; + encoder->sync_lookahead = ARG_SYNC_LOOKAHEAD_DEFAULT; + encoder->pass = ARG_PASS_DEFAULT; + encoder->quantizer = ARG_QUANTIZER_DEFAULT; + encoder->mp_cache_file = g_strdup (ARG_MULTIPASS_CACHE_FILE_DEFAULT); + encoder->byte_stream = ARG_BYTE_STREAM_DEFAULT; + encoder->intra_refresh = ARG_INTRA_REFRESH_DEFAULT; + encoder->vbv_buf_capacity = ARG_VBV_BUF_CAPACITY_DEFAULT; + encoder->me = ARG_ME_DEFAULT; + encoder->subme = ARG_SUBME_DEFAULT; + encoder->analyse = ARG_ANALYSE_DEFAULT; + encoder->dct8x8 = ARG_DCT8x8_DEFAULT; + encoder->ref = ARG_REF_DEFAULT; + encoder->bframes = ARG_BFRAMES_DEFAULT; + encoder->b_adapt = ARG_B_ADAPT_DEFAULT; + encoder->b_pyramid = ARG_B_PYRAMID_DEFAULT; + encoder->weightb = ARG_WEIGHTB_DEFAULT; + encoder->sps_id = ARG_SPS_ID_DEFAULT; + encoder->au_nalu = ARG_AU_NALU_DEFAULT; + encoder->trellis = ARG_TRELLIS_DEFAULT; + encoder->keyint_max = ARG_KEYINT_MAX_DEFAULT; + encoder->cabac = ARG_CABAC_DEFAULT; + encoder->qp_min = ARG_QP_MIN_DEFAULT; + encoder->qp_max = ARG_QP_MAX_DEFAULT; + encoder->qp_step = ARG_QP_STEP_DEFAULT; + encoder->ip_factor = ARG_IP_FACTOR_DEFAULT; + encoder->pb_factor = ARG_PB_FACTOR_DEFAULT; + encoder->mb_tree = ARG_RC_MB_TREE_DEFAULT; + encoder->rc_lookahead = ARG_RC_LOOKAHEAD_DEFAULT; + encoder->noise_reduction = ARG_NR_DEFAULT; + encoder->interlaced = ARG_INTERLACED_DEFAULT; + encoder->option_string = g_string_new (NULL); + encoder->option_string_prop = g_string_new (ARG_OPTION_STRING_DEFAULT); + encoder->speed_preset = ARG_SPEED_PRESET_DEFAULT; + encoder->psy_tune = ARG_PSY_TUNE_DEFAULT; + encoder->tune = ARG_TUNE_DEFAULT; + encoder->frame_packing = ARG_FRAME_PACKING_DEFAULT; + encoder->insert_vui = ARG_INSERT_VUI_DEFAULT; + + encoder->bitrate_manager = + gst_encoder_bitrate_profile_manager_new (ARG_BITRATE_DEFAULT); +} + +typedef struct +{ + GstVideoCodecFrame *frame; + GstVideoFrame vframe; +} FrameData; + +static FrameData * +gst_x264_enc_queue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame, + GstVideoInfo * info) +{ + GstVideoFrame vframe; + FrameData *fdata; + + if (!gst_video_frame_map (&vframe, info, frame->input_buffer, GST_MAP_READ)) + return NULL; + + fdata = g_slice_new (FrameData); + fdata->frame = gst_video_codec_frame_ref (frame); + fdata->vframe = vframe; + + enc->pending_frames = g_list_prepend (enc->pending_frames, fdata); + + return fdata; +} + +static void +gst_x264_enc_dequeue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame) +{ + GList *l; + + for (l = enc->pending_frames; l; l = l->next) { + FrameData *fdata = l->data; + + if (fdata->frame != frame) + continue; + + gst_video_frame_unmap (&fdata->vframe); + gst_video_codec_frame_unref (fdata->frame); + g_slice_free (FrameData, fdata); + + enc->pending_frames = g_list_delete_link (enc->pending_frames, l); + return; + } +} + +static void +gst_x264_enc_dequeue_all_frames (GstX264Enc * enc) +{ + GList *l; + + for (l = enc->pending_frames; l; l = l->next) { + FrameData *fdata = l->data; + + gst_video_frame_unmap (&fdata->vframe); + gst_video_codec_frame_unref (fdata->frame); + g_slice_free (FrameData, fdata); + } + g_list_free (enc->pending_frames); + enc->pending_frames = NULL; +} + +static gboolean +gst_x264_enc_start (GstVideoEncoder * encoder) +{ + GstX264Enc *x264enc = GST_X264_ENC (encoder); + + x264enc->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY; + + /* make sure that we have enough time for first DTS, + this is probably overkill for most streams */ + gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000); + + return TRUE; +} + +static gboolean +gst_x264_enc_stop (GstVideoEncoder * encoder) +{ + GstX264Enc *x264enc = GST_X264_ENC (encoder); + + gst_x264_enc_flush_frames (x264enc, FALSE); + gst_x264_enc_close_encoder (x264enc); + gst_x264_enc_dequeue_all_frames (x264enc); + + if (x264enc->input_state) + gst_video_codec_state_unref (x264enc->input_state); + x264enc->input_state = NULL; + + return TRUE; +} + + +static gboolean +gst_x264_enc_flush (GstVideoEncoder * encoder) +{ + GstX264Enc *x264enc = GST_X264_ENC (encoder); + + gst_x264_enc_flush_frames (x264enc, FALSE); + gst_x264_enc_close_encoder (x264enc); + gst_x264_enc_dequeue_all_frames (x264enc); + + gst_x264_enc_init_encoder (x264enc); + + return TRUE; +} + +static void +gst_x264_enc_finalize (GObject * object) +{ + GstX264Enc *encoder = GST_X264_ENC (object); + + if (encoder->input_state) + gst_video_codec_state_unref (encoder->input_state); + encoder->input_state = NULL; + +#define FREE_STRING(ptr) \ + if (ptr) \ + g_string_free (ptr, TRUE); + + FREE_STRING (encoder->tunings); + FREE_STRING (encoder->option_string); + FREE_STRING (encoder->option_string_prop); + gst_encoder_bitrate_profile_manager_free (encoder->bitrate_manager); + +#undef FREE_STRING + + g_free (encoder->mp_cache_file); + encoder->mp_cache_file = NULL; + + gst_x264_enc_close_encoder (encoder); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* + * gst_x264_enc_parse_options + * @encoder: Encoder to which options are assigned + * @str: Option string + * + * Parse option string and assign to x264 parameters + * + */ +static gboolean +gst_x264_enc_parse_options (GstX264Enc * encoder, const gchar * str) +{ + GStrv kvpairs; + guint npairs, i; + gint parse_result = 0, ret = 0; + gchar *options = (gchar *) str; + + while (*options == ':') + options++; + + kvpairs = g_strsplit (options, ":", 0); + npairs = g_strv_length (kvpairs); + + for (i = 0; i < npairs; i++) { + GStrv key_val = g_strsplit (kvpairs[i], "=", 2); + + parse_result = + encoder->vtable->x264_param_parse (&encoder->x264param, key_val[0], + key_val[1]); + + if (parse_result == X264_PARAM_BAD_NAME) { + GST_ERROR_OBJECT (encoder, "Bad name for option %s=%s", + key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : ""); + } + if (parse_result == X264_PARAM_BAD_VALUE) { + GST_ERROR_OBJECT (encoder, + "Bad value for option %s=%s (Note: a NULL value for a non-boolean triggers this)", + key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : ""); + } + + g_strfreev (key_val); + + if (parse_result) + ret++; + } + + g_strfreev (kvpairs); + return !ret; +} + +static gint +gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes) +{ + switch (format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + if (nplanes) + *nplanes = 3; + return X264_CSP_I420; + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: + if (nplanes) + *nplanes = 3; + return X264_CSP_I420 | X264_CSP_HIGH_DEPTH; + case GST_VIDEO_FORMAT_Y42B: + if (nplanes) + *nplanes = 3; + return X264_CSP_I422; + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + if (nplanes) + *nplanes = 3; + return X264_CSP_I422 | X264_CSP_HIGH_DEPTH; + case GST_VIDEO_FORMAT_Y444: + if (nplanes) + *nplanes = 3; + return X264_CSP_I444; + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + if (nplanes) + *nplanes = 3; + return X264_CSP_I444 | X264_CSP_HIGH_DEPTH; + case GST_VIDEO_FORMAT_NV12: + if (nplanes) + *nplanes = 2; + return X264_CSP_NV12; + default: + g_return_val_if_reached (GST_VIDEO_FORMAT_UNKNOWN); + } +} + +/* + * gst_x264_enc_init_encoder + * @encoder: Encoder which should be initialized. + * + * Initialize x264 encoder. + * + */ +static gboolean +gst_x264_enc_init_encoder (GstX264Enc * encoder) +{ + guint pass = 0; + GstVideoInfo *info; + guint bitrate; + + if (!encoder->input_state) { + GST_DEBUG_OBJECT (encoder, "Have no input state yet"); + return FALSE; + } + + info = &encoder->input_state->info; + + /* make sure that the encoder is closed */ + gst_x264_enc_close_encoder (encoder); + + GST_OBJECT_LOCK (encoder); + + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 8) + encoder->vtable = vtable_8bit; + else if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 10) + encoder->vtable = vtable_10bit; + + g_assert (encoder->vtable != NULL); + + gst_x264_enc_build_tunings_string (encoder); + + /* set x264 parameters and use preset/tuning if present */ + GST_DEBUG_OBJECT (encoder, "Applying defaults with preset %s, tunings %s", + encoder->speed_preset ? x264_preset_names[encoder->speed_preset - 1] : "", + encoder->tunings && encoder->tunings->len ? encoder->tunings->str : ""); + encoder->vtable->x264_param_default_preset (&encoder->x264param, + encoder->speed_preset ? x264_preset_names[encoder->speed_preset - + 1] : NULL, encoder->tunings + && encoder->tunings->len ? encoder->tunings->str : NULL); + + /* log callback setup; part of parameters + * this needs to be done again after every *param_default* () call */ + encoder->x264param.pf_log = gst_x264_enc_log_callback; + encoder->x264param.p_log_private = encoder; + encoder->x264param.i_log_level = X264_LOG_DEBUG; + + /* if no preset nor tuning, use property defaults */ + if (!encoder->speed_preset && !encoder->tunings->len) { + GST_DEBUG_OBJECT (encoder, "Applying x264enc_defaults"); + if (x264enc_defaults->len + && gst_x264_enc_parse_options (encoder, + x264enc_defaults->str) == FALSE) { + GST_DEBUG_OBJECT (encoder, + "x264enc_defaults string contains errors. This is a bug."); + goto unlock_and_return; + } + } else { + /* When using presets we need to respect the default output format */ + encoder->x264param.b_aud = encoder->au_nalu; + encoder->x264param.b_annexb = encoder->byte_stream; + } + + /* setup appropriate timebase for gstreamer */ + encoder->x264param.i_timebase_num = 1; + encoder->x264param.i_timebase_den = 1000000000; + + /* apply option-string property */ + if (encoder->option_string_prop && encoder->option_string_prop->len) { + GST_DEBUG_OBJECT (encoder, "Applying option-string: %s", + encoder->option_string_prop->str); + if (gst_x264_enc_parse_options (encoder, + encoder->option_string_prop->str) == FALSE) { + GST_DEBUG_OBJECT (encoder, "Your option-string contains errors."); + goto unlock_and_return; + } + } + /* apply user-set options */ + if (encoder->option_string && encoder->option_string->len) { + GST_DEBUG_OBJECT (encoder, "Applying user-set options: %s", + encoder->option_string->str); + if (gst_x264_enc_parse_options (encoder, + encoder->option_string->str) == FALSE) { + GST_DEBUG_OBJECT (encoder, "Failed to parse internal option string. " + "This could be due to use of an old libx264 version. Option string " + "was: %s", encoder->option_string->str); + } + } + + /* set up encoder parameters */ +#if X264_BUILD >= 153 + encoder->x264param.i_bitdepth = GST_VIDEO_INFO_COMP_DEPTH (info, 0); +#endif + encoder->x264param.i_csp = + gst_x264_enc_gst_to_x264_video_format (info->finfo->format, + &encoder->x264_nplanes); + if (info->fps_d == 0 || info->fps_n == 0) { + /* No FPS so must use VFR + * This raises latency apparently see http://mewiki.project357.com/wiki/X264_Encoding_Suggestions */ + encoder->x264param.b_vfr_input = TRUE; + if (encoder->keyint_max) { /* NB the default is 250 setup by x264 itself */ + encoder->x264param.i_keyint_max = encoder->keyint_max; + } + } else { + /* FPS available so set it up */ + encoder->x264param.b_vfr_input = FALSE; + encoder->x264param.i_fps_num = info->fps_n; + encoder->x264param.i_fps_den = info->fps_d; + encoder->x264param.i_keyint_max = + encoder->keyint_max ? encoder->keyint_max : (10 * info->fps_n / + info->fps_d); + } + encoder->x264param.i_width = info->width; + encoder->x264param.i_height = info->height; + if (info->par_d > 0) { + encoder->x264param.vui.i_sar_width = info->par_n; + encoder->x264param.vui.i_sar_height = info->par_d; + } + + if ((((info->height == 576) && ((info->width == 720) + || (info->width == 704) || (info->width == 352))) + || ((info->height == 288) && (info->width == 352))) + && (info->fps_d == 1) && (info->fps_n == 25)) { + encoder->x264param.vui.i_vidformat = 1; /* PAL */ + } else if ((((info->height == 480) && ((info->width == 720) + || (info->width == 704) || (info->width == 352))) + || ((info->height == 240) && (info->width == 352))) + && (info->fps_d == 1001) && ((info->fps_n == 30000) + || (info->fps_n == 24000))) { + encoder->x264param.vui.i_vidformat = 2; /* NTSC */ + } else { + encoder->x264param.vui.i_vidformat = 5; /* unspecified */ + } + + if (!encoder->insert_vui) + goto skip_vui_parameters; + + encoder->x264param.vui.i_colorprim = + gst_video_color_primaries_to_iso (info->colorimetry.primaries); + + encoder->x264param.vui.i_transfer = + gst_video_transfer_function_to_iso (info->colorimetry.transfer); + + encoder->x264param.vui.i_colmatrix = + gst_video_color_matrix_to_iso (info->colorimetry.matrix); + + if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) { + encoder->x264param.vui.b_fullrange = 1; + } else { + encoder->x264param.vui.b_fullrange = 0; + } + + switch (info->chroma_site) { + case GST_VIDEO_CHROMA_SITE_MPEG2: + encoder->x264param.vui.i_chroma_loc = 0; + break; + case GST_VIDEO_CHROMA_SITE_JPEG: + encoder->x264param.vui.i_chroma_loc = 1; + break; + case GST_VIDEO_CHROMA_SITE_V_COSITED: + encoder->x264param.vui.i_chroma_loc = 3; + break; + case GST_VIDEO_CHROMA_SITE_DV: + encoder->x264param.vui.i_chroma_loc = 2; + break; + default: + encoder->x264param.vui.i_chroma_loc = 0; + break; + } + +skip_vui_parameters: + + encoder->x264param.analyse.b_psnr = 0; + + bitrate = + gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager, + encoder->input_state ? &encoder->input_state->info : NULL); + + /* FIXME 2.0 make configuration more sane and consistent with x264 cmdline: + * + split pass property into a pass property (pass1/2/3 enum) and rc-method + * + bitrate property should only be used in case of CBR method + * + vbv bitrate/buffer should have separate configuration that is then + * applied independently of the mode: + * + either using properties (new) vbv-maxrate and (renamed) vbv-bufsize + * + or dropping vbv-buf-capacity altogether and simply using option-string + */ + switch (encoder->pass) { + case GST_X264_ENC_PASS_QUANT: + encoder->x264param.rc.i_rc_method = X264_RC_CQP; + encoder->x264param.rc.i_qp_constant = encoder->quantizer; + break; + case GST_X264_ENC_PASS_QUAL: + encoder->x264param.rc.i_rc_method = X264_RC_CRF; + encoder->x264param.rc.f_rf_constant = encoder->quantizer; + encoder->x264param.rc.i_vbv_max_bitrate = bitrate; + encoder->x264param.rc.i_vbv_buffer_size + = encoder->x264param.rc.i_vbv_max_bitrate + * encoder->vbv_buf_capacity / 1000; + break; + case GST_X264_ENC_PASS_CBR: + case GST_X264_ENC_PASS_PASS1: + case GST_X264_ENC_PASS_PASS2: + case GST_X264_ENC_PASS_PASS3: + default: + encoder->x264param.rc.i_rc_method = X264_RC_ABR; + encoder->x264param.rc.i_bitrate = bitrate; + encoder->x264param.rc.i_vbv_max_bitrate = bitrate; + encoder->x264param.rc.i_vbv_buffer_size = + encoder->x264param.rc.i_vbv_max_bitrate + * encoder->vbv_buf_capacity / 1000; + pass = encoder->pass & 0xF; + break; + } + + switch (pass) { + case 0: + encoder->x264param.rc.b_stat_read = 0; + encoder->x264param.rc.b_stat_write = 0; + break; + case 1: + encoder->x264param.rc.b_stat_read = 0; + encoder->x264param.rc.b_stat_write = 1; + encoder->vtable->x264_param_apply_fastfirstpass (&encoder->x264param); + encoder->x264param.i_frame_reference = 1; + encoder->x264param.analyse.b_transform_8x8 = 0; + encoder->x264param.analyse.inter = 0; + encoder->x264param.analyse.i_me_method = X264_ME_DIA; + encoder->x264param.analyse.i_subpel_refine = + MIN (2, encoder->x264param.analyse.i_subpel_refine); + encoder->x264param.analyse.i_trellis = 0; + encoder->x264param.analyse.b_fast_pskip = 1; + break; + case 2: + encoder->x264param.rc.b_stat_read = 1; + encoder->x264param.rc.b_stat_write = 0; + break; + case 3: + encoder->x264param.rc.b_stat_read = 1; + encoder->x264param.rc.b_stat_write = 1; + break; + } + + if (encoder->peer_profile) { + if (encoder->vtable->x264_param_apply_profile (&encoder->x264param, + encoder->peer_profile)) + GST_WARNING_OBJECT (encoder, "Bad downstream profile name: %s", + encoder->peer_profile); + } + + /* If using an intra profile, all frames are intra frames */ + if (encoder->peer_intra_profile) + encoder->x264param.i_keyint_max = encoder->x264param.i_keyint_min = 1; + + /* Enforce level limits if they were in the caps */ + if (encoder->peer_level_idc != -1) { + gint i; + const x264_level_t *peer_level = NULL; + + for (i = 0; (*encoder->vtable->x264_levels)[i].level_idc; i++) { + if (encoder->peer_level_idc == + (*encoder->vtable->x264_levels)[i].level_idc) { + int mb_width = (info->width + 15) / 16; + int mb_height = (info->height + 15) / 16; + int mbs = mb_width * mb_height; + + if ((*encoder->vtable->x264_levels)[i].frame_size < mbs || + (*encoder->vtable->x264_levels)[i].frame_size * 8 < + mb_width * mb_width + || (*encoder->vtable->x264_levels)[i].frame_size * 8 < + mb_height * mb_height) { + GST_WARNING_OBJECT (encoder, + "Frame size larger than level %d allows", + encoder->peer_level_idc); + break; + } + + if (info->fps_d && (*encoder->vtable->x264_levels)[i].mbps + < (gint64) mbs * info->fps_n / info->fps_d) { + GST_WARNING_OBJECT (encoder, + "Macroblock rate higher than level %d allows", + encoder->peer_level_idc); + break; + } + + peer_level = &(*encoder->vtable->x264_levels)[i]; + break; + } + } + + if (!peer_level) + goto unlock_and_return; + + encoder->x264param.i_level_idc = peer_level->level_idc; + + encoder->x264param.rc.i_bitrate = MIN (encoder->x264param.rc.i_bitrate, + peer_level->bitrate); + encoder->x264param.rc.i_vbv_max_bitrate = + MIN (encoder->x264param.rc.i_vbv_max_bitrate, peer_level->bitrate); + encoder->x264param.rc.i_vbv_buffer_size = + MIN (encoder->x264param.rc.i_vbv_buffer_size, peer_level->cpb); + encoder->x264param.analyse.i_mv_range = + MIN (encoder->x264param.analyse.i_mv_range, peer_level->mv_range); + + if (peer_level->frame_only) { + encoder->x264param.b_interlaced = FALSE; + encoder->x264param.b_fake_interlaced = FALSE; + } + } + + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + encoder->x264param.b_interlaced = TRUE; + if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) { + encoder->x264param.b_pic_struct = TRUE; + } + if (GST_VIDEO_INFO_FIELD_ORDER (info) == + GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST) { + encoder->x264param.b_tff = TRUE; + } else { + encoder->x264param.b_tff = FALSE; + } + } else { + encoder->x264param.b_interlaced = FALSE; + } + + /* Set 3D frame packing */ + if (encoder->frame_packing != GST_VIDEO_MULTIVIEW_MODE_NONE) + encoder->x264param.i_frame_packing = encoder->frame_packing; + else + encoder->x264param.i_frame_packing = + gst_x264_enc_mview_mode_to_frame_packing (GST_VIDEO_INFO_MULTIVIEW_MODE + (info)); + + GST_DEBUG_OBJECT (encoder, "Stereo frame packing = %d", + encoder->x264param.i_frame_packing); + + encoder->reconfig = FALSE; + + GST_OBJECT_UNLOCK (encoder); + + encoder->x264enc = encoder->vtable->x264_encoder_open (&encoder->x264param); + if (!encoder->x264enc) { + GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, + ("Can not initialize x264 encoder."), (NULL)); + return FALSE; + } + + return TRUE; + +unlock_and_return: + GST_OBJECT_UNLOCK (encoder); + return FALSE; +} + +/* gst_x264_enc_close_encoder + * @encoder: Encoder which should close. + * + * Close x264 encoder. + */ +static void +gst_x264_enc_close_encoder (GstX264Enc * encoder) +{ + if (encoder->x264enc != NULL) { + encoder->vtable->x264_encoder_close (encoder->x264enc); + encoder->x264enc = NULL; + } + encoder->vtable = NULL; +} + +static gboolean +gst_x264_enc_set_profile_and_level (GstX264Enc * encoder, GstCaps * caps) +{ + x264_nal_t *nal; + int i_nal; + int header_return; + gint sps_ni = 0; + guint8 *sps; + GstStructure *s; + const gchar *profile; + GstCaps *allowed_caps; + GstStructure *s2; + const gchar *allowed_profile; + + header_return = + encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal); + if (header_return < 0) { + GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."), + ("x264_encoder_headers return code=%d", header_return)); + return FALSE; + } + + /* old x264 returns SEI, SPS and PPS, newer one has SEI last */ + if (i_nal == 3 && nal[sps_ni].i_type != 7) + sps_ni = 1; + + sps = nal[sps_ni].p_payload + 4; + /* skip NAL unit type */ + sps++; + + gst_codec_utils_h264_caps_set_level_and_profile (caps, sps, 3); + + /* Constrained baseline is a strict subset of baseline. If downstream + * wanted baseline and we produced constrained baseline, we can just + * set the profile to baseline in the caps to make negotiation happy. + * Same goes for baseline as subset of main profile and main as a subset + * of high profile. + */ + s = gst_caps_get_structure (caps, 0); + profile = gst_structure_get_string (s, "profile"); + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); + + if (allowed_caps == NULL) + goto no_peer; + + if (!gst_caps_can_intersect (allowed_caps, caps)) { + allowed_caps = gst_caps_make_writable (allowed_caps); + allowed_caps = gst_caps_truncate (allowed_caps); + s2 = gst_caps_get_structure (allowed_caps, 0); + gst_structure_fixate_field_string (s2, "profile", profile); + allowed_profile = gst_structure_get_string (s2, "profile"); + if (!strcmp (allowed_profile, "high")) { + if (!strcmp (profile, "constrained-baseline") + || !strcmp (profile, "baseline") || !strcmp (profile, "main")) { + gst_structure_set (s, "profile", G_TYPE_STRING, "high", NULL); + GST_INFO_OBJECT (encoder, "downstream requested high profile, but " + "encoder will now output %s profile (which is a subset), due " + "to how it's been configured", profile); + } + } else if (!strcmp (allowed_profile, "main")) { + if (!strcmp (profile, "constrained-baseline") + || !strcmp (profile, "baseline")) { + gst_structure_set (s, "profile", G_TYPE_STRING, "main", NULL); + GST_INFO_OBJECT (encoder, "downstream requested main profile, but " + "encoder will now output %s profile (which is a subset), due " + "to how it's been configured", profile); + } + } else if (!strcmp (allowed_profile, "baseline")) { + if (!strcmp (profile, "constrained-baseline")) + gst_structure_set (s, "profile", G_TYPE_STRING, "baseline", NULL); + } + } + gst_caps_unref (allowed_caps); + +no_peer: + + return TRUE; +} + +/* + * Returns: Buffer with the stream headers. + */ +static GstBuffer * +gst_x264_enc_header_buf (GstX264Enc * encoder) +{ + GstBuffer *buf; + x264_nal_t *nal; + int i_nal; + int header_return; + int i_size; + int nal_size; + guint8 *buffer, *sps; + gulong buffer_size; + gint sei_ni = 2, sps_ni = 0, pps_ni = 1; + + if (G_UNLIKELY (encoder->x264enc == NULL)) + return NULL; + + /* Create avcC header. */ + + header_return = + encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal); + if (header_return < 0) { + GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."), + ("x264_encoder_headers return code=%d", header_return)); + return NULL; + } + + /* old x264 returns SEI, SPS and PPS, newer one has SEI last */ + if (i_nal == 3 && nal[sps_ni].i_type != 7) { + sei_ni = 0; + sps_ni = 1; + pps_ni = 2; + } + + /* x264 is expected to return an SEI (some identification info), + * and SPS and PPS */ + if (i_nal != 3 || nal[sps_ni].i_type != 7 || nal[pps_ni].i_type != 8 || + nal[sps_ni].i_payload < 4 || nal[pps_ni].i_payload < 1) { + GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, (NULL), + ("Unexpected x264 header.")); + return NULL; + } + + GST_MEMDUMP ("SEI", nal[sei_ni].p_payload, nal[sei_ni].i_payload); + GST_MEMDUMP ("SPS", nal[sps_ni].p_payload, nal[sps_ni].i_payload); + GST_MEMDUMP ("PPS", nal[pps_ni].p_payload, nal[pps_ni].i_payload); + + /* nal payloads with emulation_prevention_three_byte, and some header data */ + buffer_size = (nal[sps_ni].i_payload + nal[pps_ni].i_payload) * 4 + 100; + buffer = g_malloc (buffer_size); + + sps = nal[sps_ni].p_payload + 4; + /* skip NAL unit type */ + sps++; + + buffer[0] = 1; /* AVC Decoder Configuration Record ver. 1 */ + buffer[1] = sps[0]; /* profile_idc */ + buffer[2] = sps[1]; /* profile_compability */ + buffer[3] = sps[2]; /* level_idc */ + buffer[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */ + + i_size = 5; + + buffer[i_size++] = 0xe0 | 1; /* number of SPSs */ + + nal_size = nal[sps_ni].i_payload - 4; + memcpy (buffer + i_size + 2, nal[sps_ni].p_payload + 4, nal_size); + + GST_WRITE_UINT16_BE (buffer + i_size, nal_size); + i_size += nal_size + 2; + + buffer[i_size++] = 1; /* number of PPSs */ + + nal_size = nal[pps_ni].i_payload - 4; + memcpy (buffer + i_size + 2, nal[pps_ni].p_payload + 4, nal_size); + + GST_WRITE_UINT16_BE (buffer + i_size, nal_size); + i_size += nal_size + 2; + + buf = gst_buffer_new_and_alloc (i_size); + gst_buffer_fill (buf, 0, buffer, i_size); + + GST_MEMDUMP ("header", buffer, i_size); + g_free (buffer); + + return buf; +} + +/* gst_x264_enc_set_src_caps + * Returns: TRUE on success. + */ +static gboolean +gst_x264_enc_set_src_caps (GstX264Enc * encoder, GstCaps * caps) +{ + GstCaps *outcaps; + GstStructure *structure; + GstVideoCodecState *state; + GstTagList *tags; + guint bitrate = + gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager, + encoder->input_state ? &encoder->input_state->info : NULL); + + outcaps = gst_caps_new_empty_simple ("video/x-h264"); + structure = gst_caps_get_structure (outcaps, 0); + + if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY) { + if (encoder->byte_stream) { + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM; + } else { + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC; + } + } + if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_AVC) { + GstBuffer *buf = gst_x264_enc_header_buf (encoder); + if (buf != NULL) { + gst_caps_set_simple (outcaps, "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + gst_structure_set (structure, "stream-format", G_TYPE_STRING, "avc", NULL); + } else { + gst_structure_set (structure, "stream-format", G_TYPE_STRING, "byte-stream", + NULL); + } + gst_structure_set (structure, "alignment", G_TYPE_STRING, "au", NULL); + + if (!gst_x264_enc_set_profile_and_level (encoder, outcaps)) { + gst_caps_unref (outcaps); + return FALSE; + } + + state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + outcaps, encoder->input_state); + GST_DEBUG_OBJECT (encoder, "output caps: %" GST_PTR_FORMAT, state->caps); + + /* If set, local frame packing setting overrides any upstream config */ + switch (encoder->frame_packing) { + case 0: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD; + break; + case 1: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED; + break; + case 2: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED; + break; + case 3: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE; + break; + case 4: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM; + break; + case 5: + GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) = + GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME; + break; + default: + break; + } + + gst_video_codec_state_unref (state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "x264", + GST_TAG_ENCODER_VERSION, X264_BUILD, + GST_TAG_MAXIMUM_BITRATE, bitrate * 1024, + GST_TAG_NOMINAL_BITRATE, bitrate * 1024, NULL); + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), tags, + GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static void +gst_x264_enc_set_latency (GstX264Enc * encoder) +{ + GstVideoInfo *info = &encoder->input_state->info; + gint max_delayed_frames; + GstClockTime latency; + + max_delayed_frames = + encoder->vtable->x264_encoder_maximum_delayed_frames (encoder->x264enc); + + if (info->fps_n) { + latency = gst_util_uint64_scale_ceil (GST_SECOND * info->fps_d, + max_delayed_frames, info->fps_n); + } else { + /* FIXME: Assume 25fps. This is better than reporting no latency at + * all and then later failing in live pipelines + */ + latency = gst_util_uint64_scale_ceil (GST_SECOND * 1, + max_delayed_frames, 25); + } + + GST_INFO_OBJECT (encoder, + "Updating latency to %" GST_TIME_FORMAT " (%d frames)", + GST_TIME_ARGS (latency), max_delayed_frames); + + gst_video_encoder_set_latency (GST_VIDEO_ENCODER (encoder), latency, latency); +} + +static gboolean +gst_x264_enc_set_format (GstVideoEncoder * video_enc, + GstVideoCodecState * state) +{ + GstX264Enc *encoder = GST_X264_ENC (video_enc); + GstVideoInfo *info = &state->info; + GstCaps *template_caps; + GstCaps *allowed_caps = NULL; + + /* If the encoder is initialized, do not reinitialize it again if not + * necessary */ + if (encoder->x264enc) { + GstVideoInfo *old = &encoder->input_state->info; + + if (info->finfo->format == old->finfo->format + && info->width == old->width && info->height == old->height + && info->fps_n == old->fps_n && info->fps_d == old->fps_d + && info->par_n == old->par_n && info->par_d == old->par_d) { + gst_video_codec_state_unref (encoder->input_state); + encoder->input_state = gst_video_codec_state_ref (state); + return TRUE; + } + + /* clear out pending frames */ + gst_x264_enc_flush_frames (encoder, TRUE); + + encoder->sps_id++; + } + + if (encoder->input_state) + gst_video_codec_state_unref (encoder->input_state); + encoder->input_state = gst_video_codec_state_ref (state); + + encoder->peer_profile = NULL; + encoder->peer_intra_profile = FALSE; + encoder->peer_level_idc = -1; + + template_caps = gst_static_pad_template_get_caps (&src_factory); + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); + + /* Output byte-stream if downstream has ANY caps, it's what people expect, + * and it makes more sense too */ + if (allowed_caps == template_caps) { + GST_INFO_OBJECT (encoder, + "downstream has ANY caps, outputting byte-stream"); + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM; + g_string_append_printf (encoder->option_string, ":annexb=1"); + gst_caps_unref (allowed_caps); + } else if (allowed_caps) { + GstStructure *s; + const gchar *profile; + const gchar *level; + const gchar *stream_format; + + if (gst_caps_is_empty (allowed_caps)) { + gst_caps_unref (allowed_caps); + gst_caps_unref (template_caps); + return FALSE; + } + + allowed_caps = gst_caps_make_writable (allowed_caps); + allowed_caps = gst_caps_fixate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); + + profile = gst_structure_get_string (s, "profile"); + if (profile) { + /* FIXME - if libx264 ever adds support for FMO, ASO or redundant slices + * make sure constrained profile has a separate case which disables + * those */ + if (g_str_has_suffix (profile, "-intra")) { + encoder->peer_intra_profile = TRUE; + } + if (!strcmp (profile, "constrained-baseline") || + !strcmp (profile, "baseline")) { + encoder->peer_profile = "baseline"; + } else if (g_str_has_prefix (profile, "high-10")) { + encoder->peer_profile = "high10"; + } else if (g_str_has_prefix (profile, "high-4:2:2")) { + encoder->peer_profile = "high422"; + } else if (g_str_has_prefix (profile, "high-4:4:4")) { + encoder->peer_profile = "high444"; + } else if (g_str_has_prefix (profile, "high")) { + encoder->peer_profile = "high"; + } else if (!strcmp (profile, "main")) { + encoder->peer_profile = "main"; + } else { + g_assert_not_reached (); + } + } + + level = gst_structure_get_string (s, "level"); + if (level) { + encoder->peer_level_idc = gst_codec_utils_h264_get_level_idc (level); + } + + stream_format = gst_structure_get_string (s, "stream-format"); + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY; + if (stream_format) { + if (!strcmp (stream_format, "avc")) { + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC; + g_string_append_printf (encoder->option_string, ":annexb=0"); + } else if (!strcmp (stream_format, "byte-stream")) { + encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM; + g_string_append_printf (encoder->option_string, ":annexb=1"); + } else { + /* means we have both in caps and _FROM_PROPERTY should be the option */ + } + } + + gst_caps_unref (allowed_caps); + } + + gst_caps_unref (template_caps); + + if (!gst_x264_enc_init_encoder (encoder)) + return FALSE; + + if (!gst_x264_enc_set_src_caps (encoder, state->caps)) { + gst_x264_enc_close_encoder (encoder); + return FALSE; + } + + gst_x264_enc_set_latency (encoder); + + return TRUE; +} + +static GstFlowReturn +gst_x264_enc_finish (GstVideoEncoder * encoder) +{ + gst_x264_enc_flush_frames (GST_X264_ENC (encoder), TRUE); + return GST_FLOW_OK; +} + +static gboolean +gst_x264_enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstX264Enc *self = GST_X264_ENC (encoder); + GstVideoInfo *info; + guint num_buffers; + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + if (!self->input_state) + return FALSE; + + if (self->vtable == NULL) + return FALSE; + + info = &self->input_state->info; + num_buffers = + self->vtable->x264_encoder_maximum_delayed_frames (self->x264enc) + 1; + + gst_query_add_allocation_pool (query, NULL, info->size, num_buffers, 0); + + return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (encoder, + query); +} + +static void +gst_x264_enc_add_cc (GstBuffer * buffer, x264_picture_t * pic_in) +{ + GstVideoCaptionMeta *cc_meta; + gpointer iter = NULL; + + while ((cc_meta = + (GstVideoCaptionMeta *) gst_buffer_iterate_meta_filtered (buffer, + &iter, GST_VIDEO_CAPTION_META_API_TYPE))) { + guint i = pic_in->extra_sei.num_payloads; + + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + continue; + + pic_in->extra_sei.num_payloads += 1; + + if (!pic_in->extra_sei.payloads) + pic_in->extra_sei.payloads = g_new0 (x264_sei_payload_t, 1); + else + pic_in->extra_sei.payloads = + g_renew (x264_sei_payload_t, pic_in->extra_sei.payloads, + pic_in->extra_sei.num_payloads); + + pic_in->extra_sei.sei_free = g_free; + + pic_in->extra_sei.payloads[i].payload_size = cc_meta->size + 11; + pic_in->extra_sei.payloads[i].payload = + g_malloc0 (pic_in->extra_sei.payloads[i].payload_size); + pic_in->extra_sei.payloads[i].payload_type = 4; /* Registered user data */ + memcpy (pic_in->extra_sei.payloads[i].payload + 10, cc_meta->data, + cc_meta->size); + pic_in->extra_sei.payloads[i].payload[0] = 181; /* 8-bits itu_t_t35_country_code */ + pic_in->extra_sei.payloads[i].payload[1] = 0; /* 16-bits itu_t_t35_provider_code */ + pic_in->extra_sei.payloads[i].payload[2] = 49; + pic_in->extra_sei.payloads[i].payload[3] = 'G'; /* 32-bits ATSC_user_identifier */ + pic_in->extra_sei.payloads[i].payload[4] = 'A'; + pic_in->extra_sei.payloads[i].payload[5] = '9'; + pic_in->extra_sei.payloads[i].payload[6] = '4'; + pic_in->extra_sei.payloads[i].payload[7] = 3; /* 8-bits ATSC1_data_user_data_type_code */ + /* 8-bits: + * 1 bit process_em_data_flag (0) + * 1 bit process_cc_data_flag (1) + * 1 bit additional_data_flag (0) + * 5-bits cc_count + */ + pic_in->extra_sei.payloads[i].payload[8] = + ((cc_meta->size / 3) & 0x1f) | 0x40; + pic_in->extra_sei.payloads[i].payload[9] = 255; /* 8 bits em_data, unused */ + pic_in->extra_sei.payloads[i].payload[cc_meta->size + 10] = 255; /* 8 marker bits */ + } +} + +/* chain function + * this function does the actual processing + */ +static GstFlowReturn +gst_x264_enc_handle_frame (GstVideoEncoder * video_enc, + GstVideoCodecFrame * frame) +{ + GstX264Enc *encoder = GST_X264_ENC (video_enc); + GstVideoInfo *info = &encoder->input_state->info; + GstFlowReturn ret; + x264_picture_t pic_in; + gint i_nal, i; + FrameData *fdata; + gint nplanes = encoder->x264_nplanes; + + if (G_UNLIKELY (encoder->x264enc == NULL)) + goto not_inited; + + /* create x264_picture_t from the buffer */ + /* mostly taken from mplayer (file ve_x264.c) */ + + /* set up input picture */ + memset (&pic_in, 0, sizeof (pic_in)); + + fdata = gst_x264_enc_queue_frame (encoder, frame, info); + if (!fdata) + goto invalid_frame; + + pic_in.img.i_csp = encoder->x264param.i_csp; + pic_in.img.i_plane = nplanes; + for (i = 0; i < nplanes; i++) { + pic_in.img.plane[i] = GST_VIDEO_FRAME_COMP_DATA (&fdata->vframe, i); + pic_in.img.i_stride[i] = GST_VIDEO_FRAME_COMP_STRIDE (&fdata->vframe, i); + } + + pic_in.i_type = X264_TYPE_AUTO; + pic_in.i_pts = frame->pts; + pic_in.opaque = GINT_TO_POINTER (frame->system_frame_number); + + if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) { + if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_INTERLACED) == 0) { + pic_in.i_pic_struct = PIC_STRUCT_PROGRESSIVE; + } else if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_RFF) != 0) { + if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) { + pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM_TOP; + } else { + pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP_BOTTOM; + } + } else { + if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) { + pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM; + } else { + pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP; + } + } + } + + gst_x264_enc_add_cc (frame->input_buffer, &pic_in); + + ret = gst_x264_enc_encode_frame (encoder, &pic_in, frame, &i_nal, TRUE); + + /* input buffer is released later on */ + return ret; + +/* ERRORS */ +not_inited: + { + GST_WARNING_OBJECT (encoder, "Got buffer before set_caps was called"); + return GST_FLOW_NOT_NEGOTIATED; + } +invalid_frame: + { + GST_ERROR_OBJECT (encoder, "Failed to map frame"); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_x264_enc_encode_frame (GstX264Enc * encoder, x264_picture_t * pic_in, + GstVideoCodecFrame * input_frame, int *i_nal, gboolean send) +{ + GstVideoCodecFrame *frame = NULL; + GstBuffer *out_buf = NULL; + x264_picture_t pic_out; + x264_nal_t *nal; + int i_size; + int encoder_return; + GstFlowReturn ret = GST_FLOW_OK; + guint8 *data; + gboolean update_latency = FALSE; + + if (G_UNLIKELY (encoder->x264enc == NULL)) { + if (input_frame) + gst_video_codec_frame_unref (input_frame); + return GST_FLOW_NOT_NEGOTIATED; + } + + GST_OBJECT_LOCK (encoder); + if (encoder->reconfig) { + encoder->reconfig = FALSE; + if (encoder->vtable->x264_encoder_reconfig (encoder->x264enc, + &encoder->x264param) < 0) + GST_WARNING_OBJECT (encoder, "Could not reconfigure"); + update_latency = TRUE; + } + + if (pic_in && input_frame) { + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (input_frame)) { + GST_INFO_OBJECT (encoder, "Forcing key frame"); + if (encoder->intra_refresh) + encoder->vtable->x264_encoder_intra_refresh (encoder->x264enc); + else + pic_in->i_type = X264_TYPE_IDR; + } + } + GST_OBJECT_UNLOCK (encoder); + + if (G_UNLIKELY (update_latency)) + gst_x264_enc_set_latency (encoder); + + encoder_return = encoder->vtable->x264_encoder_encode (encoder->x264enc, + &nal, i_nal, pic_in, &pic_out); + + if (encoder_return < 0) { + GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 frame failed."), + ("x264_encoder_encode return code=%d", encoder_return)); + ret = GST_FLOW_ERROR; + /* Make sure we finish this frame */ + frame = input_frame; + goto out; + } + + /* Input frame is now queued */ + if (input_frame) + gst_video_codec_frame_unref (input_frame); + + if (!*i_nal) { + ret = GST_FLOW_OK; + goto out; + } + + i_size = encoder_return; + data = nal[0].p_payload; + + frame = gst_video_encoder_get_frame (GST_VIDEO_ENCODER (encoder), + GPOINTER_TO_INT (pic_out.opaque)); + g_assert (frame || !send); + + if (!send || !frame) { + ret = GST_FLOW_OK; + goto out; + } + + out_buf = gst_buffer_new_allocate (NULL, i_size, NULL); + gst_buffer_fill (out_buf, 0, data, i_size); + frame->output_buffer = out_buf; + + GST_LOG_OBJECT (encoder, + "output: dts %" G_GINT64_FORMAT " pts %" G_GINT64_FORMAT, + (gint64) pic_out.i_dts, (gint64) pic_out.i_pts); + + /* we want to know if x264 is messing around with this */ + g_assert (frame->pts == pic_out.i_pts); + + frame->dts = pic_out.i_dts; + frame->pts = pic_out.i_pts; + + if (pic_out.b_keyframe) { + GST_DEBUG_OBJECT (encoder, "Output keyframe"); + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + } + +out: + if (frame) { + gst_x264_enc_dequeue_frame (encoder, frame); + ret = gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (encoder), frame); + } + + return ret; +} + +static void +gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send) +{ + GstFlowReturn flow_ret; + gint i_nal; + + /* first send the remaining frames */ + if (encoder->x264enc) + do { + flow_ret = gst_x264_enc_encode_frame (encoder, NULL, NULL, &i_nal, send); + } while (flow_ret == GST_FLOW_OK + && encoder->vtable->x264_encoder_delayed_frames (encoder->x264enc) > 0); +} + +static void +gst_x264_enc_reconfig (GstX264Enc * encoder) +{ + guint bitrate; + + if (!encoder->vtable) + return; + + bitrate = + gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager, + encoder->input_state ? &encoder->input_state->info : NULL); + switch (encoder->pass) { + case GST_X264_ENC_PASS_QUAL: + encoder->x264param.rc.f_rf_constant = encoder->quantizer; + encoder->x264param.rc.i_vbv_max_bitrate = bitrate; + encoder->x264param.rc.i_vbv_buffer_size + = encoder->x264param.rc.i_vbv_max_bitrate + * encoder->vbv_buf_capacity / 1000; + break; + case GST_X264_ENC_PASS_CBR: + case GST_X264_ENC_PASS_PASS1: + case GST_X264_ENC_PASS_PASS2: + case GST_X264_ENC_PASS_PASS3: + default: + encoder->x264param.rc.i_bitrate = bitrate; + encoder->x264param.rc.i_vbv_max_bitrate = bitrate; + encoder->x264param.rc.i_vbv_buffer_size + = encoder->x264param.rc.i_vbv_max_bitrate + * encoder->vbv_buf_capacity / 1000; + break; + } + + encoder->reconfig = TRUE; +} + +static void +gst_x264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstX264Enc *encoder; + GstState state; + + const gchar *partitions = NULL; + + encoder = GST_X264_ENC (object); + + GST_OBJECT_LOCK (encoder); + /* state at least matters for sps, bytestream, pass, + * and so by extension ... */ + + state = GST_STATE (encoder); + if ((state != GST_STATE_READY && state != GST_STATE_NULL) && + !(pspec->flags & GST_PARAM_MUTABLE_PLAYING)) + goto wrong_state; + + switch (prop_id) { + case ARG_PASS: + encoder->pass = g_value_get_enum (value); + break; + case ARG_QUANTIZER: + encoder->quantizer = g_value_get_uint (value); + gst_x264_enc_reconfig (encoder); + break; + case ARG_BITRATE: + gst_encoder_bitrate_profile_manager_set_bitrate (encoder->bitrate_manager, + g_value_get_uint (value)); + gst_x264_enc_reconfig (encoder); + break; + case ARG_VBV_BUF_CAPACITY: + encoder->vbv_buf_capacity = g_value_get_uint (value); + gst_x264_enc_reconfig (encoder); + break; + case ARG_SPEED_PRESET: + encoder->speed_preset = g_value_get_enum (value); + break; + case ARG_PSY_TUNE: + encoder->psy_tune = g_value_get_enum (value); + break; + case ARG_TUNE: + encoder->tune = g_value_get_flags (value); + break; + case ARG_OPTION_STRING: + g_string_assign (encoder->option_string_prop, g_value_get_string (value)); + break; + case ARG_THREADS: + encoder->threads = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":threads=%d", + encoder->threads); + break; + case ARG_SLICED_THREADS: + encoder->sliced_threads = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":sliced-threads=%d", + encoder->sliced_threads); + break; + case ARG_SYNC_LOOKAHEAD: + encoder->sync_lookahead = g_value_get_int (value); + g_string_append_printf (encoder->option_string, ":sync-lookahead=%d", + encoder->sync_lookahead); + break; + case ARG_MULTIPASS_CACHE_FILE: + g_free (encoder->mp_cache_file); + encoder->mp_cache_file = g_value_dup_string (value); + g_string_append_printf (encoder->option_string, ":stats=%s", + encoder->mp_cache_file); + break; + case ARG_BYTE_STREAM: + encoder->byte_stream = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":annexb=%d", + encoder->byte_stream); + break; + case ARG_INTRA_REFRESH: + encoder->intra_refresh = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":intra-refresh=%d", + encoder->intra_refresh); + break; + case ARG_ME: + encoder->me = g_value_get_enum (value); + g_string_append_printf (encoder->option_string, ":me=%s", + x264_motion_est_names[encoder->me]); + break; + case ARG_SUBME: + encoder->subme = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":subme=%d", + encoder->subme); + break; + case ARG_ANALYSE: + encoder->analyse = g_value_get_flags (value); + partitions = gst_x264_enc_build_partitions (encoder->analyse); + if (partitions) { + g_string_append_printf (encoder->option_string, ":partitions=%s", + partitions); + g_free ((gpointer) partitions); + } + break; + case ARG_DCT8x8: + encoder->dct8x8 = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":8x8dct=%d", + encoder->dct8x8); + break; + case ARG_REF: + encoder->ref = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":ref=%d", encoder->ref); + break; + case ARG_BFRAMES: + encoder->bframes = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":bframes=%d", + encoder->bframes); + break; + case ARG_B_ADAPT: + encoder->b_adapt = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":b-adapt=%d", + encoder->b_adapt); + break; + case ARG_B_PYRAMID: + encoder->b_pyramid = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":b-pyramid=%s", + x264_b_pyramid_names[encoder->b_pyramid]); + break; + case ARG_WEIGHTB: + encoder->weightb = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":weightb=%d", + encoder->weightb); + break; + case ARG_SPS_ID: + encoder->sps_id = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":sps-id=%d", + encoder->sps_id); + break; + case ARG_AU_NALU: + encoder->au_nalu = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":aud=%d", + encoder->au_nalu); + break; + case ARG_TRELLIS: + encoder->trellis = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":trellis=%d", + encoder->trellis); + break; + case ARG_KEYINT_MAX: + encoder->keyint_max = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":keyint=%d", + encoder->keyint_max); + break; + case ARG_CABAC: + encoder->cabac = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":cabac=%d", + encoder->cabac); + break; + case ARG_QP_MIN: + encoder->qp_min = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":qpmin=%d", + encoder->qp_min); + break; + case ARG_QP_MAX: + encoder->qp_max = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":qpmax=%d", + encoder->qp_max); + break; + case ARG_QP_STEP: + encoder->qp_step = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":qpstep=%d", + encoder->qp_step); + break; + case ARG_IP_FACTOR: + encoder->ip_factor = g_value_get_float (value); + g_string_append_printf (encoder->option_string, ":ip-factor=%f", + encoder->ip_factor); + break; + case ARG_PB_FACTOR: + encoder->pb_factor = g_value_get_float (value); + g_string_append_printf (encoder->option_string, ":pb-factor=%f", + encoder->pb_factor); + break; + case ARG_RC_MB_TREE: + encoder->mb_tree = g_value_get_boolean (value); + g_string_append_printf (encoder->option_string, ":mbtree=%d", + encoder->mb_tree); + break; + case ARG_RC_LOOKAHEAD: + encoder->rc_lookahead = g_value_get_int (value); + g_string_append_printf (encoder->option_string, ":rc-lookahead=%d", + encoder->rc_lookahead); + break; + case ARG_NR: + encoder->noise_reduction = g_value_get_uint (value); + g_string_append_printf (encoder->option_string, ":nr=%d", + encoder->noise_reduction); + break; + case ARG_INTERLACED: + encoder->interlaced = g_value_get_boolean (value); + break; + case ARG_FRAME_PACKING: + encoder->frame_packing = g_value_get_enum (value); + break; + case ARG_INSERT_VUI: + encoder->insert_vui = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (encoder); + return; + + /* ERROR */ +wrong_state: + { + GST_WARNING_OBJECT (encoder, "setting property in wrong state"); + GST_OBJECT_UNLOCK (encoder); + } +} + +static void +gst_x264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstX264Enc *encoder; + + encoder = GST_X264_ENC (object); + + GST_OBJECT_LOCK (encoder); + switch (prop_id) { + case ARG_THREADS: + g_value_set_uint (value, encoder->threads); + break; + case ARG_SLICED_THREADS: + g_value_set_boolean (value, encoder->sliced_threads); + break; + case ARG_SYNC_LOOKAHEAD: + g_value_set_int (value, encoder->sync_lookahead); + break; + case ARG_PASS: + g_value_set_enum (value, encoder->pass); + break; + case ARG_QUANTIZER: + g_value_set_uint (value, encoder->quantizer); + break; + case ARG_MULTIPASS_CACHE_FILE: + g_value_set_string (value, encoder->mp_cache_file); + break; + case ARG_BYTE_STREAM: + g_value_set_boolean (value, encoder->byte_stream); + break; + case ARG_BITRATE: + g_value_set_uint (value, + gst_encoder_bitrate_profile_manager_get_bitrate + (encoder->bitrate_manager, NULL)); + break; + case ARG_INTRA_REFRESH: + g_value_set_boolean (value, encoder->intra_refresh); + break; + case ARG_VBV_BUF_CAPACITY: + g_value_set_uint (value, encoder->vbv_buf_capacity); + break; + case ARG_ME: + g_value_set_enum (value, encoder->me); + break; + case ARG_SUBME: + g_value_set_uint (value, encoder->subme); + break; + case ARG_ANALYSE: + g_value_set_flags (value, encoder->analyse); + break; + case ARG_DCT8x8: + g_value_set_boolean (value, encoder->dct8x8); + break; + case ARG_REF: + g_value_set_uint (value, encoder->ref); + break; + case ARG_BFRAMES: + g_value_set_uint (value, encoder->bframes); + break; + case ARG_B_ADAPT: + g_value_set_boolean (value, encoder->b_adapt); + break; + case ARG_B_PYRAMID: + g_value_set_boolean (value, encoder->b_pyramid); + break; + case ARG_WEIGHTB: + g_value_set_boolean (value, encoder->weightb); + break; + case ARG_SPS_ID: + g_value_set_uint (value, encoder->sps_id); + break; + case ARG_AU_NALU: + g_value_set_boolean (value, encoder->au_nalu); + break; + case ARG_TRELLIS: + g_value_set_boolean (value, encoder->trellis); + break; + case ARG_KEYINT_MAX: + g_value_set_uint (value, encoder->keyint_max); + break; + case ARG_QP_MIN: + g_value_set_uint (value, encoder->qp_min); + break; + case ARG_QP_MAX: + g_value_set_uint (value, encoder->qp_max); + break; + case ARG_QP_STEP: + g_value_set_uint (value, encoder->qp_step); + break; + case ARG_CABAC: + g_value_set_boolean (value, encoder->cabac); + break; + case ARG_IP_FACTOR: + g_value_set_float (value, encoder->ip_factor); + break; + case ARG_PB_FACTOR: + g_value_set_float (value, encoder->pb_factor); + break; + case ARG_RC_MB_TREE: + g_value_set_boolean (value, encoder->mb_tree); + break; + case ARG_RC_LOOKAHEAD: + g_value_set_int (value, encoder->rc_lookahead); + break; + case ARG_NR: + g_value_set_uint (value, encoder->noise_reduction); + break; + case ARG_INTERLACED: + g_value_set_boolean (value, encoder->interlaced); + break; + case ARG_SPEED_PRESET: + g_value_set_enum (value, encoder->speed_preset); + break; + case ARG_PSY_TUNE: + g_value_set_enum (value, encoder->psy_tune); + break; + case ARG_TUNE: + g_value_set_flags (value, encoder->tune); + break; + case ARG_OPTION_STRING: + g_value_set_string (value, encoder->option_string_prop->str); + break; + case ARG_FRAME_PACKING: + g_value_set_enum (value, encoder->frame_packing); + break; + case ARG_INSERT_VUI: + g_value_set_boolean (value, encoder->insert_vui); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (encoder); +} + +static gboolean +x264_element_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (x264_enc_debug, "x264enc", 0, + "h264 encoding element"); + + GST_INFO ("linked against x264 build: %u", X264_BUILD); + + /* Initialize the static GstX264EncVTable which is overridden in load_x264() + * if needed. We can't initialize statically because these values are not + * constant on Windows. */ + default_vtable.module = NULL; +#if X264_BUILD < 153 + default_vtable.x264_bit_depth = &x264_bit_depth; +#endif + default_vtable.x264_chroma_format = &x264_chroma_format; + default_vtable.x264_encoder_close = x264_encoder_close; + default_vtable.x264_encoder_delayed_frames = x264_encoder_delayed_frames; + default_vtable.x264_encoder_encode = x264_encoder_encode; + default_vtable.x264_encoder_headers = x264_encoder_headers; + default_vtable.x264_encoder_intra_refresh = x264_encoder_intra_refresh; + default_vtable.x264_encoder_maximum_delayed_frames = + x264_encoder_maximum_delayed_frames; + default_vtable.x264_encoder_open = x264_encoder_open; + default_vtable.x264_encoder_reconfig = x264_encoder_reconfig; + default_vtable.x264_levels = &x264_levels; + default_vtable.x264_param_apply_fastfirstpass = + x264_param_apply_fastfirstpass; + default_vtable.x264_param_apply_profile = x264_param_apply_profile; + default_vtable.x264_param_default_preset = x264_param_default_preset; + default_vtable.x264_param_parse = x264_param_parse; + + if (!load_x264_libraries ()) + return FALSE; + + return gst_element_register (plugin, "x264enc", + GST_RANK_PRIMARY, GST_TYPE_X264_ENC); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (x264enc, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + x264, + "libx264-based H264 plugins", + plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/x264/gstx264enc.h b/ext/x264/gstx264enc.h new file mode 100644 index 0000000000..6cbfc5c3d0 --- /dev/null +++ b/ext/x264/gstx264enc.h @@ -0,0 +1,144 @@ +/* GStreamer H264 encoder plugin + * Copyright (C) 2005 Michal Benes + * Copyright (C) 2005 Josef Zlomek + * Copyright (C) 2016 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_X264_ENC_H__ +#define __GST_X264_ENC_H__ + +#include +#include +#include +#include "gstencoderbitrateprofilemanager.h" + +#ifdef HAVE_STDINT_H +#include +#endif + +/* The x264.h header says this isn't needed with MinGW, but sometimes the + * compiler is unable to correctly do the pointer indirection for us, which + * leads to a segfault when you try to dereference any const values provided + * by x264.dll. See: https://bugzilla.gnome.org/show_bug.cgi?id=779249 */ +#if defined(_WIN32) && !defined(X264_API_IMPORTS) +# define X264_API_IMPORTS +#endif +#include + +G_BEGIN_DECLS + +#define GST_TYPE_X264_ENC \ + (gst_x264_enc_get_type()) +#define GST_X264_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_X264_ENC,GstX264Enc)) +#define GST_X264_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_X264_ENC,GstX264EncClass)) +#define GST_IS_X264_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_X264_ENC)) +#define GST_IS_X264_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_X264_ENC)) + +typedef struct _GstX264Enc GstX264Enc; +typedef struct _GstX264EncClass GstX264EncClass; +typedef struct _GstX264EncVTable GstX264EncVTable; + +struct _GstX264Enc +{ + GstVideoEncoder element; + + /*< private >*/ + GstX264EncVTable *vtable; + x264_t *x264enc; + x264_param_t x264param; + gint current_byte_stream; + + /* List of frame/buffer mapping structs for + * pending frames */ + GList *pending_frames; + + /* properties */ + guint threads; + gboolean sliced_threads; + gint sync_lookahead; + gint pass; + guint quantizer; + gchar *mp_cache_file; + gboolean byte_stream; + guint bitrate; + gboolean intra_refresh; + gint me; + guint subme; + guint analyse; + gboolean dct8x8; + guint ref; + guint bframes; + gboolean b_adapt; + gboolean b_pyramid; + gboolean weightb; + guint sps_id; + gboolean au_nalu; + gboolean trellis; + guint vbv_buf_capacity; + guint keyint_max; + gboolean cabac; + gfloat ip_factor; + gfloat pb_factor; + guint qp_min; + guint qp_max; + guint qp_step; + gboolean mb_tree; + gint rc_lookahead; + guint noise_reduction; + gboolean interlaced; + gint speed_preset; + gint psy_tune; + guint tune; + GString *tunings; + GString *option_string_prop; /* option-string property */ + GString *option_string; /* used by set prop */ + gint frame_packing; + gboolean insert_vui; + + /* input description */ + GstVideoCodecState *input_state; + + /* configuration changed while playing */ + gboolean reconfig; + + /* from the downstream caps */ + const gchar *peer_profile; + gboolean peer_intra_profile; + gint peer_level_idc; + + /* cached values to set x264_picture_t */ + gint x264_nplanes; + + GstEncoderBitrateProfileManager *bitrate_manager; +}; + +struct _GstX264EncClass +{ + GstVideoEncoderClass parent_class; +}; + +GType gst_x264_enc_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (x264enc); + +G_END_DECLS + +#endif /* __GST_X264_ENC_H__ */ diff --git a/ext/x264/meson.build b/ext/x264/meson.build new file mode 100644 index 0000000000..fdbfeebce5 --- /dev/null +++ b/ext/x264/meson.build @@ -0,0 +1,31 @@ +x264_sources = [ + 'gstx264enc.c', + 'gstencoderbitrateprofilemanager.c', +] + +x264_dep = dependency('x264', required : get_option('x264'), + fallback: ['x264', 'libx264_dep']) + +if x264_dep.found() + x264_libraries = get_option('x264_libraries') + x264_args = [] + if x264_libraries != '' + x264_args += ['-DHAVE_X264_ADDITIONAL_LIBRARIES="@0@"'.format(x264_libraries)] + extra_gmodule_dep = [gmodule_dep] + else + extra_gmodule_dep = [] + endif + + gstx264 = library('gstx264', + x264_sources, + c_args : ugly_args + x264_args, + include_directories : [configinc], + dependencies : [gstbase_dep, gstvideo_dep, gstpbutils_dep, x264_dep] + extra_gmodule_dep, + install : true, + install_dir : plugins_install_dir, + ) + pkgconfig.generate(gstx264, install_dir : plugins_pkgconfig_install_dir) + plugins += [gstx264] + + install_data(sources: 'GstX264Enc.prs', install_dir: presetdir) +endif diff --git a/gst-libs/gst/gettext.h b/gst-libs/gst/gettext.h new file mode 100644 index 0000000000..fc70ab7959 --- /dev/null +++ b/gst-libs/gst/gettext.h @@ -0,0 +1,69 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#ifdef ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/gst-libs/gst/glib-compat-private.h b/gst-libs/gst/glib-compat-private.h new file mode 100644 index 0000000000..8f37de205e --- /dev/null +++ b/gst-libs/gst/glib-compat-private.h @@ -0,0 +1,36 @@ +/* + * glib-compat.c + * Functions copied from glib 2.10 + * + * Copyright 2005 David Schleef + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GLIB_COMPAT_PRIVATE_H__ +#define __GLIB_COMPAT_PRIVATE_H__ + +#include + +G_BEGIN_DECLS + +/* copies */ + +/* adaptations */ + +G_END_DECLS + +#endif diff --git a/gst-libs/gst/gst-i18n-plugin.h b/gst-libs/gst/gst-i18n-plugin.h new file mode 100644 index 0000000000..4d92b907ed --- /dev/null +++ b/gst-libs/gst/gst-i18n-plugin.h @@ -0,0 +1,37 @@ +/* GStreamer + * Copyright (C) 2004 Thomas Vander Stichele + * + * gst-i18n-plugins.h: internationalization macros for the GStreamer plugins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_I18N_PLUGIN_H__ +#define __GST_I18N_PLUGIN_H__ + +#include /* some people need it and some people don't */ +#include "gettext.h" /* included with gettext distribution and copied */ + +#ifndef GETTEXT_PACKAGE +#error You must define GETTEXT_PACKAGE before including this header. +#endif + +/* we want to use shorthand _() for translating and N_() for marking */ +#define _(String) dgettext (GETTEXT_PACKAGE, String) +#define N_(String) gettext_noop (String) +/* FIXME: if we need it, we can add Q_ as well, like in glib */ + +#endif /* __GST_I18N_PLUGIN_H__ */ diff --git a/gst-plugins-ugly.doap b/gst-plugins-ugly.doap new file mode 100644 index 0000000000..3b25aeda22 --- /dev/null +++ b/gst-plugins-ugly.doap @@ -0,0 +1,875 @@ + + + GStreamer Ugly Plug-ins + gst-plugins-ugly + + 2005-09-06 + +a set of good-quality plug-ins with license or patent problems. + + +GStreamer Ugly Plug-ins is a set of plug-ins that have good quality and correct +functionality, but distributing them might pose problems. The license on either +the plug-ins or the supporting libraries might not be how we'd like. The code +might be widely known to present patent problems. + + + + + + C + + + + + + + + + + + + + 1.19.2 + master + + 2021-09-23 + + + + + + + 1.19.1 + master + + 2021-06-01 + + + + + + + 1.18.0 + master + + 2020-09-08 + + + + + + + 1.17.90 + master + + 2020-08-20 + + + + + + + 1.17.2 + master + + 2020-07-03 + + + + + + + 1.17.1 + master + + 2020-06-19 + + + + + + + 1.16.0 + master + + 2019-04-19 + + + + + + + 1.15.90 + master + + 2019-04-11 + + + + + + + 1.15.2 + master + + 2019-02-26 + + + + + + + 1.15.1 + master + + 2019-01-17 + + + + + + + 1.14.0 + master + + 2018-03-19 + + + + + + + 1.13.91 + master + + 2018-03-13 + + + + + + + 1.13.90 + master + + 2018-03-03 + + + + + + + 1.13.1 + master + + 2018-02-15 + + + + + + + 1.12.4 + 1.12 + + 2017-12-07 + + + + + + + 1.12.3 + 1.12 + + 2017-09-18 + + + + + + + 1.12.2 + 1.12 + + 2017-07-14 + + + + + + + 1.12.1 + 1.12 + + 2017-06-20 + + + + + + + 1.12.0 + master + + 2017-05-04 + + + + + + + 1.11.91 + master + + 2017-04-27 + + + + + + + 1.11.90 + master + + 2017-04-07 + + + + + + + 1.11.2 + master + + 2017-02-24 + + + + + + + 1.11.1 + master + + 2017-01-12 + + + + + + + 1.10.0 + master + + 2016-11-01 + + + + + + + 1.9.90 + master + + 2016-09-30 + + + + + + + 1.9.2 + master + + 2016-09-01 + + + + + + + 1.9.1 + master + + 2016-06-06 + + + + + + + 1.8.0 + master + + 2016-03-24 + + + + + + + 1.7.91 + master + + 2016-03-15 + + + + + + + 1.7.90 + master + + 2016-03-01 + + + + + + + 1.7.2 + master + + 2016-02-19 + + + + + + + 1.7.1 + master + + 2015-12-24 + + + + + + + 1.6.2 + 1.6 + + 2015-12-14 + + + + + + + 1.6.1 + 1.6 + + 2015-10-30 + + + + + + + 1.6.0 + 1.6 + + 2015-09-25 + + + + + + + 1.5.91 + 1.5 + + 2015-09-18 + + + + + + + 1.5.90 + 1.5 + + 2015-08-19 + + + + + + + 1.5.2 + 1.5 + + 2015-06-24 + + + + + + + 1.5.1 + 1.5 + + 2015-06-07 + + + + + + + 1.4.0 + 1.4 + + 2014-07-19 + + + + + + + 1.3.91 + 1.3 + + 2014-07-11 + + + + + + + 1.3.90 + 1.3 + + 2014-06-28 + + + + + + + 1.3.3 + 1.3 + + 2014-06-22 + + + + + + + 1.3.2 + 1.3 + + 2014-05-21 + + + + + + + 1.3.1 + 1.3 + + 2014-05-03 + + + + + + + 1.2.0 + 1.2 + + 2013-09-24 + + + + + + + 1.1.90 + 1.1 + + 2013-09-19 + + + + + + + 1.1.4 + 1.1 + + 2013-08-28 + + + + + + + 1.1.3 + 1.1 + + 2013-07-29 + + + + + + + 1.1.2 + 1.1 + + 2013-07-11 + + + + + + + 1.1.1 + 1.1 + + 2013-06-05 + + + + + + + 1.0.2 + 1.0 + + 2012-10-24 + + + + + + + 1.0.1 + 1.0 + + 2012-10-07 + + + + + + + 1.0.0 + 1.0 + + 2012-09-24 + + + + + + + 0.11.99 + 0.11 + Stole Many a Mans Soul and Faith + 2012-09-17 + + + + + + + 0.11.94 + 0.11 + Rag Hummin' + 2012-09-14 + + + + + + + 0.11.93 + 0.11 + Rag Doll Physics + 2012-08-08 + + + + + + + 0.11.92 + 0.11 + Hey You + 2012-06-07 + + + + + + + 0.11.91 + 0.11 + I’ll grind his bones to make my bread! + 2012-05-13 + + + + + + + 0.11.90 + 0.11 + Is all that we see or seem but a dream within a dream? + 2012-04-12 + + + + + + + + 0.11.2 + 0.11 + Savior from Anger + 2012-03-22 + + + + + + + + 0.11.1 + 0.11 + Moonlapse Vertigo + 2012-02-16 + + + + + + + + 0.10.18 + 0.10 + Extra Life + 2011-05-10 + + + + + + + + 0.10.17 + 0.10 + Raised by Wolves + 2011-01-21 + + + + + + + + 0.10.16 + 0.10 + Because He Knows the Time is Short + 2010-09-02 + + + + + + + + 0.10.15 + 0.10 + Englishman in a Baseball Cap + 2010-05-30 + + + + + + + + 0.10.14 + 0.10 + Run Rabbit + 2010-03-06 + + + + + + + + 0.10.13 + 0.10 + Appointed Point + 2009-10-21 + + + + + + + + 0.10.12 + 0.10 + Moving Along The Highway + 2009-06-18 + + + + + + + + 0.10.11 + 0.10 + Their swords and their knives + 2009-03-20 + + + + + + + + 0.10.10 + 0.10 + Under the House + 2008-11-19 + + + + + + + + 0.10.9 + 0.10 + Back The Way It Was + 2008-08-26 + + + + + + + + 0.10.8 + 0.10 + And yet + 2008-05-21 + + + + + + + + 0.10.7 + 0.10 + I Cheated Time + 2008-01-20 + + + + + + + + 0.10.6 + 0.10 + The Sacrifice + 2007-06-19 + + + + + + + + 0.10.5 + 0.10 + She said + 2006-12-13 + + + + + + + + 0.10.4 + 0.10 + Metal Molly + 2006-08-14 + + + + + + + + 0.10.3 + 0.10 + Late Plane + 2006-03-31 + + + + + + + + 0.10.2 + 0.10 + Season to Taste + 2006-02-20 + + + + + + + + 0.10.1 + 0.10 + Peng + 2006-01-13 + + + + + + + + 0.10.0 + 0.10 + Brie + 2005-12-05 + + + + + + + + Wim Taymans + 0d93fde052812d51a05fd86de9bdbf674423daa2 + + + + diff --git a/gst/asfdemux/README b/gst/asfdemux/README new file mode 100644 index 0000000000..d864eb032f --- /dev/null +++ b/gst/asfdemux/README @@ -0,0 +1,88 @@ +ASF Demuxer Plugin +================== + +Overview +-------- + +This plugin is a demuxer for Microsoft's ASF Advanced Streaming Format +or ASF [1]. This demuxer only supports ASF v1.0 since the vast +majority of existing ASF files use that version. The specification +has been derived from a third party source [2] without reference to +the original. + +Design +------ + +The ASF format can carry any combination of audio, video or +'ASF_Command_Media' streams. For simplicity it is assumed that each +file can carry up to 16 audio streams and 16 video streams. These are +implemented as dynamic pads and appear as appropriate once the file +headers have been parsed. + + (-------------------------) + ! asfdemux ! + ! (video/raw0)--- + ! (video/raw1)--- + ! (video/raw... + --- src ! + ! (audio/raw0)--- + ! (audio/raw1)--- + ! (audio/raw... + ! ! + (-------------------------) + + +Known stream fourccs are: + +Type Tags MIME type +------------------------------------------ +H263 H263 I263 video/x-h263 +MJPEG MJPG image/jpeg +MPEG4 DIVX divx DX50 video/mpeg + XVID xvid mp4s + MP4S M4S2 m4s2 + 0x04000000 +MSMPEG4V1 MPG4 video/mpeg +MSMPEG4V2 MP42 video/mpeg +MSMPEG4V3 MP43 DIV3 video/mpeg +WMV1 WMV1 video/x-wmv, wmvversion = (int) 1 +WMV2 WMV2 video/x-wmv, wmvversion = (int) 2 +WMV3 WMV3 video/x-wmv, wmvversion = (int) 3 +WMA1 WMA1 audio/x-wma, wmaversion = (int) 1 +WMA2 WMA2 audio/x-wma, wmaversion = (int) 2 + audio/x-wma, wmaversion = (int) 3 + +These video stream headers is very similar to that used in the AVI +format as are the audio stream headers. In addition the content types +are basically the same also so, for compatibility with existing +plugins the src pads are set up as video/x-msvideo. This enables +compatibility with the ffmpeg plugin. + +The demuxing process begins with the loop function gst_asf_demux_loop +and parses the file in a recursive tree as follows: + + gst_asf_demux_loop() + +-> gst_asf_demux_process_object() <---- + +-> gst_asf_demux_process_stream() \ + |-> gst_asf_demux_process_file() | + |-> gst_asf_demux_process_header() --+ + |-> gst_asf_demux_process_data() + +-> gst_asf_demux_process_segment() + +-> gst_asf_demux_process_chunk() + +Todo +---- + +- Support for ASF v2.0 +- Support for command media streams + + + +References +---------- + +[1] Microsoft. ASF Specification - Windows Media Technologies. +http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx (v01.20.01e, September 2003) + +[2] divx at euro.ru. ASF format version 1.0, +reconstruction. http://avifile.sourceforge.net/asf-1.0.htm diff --git a/gst/asfdemux/asfheaders.c b/gst/asfdemux/asfheaders.c new file mode 100644 index 0000000000..b8e8a3cb1e --- /dev/null +++ b/gst/asfdemux/asfheaders.c @@ -0,0 +1,212 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include "asfheaders.h" + +const ASFGuidHash asf_payload_ext_guids[] = { + {ASF_PAYLOAD_EXTENSION_DURATION, "ASF_PAYLOAD_EXTENSION_DURATION", + {0xC6BD9450, 0x4907867F, 0x79C7A383, 0xAD33B721} + }, + {ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT, "ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT", + {0xD590DC20, 0x436C07BC, 0xBBF3f79C, 0xDCA4F1FB}}, + {ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO, + "ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO", + {0x1b1ee554, 0x4bc8f9ea, 0x6b371a82, 0xb8c4e474}}, + {ASF_PAYLOAD_EXTENSION_TIMING, "ASF_PAYLOAD_EXTENSION_TIMING", + {0XFD3CC02A, 0X4CFA06DB, 0X12721C80, 0XE44587D3}}, + {ASF_PAYLOAD_EXTENSION_UNDEFINED, "ASF_PAYLOAD_EXTENSION_UNDEFINED", + {0, 0, 0, 0} + } +}; + +const ASFGuidHash asf_correction_guids[] = { + {ASF_CORRECTION_ON, "ASF_CORRECTION_ON", + {0xBFC3CD50, 0x11CF618F, 0xAA00B28B, 0x20E2B400} + }, + {ASF_CORRECTION_OFF, "ASF_CORRECTION_OFF", + {0x20FB5700, 0x11CF5B55, 0x8000FDA8, 0x2B445C5F} + }, + /* CHECKME: where does this 49F1A440... GUID come from? (tpm) */ + {ASF_CORRECTION_OFF, "ASF_CORRECTION_OFF", + {0x49F1A440, 0x11D04ECE, 0xA000ACA3, 0xF64803C9} + }, + {ASF_CORRECTION_UNDEFINED, "ASF_CORRECTION_UNDEFINED", + {0, 0, 0, 0} + } +}; + +const ASFGuidHash asf_stream_guids[] = { + {ASF_STREAM_VIDEO, "ASF_STREAM_VIDEO", + {0xBC19EFC0, 0x11CF5B4D, 0x8000FDA8, 0x2B445C5F} + }, + {ASF_STREAM_AUDIO, "ASF_STREAM_AUDIO", + {0xF8699E40, 0x11CF5B4D, 0x8000FDA8, 0x2B445C5F} + }, + {ASF_STREAM_EXT_EMBED_HEADER, "ASF_STREAM_EXT_EMBED_HEADER", + {0X3AFB65E2, 0X40F247EF, 0XA9702CAC, 0X43D3710D}}, + {ASF_STREAM_UNDEFINED, "ASF_STREAM_UNDEFINED", + {0, 0, 0, 0} + } +}; + +const ASFGuidHash asf_ext_stream_guids[] = { + {ASF_EXT_STREAM_AUDIO, "ASF_EXT_STREAM_AUDIO", + {0X31178C9D, 0X452803E1, 0XF93D82B5, 0X03F522DB} + }, + {ASF_EXT_STREAM_UNDEFINED, "ASF_EXT_STREAM_UNDEFINED", + {0, 0, 0, 0} + } +}; + +const ASFGuidHash asf_object_guids[] = { + {ASF_OBJ_STREAM, "ASF_OBJ_STREAM", + {0xB7DC0791, 0x11CFA9B7, 0xC000E68E, 0x6553200C} + }, + {ASF_OBJ_DATA, "ASF_OBJ_DATA", + {0x75b22636, 0x11cf668e, 0xAA00D9a6, 0x6Cce6200} + }, + {ASF_OBJ_FILE, "ASF_OBJ_FILE", + {0x8CABDCA1, 0x11CFA947, 0xC000E48E, 0x6553200C} + }, + {ASF_OBJ_HEADER, "ASF_OBJ_HEADER", + {0x75B22630, 0x11CF668E, 0xAA00D9A6, 0x6CCE6200} + }, + {ASF_OBJ_CONCEAL_NONE, "ASF_OBJ_CONCEAL_NONE", + {0x20fb5700, 0x11cf5b55, 0x8000FDa8, 0x2B445C5f} + }, + {ASF_OBJ_COMMENT, "ASF_OBJ_COMMENT", + {0x75b22633, 0x11cf668e, 0xAA00D9a6, 0x6Cce6200} + }, + {ASF_OBJ_CODEC_COMMENT, "ASF_OBJ_CODEC_COMMENT", + {0x86D15240, 0x11D0311D, 0xA000A4A3, 0xF64803C9} + }, + {ASF_OBJ_CODEC_COMMENT1, "ASF_OBJ_CODEC_COMMENT1", + {0x86d15241, 0x11d0311d, 0xA000A4a3, 0xF64803c9} + }, + {ASF_OBJ_SIMPLE_INDEX, "ASF_OBJ_SIMPLE_INDEX", + {0x33000890, 0x11cfe5b1, 0xA000F489, 0xCB4903c9} + }, + {ASF_OBJ_INDEX, "ASF_OBJ_INDEX", + {0xd6e229d3, 0x11d135da, 0xa0003490, 0xbe4903c9} + }, + {ASF_OBJ_HEAD1, "ASF_OBJ_HEAD1", + {0x5fbf03b5, 0x11cfa92e, 0xC000E38e, 0x6553200c} + }, + {ASF_OBJ_HEAD2, "ASF_OBJ_HEAD2", + {0xabd3d211, 0x11cfa9ba, 0xC000E68e, 0x6553200c} + }, + {ASF_OBJ_PADDING, "ASF_OBJ_PADDING", + {0x1806D474, 0x4509CADF, 0xAB9ABAA4, 0xE8AA96CB} + }, + {ASF_OBJ_BITRATE_PROPS, "ASF_OBJ_BITRATE_PROPS", + {0x7bf875ce, 0x11d1468d, 0x6000828d, 0xb2a2c997} + }, + {ASF_OBJ_EXT_CONTENT_DESC, "ASF_OBJ_EXT_CONTENT_DESC", + {0xd2d0a440, 0x11d2e307, 0xa000f097, 0x50a85ec9} + }, + {ASF_OBJ_BITRATE_MUTEX, "ASF_OBJ_BITRATE_MUTEX", + {0xd6e229dc, 0x11d135da, 0xa0003490, 0xbe4903c9} + }, + {ASF_OBJ_LANGUAGE_LIST, "ASF_OBJ_LANGUAGE_LIST", + {0x7c4346a9, 0x4bfcefe0, 0x3e3929b2, 0x855c41de} + }, + {ASF_OBJ_METADATA_OBJECT, "ASF_OBJ_METADATA_OBJECT", + {0xc5f8cbea, 0x48775baf, 0x8caa6784, 0xca4cfa44} + }, + {ASF_OBJ_EXTENDED_STREAM_PROPS, "ASF_OBJ_EXTENDED_STREAM_PROPS", + {0x14e6a5cb, 0x4332c672, 0x69a99983, 0x5a5b0652} + }, + {ASF_OBJ_COMPATIBILITY, "ASF_OBJ_COMPATIBILITY", + {0x26f18b5d, 0x47ec4584, 0x650e5f9f, 0xc952041f} + }, + {ASF_OBJ_INDEX_PLACEHOLDER, "ASF_OBJ_INDEX_PLACEHOLDER", + {0xd9aade20, 0x4f9c7c17, 0x558528bc, 0xa2e298dd} + }, + {ASF_OBJ_INDEX_PARAMETERS, "ASF_OBJ_INDEX_PARAMETERS", + {0xd6e229df, 0x11d135da, 0xa0003490, 0xbe4903c9} + }, + {ASF_OBJ_ADVANCED_MUTUAL_EXCLUSION, "ASF_OBJ_ADVANCED_MUTUAL_EXCLUSION", + {0xa08649cf, 0x46704775, 0x356e168a, 0xcd667535} + }, + {ASF_OBJ_STREAM_PRIORITIZATION, "ASF_OBJ_STREAM_PRIORITIZATION", + {0xd4fed15b, 0x454f88d3, 0x5cedf081, 0x249e9945} + }, + {ASF_OBJ_CONTENT_ENCRYPTION, "ASF_OBJ_CONTENT_ENCRYPTION", + {0x2211b3fb, 0x11d2bd23, 0xa000b7b4, 0x6efc55c9} + }, + {ASF_OBJ_EXT_CONTENT_ENCRYPTION, "ASF_OBJ_EXT_CONTENT_ENCRYPTION", + {0x298ae614, 0x4c172622, 0xe0da35b9, 0x9c28e97e} + }, + {ASF_OBJ_DIGITAL_SIGNATURE_OBJECT, "ASF_OBJ_DIGITAL_SIGNATURE_OBJECT", + {0x2211b3fc, 0x11d2bd23, 0xa000b7b4, 0x6efc55c9} + }, + {ASF_OBJ_SCRIPT_COMMAND, "ASF_OBJ_SCRIPT_COMMAND", + {0x1efb1a30, 0x11d00b62, 0xa0009ba3, 0xf64803c9} + }, + {ASF_OBJ_MARKER, "ASF_OBJ_MARKER", + {0xf487cd01, 0x11cfa951, 0xc000e68e, 0x6553200c} + }, + /* This guid is definitely used for encryption (mentioned in MS smooth + * streaming docs) in new PlayReady (c) (tm) (wtf) system, but I haven't + * found a proper name for it. + * (Edward Jan 11 2011).*/ + {ASF_OBJ_UNKNOWN_ENCRYPTION_OBJECT, "ASF_OBJ_UNKNOWN_ENCRYPTION_OBJECT", + {0x9a04f079, 0x42869840, 0x5be692ab, 0x955f88e0} + }, + {ASF_OBJ_METADATA_LIBRARY_OBJECT, "ASF_OBJ_METADATA_LIBRARY_OBJECT", + {0x44231c94, 0x49d19498, 0x131d41a1, 0x5470454e} + }, + {ASF_OBJ_UNDEFINED, "ASF_OBJ_UNDEFINED", + {0, 0, 0, 0} + } +}; + +guint32 +gst_asf_identify_guid (const ASFGuidHash * guids, ASFGuid * guid) +{ + gint i; + + for (i = 0; guids[i].obj_id != ASF_OBJ_UNDEFINED; ++i) { + if (guids[i].guid.v1 == guid->v1 && + guids[i].guid.v2 == guid->v2 && + guids[i].guid.v3 == guid->v3 && guids[i].guid.v4 == guid->v4) { + return guids[i].obj_id; + } + } + + /* The base case if none is found */ + return ASF_OBJ_UNDEFINED; +} + +const gchar * +gst_asf_get_guid_nick (const ASFGuidHash * guids, guint32 obj_id) +{ + gint i; + + for (i = 0; guids[i].obj_id != ASF_OBJ_UNDEFINED; ++i) { + if (guids[i].obj_id == obj_id) { + return guids[i].obj_id_str; + } + } + + /* The base case if none is found */ + return "ASF_OBJ_UNDEFINED"; +} diff --git a/gst/asfdemux/asfheaders.h b/gst/asfdemux/asfheaders.h new file mode 100644 index 0000000000..55796c5e7e --- /dev/null +++ b/gst/asfdemux/asfheaders.h @@ -0,0 +1,157 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __ASFHEADERS_H__ +#define __ASFHEADERS_H__ + +G_BEGIN_DECLS + +typedef struct { + guint32 v1; + guint32 v2; + guint32 v3; + guint32 v4; +} ASFGuid; + + + +typedef struct { + guint8 obj_id; + const gchar *obj_id_str; + ASFGuid guid; +} ASFGuidHash; + +typedef enum { + ASF_OBJ_UNDEFINED = 0, + ASF_OBJ_STREAM, + ASF_OBJ_DATA, + ASF_OBJ_FILE, + ASF_OBJ_HEADER, + ASF_OBJ_CONCEAL_NONE, + ASF_OBJ_COMMENT, + ASF_OBJ_CODEC_COMMENT, + ASF_OBJ_CODEC_COMMENT1, + ASF_OBJ_SIMPLE_INDEX, + ASF_OBJ_INDEX, + ASF_OBJ_HEAD1, + ASF_OBJ_HEAD2, + ASF_OBJ_PADDING, + ASF_OBJ_BITRATE_PROPS, + ASF_OBJ_EXT_CONTENT_DESC, + ASF_OBJ_BITRATE_MUTEX, + ASF_OBJ_LANGUAGE_LIST, + ASF_OBJ_METADATA_OBJECT, + ASF_OBJ_EXTENDED_STREAM_PROPS, + ASF_OBJ_COMPATIBILITY, + ASF_OBJ_INDEX_PLACEHOLDER, + ASF_OBJ_INDEX_PARAMETERS, + ASF_OBJ_ADVANCED_MUTUAL_EXCLUSION, + ASF_OBJ_STREAM_PRIORITIZATION, + ASF_OBJ_CONTENT_ENCRYPTION, + ASF_OBJ_EXT_CONTENT_ENCRYPTION, + ASF_OBJ_DIGITAL_SIGNATURE_OBJECT, + ASF_OBJ_SCRIPT_COMMAND, + ASF_OBJ_MARKER, + ASF_OBJ_UNKNOWN_ENCRYPTION_OBJECT, + ASF_OBJ_METADATA_LIBRARY_OBJECT, +} AsfObjectID; + +typedef enum { + ASF_STREAM_UNDEFINED = 0, + ASF_STREAM_VIDEO, + ASF_STREAM_AUDIO, + ASF_STREAM_EXT_EMBED_HEADER +} AsfStreamType; + +typedef enum { + ASF_EXT_STREAM_UNDEFINED = 0, + ASF_EXT_STREAM_AUDIO +} AsfExtStreamType; + +typedef enum { + ASF_CORRECTION_UNDEFINED = 0, + ASF_CORRECTION_ON, + ASF_CORRECTION_OFF +} AsfCorrectionType; + +typedef enum { + ASF_PAYLOAD_EXTENSION_UNDEFINED = 0, + ASF_PAYLOAD_EXTENSION_DURATION, + ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT, + ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO, + ASF_PAYLOAD_EXTENSION_TIMING +} AsfPayloadExtensionID; + +extern const ASFGuidHash asf_payload_ext_guids[]; + +extern const ASFGuidHash asf_correction_guids[]; + +extern const ASFGuidHash asf_stream_guids[]; + +extern const ASFGuidHash asf_ext_stream_guids[]; + +extern const ASFGuidHash asf_object_guids[]; + +/* GUID utilities */ +guint32 gst_asf_identify_guid (const ASFGuidHash * guids, + ASFGuid * guid); + +const gchar *gst_asf_get_guid_nick (const ASFGuidHash * guids, + guint32 obj_id); + +struct _asf_stream_audio { + guint16 codec_tag; + guint16 channels; + guint32 sample_rate; + guint32 byte_rate; + guint16 block_align; + guint16 word_size; + guint16 size; +}; + +typedef struct _asf_stream_audio asf_stream_audio; + +struct _asf_stream_video { + guint32 width; + guint32 height; + guint8 unknown; + guint16 size; +}; + +typedef struct _asf_stream_video asf_stream_video; + +struct _asf_stream_video_format { + guint32 size; + guint32 width; + guint32 height; + guint16 planes; + guint16 depth; + guint32 tag; + guint32 image_size; + guint32 xpels_meter; + guint32 ypels_meter; + guint32 num_colors; + guint32 imp_colors; +}; + +typedef struct _asf_stream_video_format asf_stream_video_format; + +G_END_DECLS + +#endif /* __ASFHEADERS_H__ */ diff --git a/gst/asfdemux/asfpacket.c b/gst/asfdemux/asfpacket.c new file mode 100644 index 0000000000..d25abbe409 --- /dev/null +++ b/gst/asfdemux/asfpacket.c @@ -0,0 +1,808 @@ +/* GStreamer ASF/WMV/WMA demuxer + * Copyright (C) 2007 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* FIXME: + * file:///home/tpm/samples/video/asf//336370-regis-velo862.wmv + * file:///home/tpm/samples/video/asf//336370-eichhoer.wmv + * throw errors (not always necessarily) in this code path + * (looks like they carry broken payloads/packets though) */ + +#include "asfpacket.h" + +#include +#include +#include + +#define GST_ASF_PAYLOAD_KF_COMPLETE(stream, payload) (stream->is_video && payload->keyframe && payload->buf_filled >= payload->mo_size) + +/* we are unlikely to deal with lengths > 2GB here any time soon, so just + * return a signed int and use that for error reporting */ +static inline gint +asf_packet_read_varlen_int (guint lentype_flags, guint lentype_bit_offset, + const guint8 ** p_data, guint * p_size) +{ + static const guint lens[4] = { 0, 1, 2, 4 }; + guint len, val; + + len = lens[(lentype_flags >> lentype_bit_offset) & 0x03]; + + /* will make caller bail out with a short read if there's not enough data */ + if (G_UNLIKELY (*p_size < len)) { + GST_WARNING ("need %u bytes, but only %u bytes available", len, *p_size); + return -1; + } + + switch (len) { + case 0: + val = 0; + break; + case 1: + val = GST_READ_UINT8 (*p_data); + break; + case 2: + val = GST_READ_UINT16_LE (*p_data); + break; + case 4: + val = GST_READ_UINT32_LE (*p_data); + break; + default: + val = 0; + g_assert_not_reached (); + } + + *p_data += len; + *p_size -= len; + + return (gint) val; +} + +static GstBuffer * +asf_packet_create_payload_buffer (AsfPacket * packet, const guint8 ** p_data, + guint * p_size, guint payload_len) +{ + guint off; + + g_assert (payload_len <= *p_size); + + off = (guint) (*p_data - packet->bdata); + g_assert (off < gst_buffer_get_size (packet->buf)); + + *p_data += payload_len; + *p_size -= payload_len; + + return gst_buffer_copy_region (packet->buf, GST_BUFFER_COPY_ALL, off, + payload_len); +} + +static AsfPayload * +asf_payload_search_payloads_queue (AsfPayload * payload, GArray * payload_list) +{ + AsfPayload *ret = NULL; + gint idx; + for (idx = payload_list->len - 1; idx >= 0; idx--) { + ret = &g_array_index (payload_list, AsfPayload, idx); + + if (G_UNLIKELY (ret->mo_size == payload->mo_size && + ret->mo_number == payload->mo_number)) { + return ret; + } + } + return NULL; +} + +static AsfPayload * +asf_payload_find_previous_fragment (GstASFDemux * demux, AsfPayload * payload, + AsfStream * stream) +{ + AsfPayload *ret = NULL; + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + + /* Search in queued payloads list */ + ret = asf_payload_search_payloads_queue (payload, stream->payloads); + if (ret) { + GST_DEBUG + ("previous fragments found in payloads queue for reverse playback : object ID %d", + ret->mo_number); + return ret; + } + + /* Search in payloads 'to be queued' list */ + ret = asf_payload_search_payloads_queue (payload, stream->payloads_rev); + if (ret) { + GST_DEBUG + ("previous fragments found in temp payload queue for reverse playback : object ID %d", + ret->mo_number); + return ret; + } + } else { + if (G_UNLIKELY (stream->payloads->len == 0)) { + GST_DEBUG ("No previous fragments to merge with for stream %u", + stream->id); + return NULL; + } + + ret = + &g_array_index (stream->payloads, AsfPayload, + stream->payloads->len - 1); + + if (G_UNLIKELY (ret->mo_size != payload->mo_size || + ret->mo_number != payload->mo_number || ret->mo_offset != 0)) { + if (payload->mo_size != 0) { + GST_WARNING ("Previous fragment does not match continued fragment"); + return NULL; + } else { + /* Warn about this case, but accept it anyway: files in the wild sometimes + * have continued packets where the subsequent fragments say that they're + * zero-sized. */ + GST_WARNING ("Previous fragment found, but current fragment has " + "zero size, accepting anyway"); + } + } + } + +#if 0 + if (this_fragment->mo_offset + this_payload_len > first_fragment->mo_size) { + GST_WARNING ("Merged fragments would be bigger than the media object"); + return FALSE; + } +#endif + + return ret; +} + +/* TODO: if we have another payload already queued for this stream and that + * payload doesn't have a duration, maybe we can calculate a duration for it + * (if the previous timestamp is smaller etc. etc.) */ +static void +gst_asf_payload_queue_for_stream_forward (GstASFDemux * demux, + AsfPayload * payload, AsfStream * stream) +{ + GST_DEBUG_OBJECT (demux, "Got payload for stream %d ts:%" GST_TIME_FORMAT, + stream->id, GST_TIME_ARGS (payload->ts)); + + /* make timestamps start from 0; first_ts will be determined during activation (once we have enough data), + which will also update ts of all packets queued before we knew first_ts; */ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (demux->first_ts) + && GST_CLOCK_TIME_IS_VALID (payload->ts))) { + if (payload->ts > demux->first_ts) + payload->ts -= demux->first_ts; + else + payload->ts = 0; + } + + /* remove any incomplete payloads that will never be completed */ + while (stream->payloads->len > 0) { + AsfPayload *prev; + guint idx_last; + + idx_last = stream->payloads->len - 1; + prev = &g_array_index (stream->payloads, AsfPayload, idx_last); + + if (G_UNLIKELY (gst_asf_payload_is_complete (prev))) + break; + + GST_DEBUG_OBJECT (demux, "Dropping incomplete fragmented media object " + "queued for stream %u", stream->id); + + gst_buffer_replace (&prev->buf, NULL); + g_array_remove_index (stream->payloads, idx_last); + + /* there's data missing, so there's a discontinuity now */ + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT); + } + + /* If we're about to queue a key frame that is before the segment start, we + * can ditch any previously queued payloads (which would also be before the + * segment start). This makes sure the decoder doesn't decode more than + * absolutely necessary after a seek (we don't push out payloads that are + * before the segment start until we have at least one that falls within the + * segment) */ + if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) && + payload->ts < demux->segment.start && payload->keyframe)) { + GST_DEBUG_OBJECT (demux, "Queueing keyframe before segment start, removing" + " %u previously-queued payloads, which would be out of segment too and" + " hence don't have to be decoded", stream->payloads->len); + while (stream->payloads->len > 0) { + AsfPayload *last; + guint idx_last; + + idx_last = stream->payloads->len - 1; + last = &g_array_index (stream->payloads, AsfPayload, idx_last); + gst_buffer_replace (&last->buf, NULL); + g_array_remove_index (stream->payloads, idx_last); + } + + /* Mark discontinuity (should be done via stream->discont anyway though) */ + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT); + } + + g_array_append_vals (stream->payloads, payload, 1); +} + +static void +gst_asf_payload_queue_for_stream_reverse (GstASFDemux * demux, + AsfPayload * payload, AsfStream * stream) +{ + GST_DEBUG_OBJECT (demux, "Got payload for stream %d ts:%" GST_TIME_FORMAT, + stream->id, GST_TIME_ARGS (payload->ts)); + + if (demux->multiple_payloads) { + /* store the payload in temporary buffer, until we parse all payloads in this packet */ + g_array_append_vals (stream->payloads_rev, payload, 1); + } else { + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts))) { + g_array_append_vals (stream->payloads, payload, 1); + if (GST_ASF_PAYLOAD_KF_COMPLETE (stream, payload)) { + stream->kf_pos = stream->payloads->len - 1; + } + } else { + gst_buffer_unref (payload->buf); + } + } +} + + +static void +gst_asf_payload_queue_for_stream (GstASFDemux * demux, AsfPayload * payload, + AsfStream * stream) +{ + GST_DEBUG_OBJECT (demux, "Got payload for stream %d ts:%" GST_TIME_FORMAT, + stream->id, GST_TIME_ARGS (payload->ts)); + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + gst_asf_payload_queue_for_stream_reverse (demux, payload, stream); + } else { + gst_asf_payload_queue_for_stream_forward (demux, payload, stream); + } + +} + +static void +asf_payload_parse_replicated_data_extensions (AsfStream * stream, + AsfPayload * payload) +{ + AsfPayloadExtension *ext; + guint off; + guint16 ext_len; + + if (!stream->ext_props.valid || stream->ext_props.payload_extensions == NULL) + return; + + off = 8; + for (ext = stream->ext_props.payload_extensions; ext->len > 0; ++ext) { + ext_len = ext->len; + if (ext_len == 0xFFFF) { /* extension length is determined by first two bytes in replicated data */ + ext_len = GST_READ_UINT16_LE (payload->rep_data + off); + off += 2; + } + if (G_UNLIKELY (off + ext_len > payload->rep_data_len)) { + GST_WARNING ("not enough replicated data for defined extensions"); + return; + } + switch (ext->id) { + case ASF_PAYLOAD_EXTENSION_DURATION: + if (G_LIKELY (ext_len == 2)) { + guint16 tdur = GST_READ_UINT16_LE (payload->rep_data + off); + /* packet durations of 1ms are mostly invalid */ + if (tdur != 1) + payload->duration = tdur * GST_MSECOND; + } else { + GST_WARNING ("unexpected DURATION extensions len %u", ext_len); + } + break; + case ASF_PAYLOAD_EXTENSION_SYSTEM_CONTENT: + if (G_LIKELY (ext_len == 1)) { + guint8 data = payload->rep_data[off]; + + payload->interlaced = data & 0x1; + payload->rff = data & 0x8; + payload->tff = (data & 0x2) || !(data & 0x4); + GST_DEBUG ("SYSTEM_CONTENT: interlaced:%d, rff:%d, tff:%d", + payload->interlaced, payload->rff, payload->tff); + } else { + GST_WARNING ("unexpected SYSTEM_CONTE extensions len %u", ext_len); + } + break; + case ASF_PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO: + if (G_LIKELY (ext_len == 2)) { + payload->par_x = payload->rep_data[off]; + payload->par_y = payload->rep_data[off + 1]; + GST_DEBUG ("PAR %d / %d", payload->par_x, payload->par_y); + } else { + GST_WARNING ("unexpected SYSTEM_PIXEL_ASPECT_RATIO extensions len %u", + ext_len); + } + break; + case ASF_PAYLOAD_EXTENSION_TIMING: + { + /* dvr-ms timing - this will override packet timestamp */ + guint64 time = GST_READ_UINT64_LE (payload->rep_data + off + 8); + if (time != 0xFFFFFFFFFFFFFFFF) + payload->ts = time * 100; + else + payload->ts = GST_CLOCK_TIME_NONE; + } + break; + default: + GST_LOG ("UNKNOWN PAYLOAD EXTENSION!"); + break; + } + off += ext_len; + } +} + +static gboolean +gst_asf_demux_parse_payload (GstASFDemux * demux, AsfPacket * packet, + gint lentype, const guint8 ** p_data, guint * p_size) +{ + AsfPayload payload = { 0, }; + AsfStream *stream; + gboolean is_compressed; + guint payload_len; + guint stream_num; + + if (G_UNLIKELY (*p_size < 1)) { + GST_WARNING_OBJECT (demux, "Short packet!"); + return FALSE; + } + + stream_num = GST_READ_UINT8 (*p_data) & 0x7f; + payload.keyframe = ((GST_READ_UINT8 (*p_data) & 0x80) != 0); + + *p_data += 1; + *p_size -= 1; + + payload.ts = GST_CLOCK_TIME_NONE; + payload.duration = GST_CLOCK_TIME_NONE; + payload.par_x = 0; + payload.par_y = 0; + payload.interlaced = FALSE; + payload.tff = FALSE; + payload.rff = FALSE; + + payload.mo_number = + asf_packet_read_varlen_int (packet->prop_flags, 4, p_data, p_size); + payload.mo_offset = + asf_packet_read_varlen_int (packet->prop_flags, 2, p_data, p_size); + payload.rep_data_len = + asf_packet_read_varlen_int (packet->prop_flags, 0, p_data, p_size); + + is_compressed = (payload.rep_data_len == 1); + + GST_LOG_OBJECT (demux, "payload for stream %u", stream_num); + GST_LOG_OBJECT (demux, "keyframe : %s", (payload.keyframe) ? "yes" : "no"); + GST_LOG_OBJECT (demux, "compressed : %s", (is_compressed) ? "yes" : "no"); + + if (G_UNLIKELY (*p_size < payload.rep_data_len)) { + GST_WARNING_OBJECT (demux, "Short packet! rep_data_len=%u, size=%u", + payload.rep_data_len, *p_size); + return FALSE; + } + + memcpy (payload.rep_data, *p_data, + MIN (sizeof (payload.rep_data), payload.rep_data_len)); + + *p_data += payload.rep_data_len; + *p_size -= payload.rep_data_len; + + if (G_UNLIKELY (*p_size == 0)) { + GST_WARNING_OBJECT (demux, "payload without data!?"); + return FALSE; + } + + /* we use -1 as lentype for a single payload that's the size of the packet */ + if (G_UNLIKELY ((lentype >= 0 && lentype <= 3))) { + payload_len = asf_packet_read_varlen_int (lentype, 0, p_data, p_size); + if (*p_size < payload_len) { + GST_WARNING_OBJECT (demux, "Short packet! payload_len=%u, size=%u", + payload_len, *p_size); + return FALSE; + } + } else { + payload_len = *p_size; + } + + GST_LOG_OBJECT (demux, "payload length: %u", payload_len); + + stream = gst_asf_demux_get_stream (demux, stream_num); + + if (G_UNLIKELY (stream == NULL)) { + if (gst_asf_demux_is_unknown_stream (demux, stream_num)) { + GST_WARNING_OBJECT (demux, "Payload for unknown stream %u, skipping", + stream_num); + } + if (*p_size < payload_len) { + *p_data += *p_size; + *p_size = 0; + } else { + *p_data += payload_len; + *p_size -= payload_len; + } + return TRUE; + } + + if (!stream->is_video) + stream->kf_pos = 0; + + if (G_UNLIKELY (!is_compressed)) { + GST_LOG_OBJECT (demux, "replicated data length: %u", payload.rep_data_len); + + if (payload.rep_data_len >= 8) { + payload.mo_size = GST_READ_UINT32_LE (payload.rep_data); + payload.ts = GST_READ_UINT32_LE (payload.rep_data + 4) * GST_MSECOND; + if (G_UNLIKELY (payload.ts < demux->preroll)) + payload.ts = 0; + else + payload.ts -= demux->preroll; + asf_payload_parse_replicated_data_extensions (stream, &payload); + + GST_LOG_OBJECT (demux, "media object size : %u", payload.mo_size); + GST_LOG_OBJECT (demux, "media object ts : %" GST_TIME_FORMAT, + GST_TIME_ARGS (payload.ts)); + GST_LOG_OBJECT (demux, "media object dur : %" GST_TIME_FORMAT, + GST_TIME_ARGS (payload.duration)); + } else if (payload.rep_data_len == 0) { + payload.mo_size = 0; + } else if (payload.rep_data_len != 0) { + GST_WARNING_OBJECT (demux, "invalid replicated data length, very bad"); + *p_data += payload_len; + *p_size -= payload_len; + return FALSE; + } + + GST_LOG_OBJECT (demux, "media object offset : %u", payload.mo_offset); + + GST_LOG_OBJECT (demux, "payload length: %u", payload_len); + + if (payload_len == 0) { + GST_DEBUG_OBJECT (demux, "skipping empty payload"); + } else if (payload.mo_offset == 0 && payload.mo_size == payload_len) { + /* if the media object is not fragmented, just create a sub-buffer */ + GST_LOG_OBJECT (demux, "unfragmented media object size %u", payload_len); + payload.buf = asf_packet_create_payload_buffer (packet, p_data, p_size, + payload_len); + payload.buf_filled = payload_len; + gst_asf_payload_queue_for_stream (demux, &payload, stream); + } else if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + /* Handle fragmented payloads for reverse playback */ + AsfPayload *prev; + const guint8 *payload_data = *p_data; + prev = asf_payload_find_previous_fragment (demux, &payload, stream); + + if (prev) { + gint idx; + AsfPayload *p; + gst_buffer_fill (prev->buf, payload.mo_offset, + payload_data, payload_len); + prev->buf_filled += payload_len; + if (payload.keyframe && payload.mo_offset == 0) { + stream->reverse_kf_ready = TRUE; + + for (idx = stream->payloads->len - 1; idx >= 0; idx--) { + p = &g_array_index (stream->payloads, AsfPayload, idx); + if (p->mo_number == payload.mo_number) { + /* Mark position of KF for reverse play */ + stream->kf_pos = idx; + } + } + } + } else { + payload.buf = gst_buffer_new_allocate (NULL, payload.mo_size, NULL); /* can we use (mo_size - offset) for size? */ + gst_buffer_fill (payload.buf, payload.mo_offset, + payload_data, payload_len); + payload.buf_filled = payload.mo_size - (payload.mo_offset); + gst_asf_payload_queue_for_stream (demux, &payload, stream); + } + *p_data += payload_len; + *p_size -= payload_len; + } else { + const guint8 *payload_data = *p_data; + + g_assert (payload_len <= *p_size); + + *p_data += payload_len; + *p_size -= payload_len; + + /* n-th fragment of a fragmented media object? */ + if (payload.mo_offset != 0) { + AsfPayload *prev; + + if ((prev = + asf_payload_find_previous_fragment (demux, &payload, stream))) { + if (prev->buf == NULL || (payload.mo_size > 0 + && payload.mo_size != prev->mo_size) + || payload.mo_offset >= gst_buffer_get_size (prev->buf) + || payload.mo_offset + payload_len > + gst_buffer_get_size (prev->buf)) { + GST_WARNING_OBJECT (demux, "Offset doesn't match previous data?!"); + } else { + /* we assume fragments are payloaded with increasing mo_offset */ + if (payload.mo_offset != prev->buf_filled) { + GST_WARNING_OBJECT (demux, "media object payload discontinuity: " + "offset=%u vs buf_filled=%u", payload.mo_offset, + prev->buf_filled); + } + gst_buffer_fill (prev->buf, payload.mo_offset, + payload_data, payload_len); + prev->buf_filled = + MAX (prev->buf_filled, payload.mo_offset + payload_len); + GST_LOG_OBJECT (demux, "Merged media object fragments, size now %u", + prev->buf_filled); + } + } else { + GST_DEBUG_OBJECT (demux, "n-th payload fragment, but don't have " + "any previous fragment, ignoring payload"); + } + } else { + GST_LOG_OBJECT (demux, "allocating buffer of size %u for fragmented " + "media object", payload.mo_size); + payload.buf = gst_buffer_new_allocate (NULL, payload.mo_size, NULL); + gst_buffer_fill (payload.buf, 0, payload_data, payload_len); + payload.buf_filled = payload_len; + + gst_asf_payload_queue_for_stream (demux, &payload, stream); + } + } + } else { + const guint8 *payload_data; + GstClockTime ts, ts_delta; + guint num; + + GST_LOG_OBJECT (demux, "Compressed payload, length=%u", payload_len); + + payload_data = *p_data; + + *p_data += payload_len; + *p_size -= payload_len; + + ts = payload.mo_offset * GST_MSECOND; + if (G_UNLIKELY (ts < demux->preroll)) + ts = 0; + else + ts -= demux->preroll; + ts_delta = payload.rep_data[0] * GST_MSECOND; + + for (num = 0; payload_len > 0; ++num) { + guint sub_payload_len; + + sub_payload_len = GST_READ_UINT8 (payload_data); + + GST_LOG_OBJECT (demux, "subpayload #%u: len=%u, ts=%" GST_TIME_FORMAT, + num, sub_payload_len, GST_TIME_ARGS (ts)); + + ++payload_data; + --payload_len; + + if (G_UNLIKELY (payload_len < sub_payload_len)) { + GST_WARNING_OBJECT (demux, "Short payload! %u bytes left", payload_len); + return FALSE; + } + + if (G_LIKELY (sub_payload_len > 0)) { + payload.buf = asf_packet_create_payload_buffer (packet, + &payload_data, &payload_len, sub_payload_len); + payload.buf_filled = sub_payload_len; + + payload.ts = ts; + if (G_LIKELY (ts_delta)) + payload.duration = ts_delta; + else + payload.duration = GST_CLOCK_TIME_NONE; + + gst_asf_payload_queue_for_stream (demux, &payload, stream); + } + + ts += ts_delta; + } + } + + return TRUE; +} + +GstAsfDemuxParsePacketError +gst_asf_demux_parse_packet (GstASFDemux * demux, GstBuffer * buf) +{ + AsfPacket packet = { 0, }; + GstMapInfo map; + const guint8 *data; + gboolean has_multiple_payloads; + GstAsfDemuxParsePacketError ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE; + guint8 ec_flags, flags1; + guint size; + + gst_buffer_map (buf, &map, GST_MAP_READ); + data = map.data; + size = map.size; + GST_LOG_OBJECT (demux, "Buffer size: %u", size); + + /* need at least two payload flag bytes, send time, and duration */ + if (G_UNLIKELY (size < 2 + 4 + 2)) { + GST_WARNING_OBJECT (demux, "Packet size is < 8"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE; + goto done; + } + + packet.buf = buf; + /* evidently transient */ + packet.bdata = data; + + ec_flags = GST_READ_UINT8 (data); + + /* skip optional error correction stuff */ + if ((ec_flags & 0x80) != 0) { + guint ec_len_type, ec_len; + + ec_len_type = (ec_flags & 0x60) >> 5; + if (ec_len_type == 0) { + ec_len = ec_flags & 0x0f; + } else { + GST_WARNING_OBJECT (demux, "unexpected error correction length type %u", + ec_len_type); + ec_len = 2; + } + GST_LOG_OBJECT (demux, "packet has error correction (%u bytes)", ec_len); + + /* still need at least two payload flag bytes, send time, and duration */ + if (size <= (1 + ec_len) + 2 + 4 + 2) { + GST_WARNING_OBJECT (demux, "Packet size is < 8 with Error Correction"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_FATAL; + goto done; + } + + data += 1 + ec_len; + size -= 1 + ec_len; + } + + /* parse payload info */ + flags1 = GST_READ_UINT8 (data); + packet.prop_flags = GST_READ_UINT8 (data + 1); + + data += 2; + size -= 2; + + has_multiple_payloads = (flags1 & 0x01) != 0; + + packet.length = asf_packet_read_varlen_int (flags1, 5, &data, &size); + + packet.sequence = asf_packet_read_varlen_int (flags1, 1, &data, &size); + + packet.padding = asf_packet_read_varlen_int (flags1, 3, &data, &size); + + if (G_UNLIKELY (size < 6)) { + GST_WARNING_OBJECT (demux, "Packet size is < 6"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_FATAL; + goto done; + } + + packet.send_time = GST_READ_UINT32_LE (data) * GST_MSECOND; + packet.duration = GST_READ_UINT16_LE (data + 4) * GST_MSECOND; + + data += 4 + 2; + size -= 4 + 2; + + GST_LOG_OBJECT (demux, "flags : 0x%x", flags1); + GST_LOG_OBJECT (demux, "multiple payloads: %u", has_multiple_payloads); + GST_LOG_OBJECT (demux, "packet length : %u", packet.length); + GST_LOG_OBJECT (demux, "sequence : %u", packet.sequence); + GST_LOG_OBJECT (demux, "padding : %u", packet.padding); + GST_LOG_OBJECT (demux, "send time : %" GST_TIME_FORMAT, + GST_TIME_ARGS (packet.send_time)); + + GST_LOG_OBJECT (demux, "duration : %" GST_TIME_FORMAT, + GST_TIME_ARGS (packet.duration)); + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) + && demux->seek_to_cur_pos == TRUE) { + /* For reverse playback, initially parse packets forward until we reach packet with 'seek' timestamp */ + if (packet.send_time - demux->preroll > demux->segment.stop) { + demux->seek_to_cur_pos = FALSE; + } + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE; + goto done; + } + + if (G_UNLIKELY (packet.padding == (guint) - 1 || size < packet.padding)) { + GST_WARNING_OBJECT (demux, "No padding, or padding bigger than buffer"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE; + goto done; + } + + size -= packet.padding; + + /* adjust available size for parsing if there's less actual packet data for + * parsing than there is data in bytes (for sample see bug 431318) */ + if (G_UNLIKELY (packet.length != 0 && packet.padding == 0 + && packet.length < demux->packet_size)) { + GST_LOG_OBJECT (demux, "shortened packet with implicit padding, " + "adjusting available data size"); + if (size < demux->packet_size - packet.length) { + /* the buffer is smaller than the implicit padding */ + GST_WARNING_OBJECT (demux, "Buffer is smaller than the implicit padding"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE; + goto done; + } else { + /* subtract the implicit padding */ + size -= (demux->packet_size - packet.length); + } + } + + if (has_multiple_payloads) { + guint i, num, lentype; + demux->multiple_payloads = TRUE; + + if (G_UNLIKELY (size < 1)) { + GST_WARNING_OBJECT (demux, "No room more in buffer"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE; + goto done; + } + + num = (GST_READ_UINT8 (data) & 0x3F) >> 0; + lentype = (GST_READ_UINT8 (data) & 0xC0) >> 6; + + ++data; + --size; + + GST_LOG_OBJECT (demux, "num payloads : %u", num); + + for (i = 0; i < num; ++i) { + GST_LOG_OBJECT (demux, "Parsing payload %u/%u, size left: %u", i + 1, num, + size); + + if (G_UNLIKELY (!gst_asf_demux_parse_payload (demux, &packet, lentype, + &data, &size))) { + GST_WARNING_OBJECT (demux, "Failed to parse payload %u/%u", i + 1, num); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_FATAL; + break; + } + } + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + /* In reverse playback, we parsed the packet (with multiple payloads) and stored the payloads in temporary queue. + Now, add them to the stream's payload queue */ + for (i = 0; i < demux->num_streams; i++) { + AsfStream *s = &demux->stream[i]; + while (s->payloads_rev->len > 0) { + AsfPayload *p; + p = &g_array_index (s->payloads_rev, AsfPayload, + s->payloads_rev->len - 1); + g_array_append_vals (s->payloads, p, 1); + if (GST_ASF_PAYLOAD_KF_COMPLETE (s, p)) { + /* Mark position of KF for reverse play */ + s->kf_pos = s->payloads->len - 1; + } + g_array_remove_index (s->payloads_rev, (s->payloads_rev->len - 1)); + } + } + } + + } else { + GST_LOG_OBJECT (demux, "Parsing single payload"); + demux->multiple_payloads = FALSE; + if (G_UNLIKELY (!gst_asf_demux_parse_payload (demux, &packet, -1, &data, + &size))) { + GST_WARNING_OBJECT (demux, "Failed to parse payload"); + ret = GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE; + } + } + +done: + gst_buffer_unmap (buf, &map); + return ret; +} diff --git a/gst/asfdemux/asfpacket.h b/gst/asfdemux/asfpacket.h new file mode 100644 index 0000000000..a812e74d14 --- /dev/null +++ b/gst/asfdemux/asfpacket.h @@ -0,0 +1,74 @@ +/* GStreamer ASF/WMV/WMA demuxer + * Copyright (C) 2007 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __ASF_PACKET_H__ +#define __ASF_PACKET_H__ + +#include +#include + +#include "gstasfdemux.h" + +G_BEGIN_DECLS + +typedef struct { + gboolean keyframe; /* buffer flags might not survive merge.. */ + guint mo_number; /* media object number (unused) */ + guint mo_offset; /* offset (timestamp for compressed data) */ + guint mo_size; /* size of media-object-to-be, or 0 */ + guint buf_filled; /* how much of the mo data we got so far */ + GstBuffer *buf; /* buffer to assemble media-object or NULL*/ + guint rep_data_len; /* should never be more than 256, since */ + guint8 rep_data[256]; /* the length should be stored in a byte */ + GstClockTime ts; + GstClockTime duration; /* is not always available */ + guint8 par_x; /* not always available (0:deactivated) */ + guint8 par_y; /* not always available (0:deactivated) */ + gboolean interlaced; /* default: FALSE */ + gboolean tff; + gboolean rff; +} AsfPayload; + +typedef struct { + GstBuffer *buf; + const guint8 *bdata; + guint length; /* packet length (unused) */ + guint padding; /* length of padding at end of packet */ + guint sequence; /* sequence (unused) */ + GstClockTime send_time; + GstClockTime duration; + + guint8 prop_flags; /* payload length types */ +} AsfPacket; + +typedef enum { + GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE, + GST_ASF_DEMUX_PARSE_PACKET_ERROR_RECOVERABLE, + GST_ASF_DEMUX_PARSE_PACKET_ERROR_FATAL +} GstAsfDemuxParsePacketError; + +GstAsfDemuxParsePacketError gst_asf_demux_parse_packet (GstASFDemux * demux, GstBuffer * buf); + +#define gst_asf_payload_is_complete(payload) \ + ((payload)->buf_filled >= (payload)->mo_size) + +G_END_DECLS + +#endif /* __ASF_PACKET_H__ */ + diff --git a/gst/asfdemux/gstasf.c b/gst/asfdemux/gstasf.c new file mode 100644 index 0000000000..73a7db2997 --- /dev/null +++ b/gst/asfdemux/gstasf.c @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gst/gst-i18n-plugin.h" + +#include "gstasfelements.h" + + +/* #include "gstasfmux.h" */ + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (asfdemux, plugin); + ret |= GST_ELEMENT_REGISTER (rtspwms, plugin); + ret |= GST_ELEMENT_REGISTER (rtpasfdepay, plugin); +/* + if (!gst_element_register (plugin, "asfmux", GST_RANK_NONE, GST_TYPE_ASFMUX)) + return FALSE; +*/ + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + asf, + "Demuxes and muxes audio and video in Microsofts ASF format", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c new file mode 100644 index 0000000000..0c8dc848c9 --- /dev/null +++ b/gst/asfdemux/gstasfdemux.c @@ -0,0 +1,4921 @@ +/* GStreamer ASF/WMV/WMA demuxer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2006-2009 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* TODO: + * + * - _loop(): + * stop if at end of segment if != end of file, ie. demux->segment.stop + * + * - fix packet parsing: + * there's something wrong with timestamps for packets with keyframes, + * and durations too. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gstasfelements.h" +#include "gstasfdemux.h" +#include "asfheaders.h" +#include "asfpacket.h" + +GST_DEBUG_CATEGORY (asfdemux_dbg); +#define GST_CAT_DEFAULT asfdemux_dbg + +static GstStaticPadTemplate gst_asf_demux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-ms-asf") + ); + +static GstStaticPadTemplate audio_src_template = +GST_STATIC_PAD_TEMPLATE ("audio_%u", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate video_src_template = +GST_STATIC_PAD_TEMPLATE ("video_%u", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +/* size of an ASF object header, ie. GUID (16 bytes) + object size (8 bytes) */ +#define ASF_OBJECT_HEADER_SIZE (16+8) + +/* FIXME: get rid of this */ +/* abuse this GstFlowReturn enum for internal usage */ +#define ASF_FLOW_NEED_MORE_DATA 99 + +#define gst_asf_get_flow_name(flow) \ + (flow == ASF_FLOW_NEED_MORE_DATA) ? \ + "need-more-data" : gst_flow_get_name (flow) + +static void gst_asf_demux_finalize (GObject * object); +static GstStateChangeReturn gst_asf_demux_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_asf_demux_element_send_event (GstElement * element, + GstEvent * event); +static gboolean gst_asf_demux_send_event_unlocked (GstASFDemux * demux, + GstEvent * event); +static gboolean gst_asf_demux_handle_src_query (GstPad * pad, + GstObject * parent, GstQuery * query); +static GstFlowReturn gst_asf_demux_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); +static gboolean gst_asf_demux_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static GstFlowReturn gst_asf_demux_process_object (GstASFDemux * demux, + guint8 ** p_data, guint64 * p_size); +static gboolean gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent); +static gboolean gst_asf_demux_activate_mode (GstPad * sinkpad, + GstObject * parent, GstPadMode mode, gboolean active); +static void gst_asf_demux_loop (GstASFDemux * demux); +static void +gst_asf_demux_process_queued_extended_stream_objects (GstASFDemux * demux); +static gboolean gst_asf_demux_pull_headers (GstASFDemux * demux, + GstFlowReturn * pflow); +static GstFlowReturn gst_asf_demux_pull_indices (GstASFDemux * demux); +static void gst_asf_demux_reset_stream_state_after_discont (GstASFDemux * asf); +static gboolean +gst_asf_demux_parse_data_object_start (GstASFDemux * demux, guint8 * data); +static void gst_asf_demux_descramble_buffer (GstASFDemux * demux, + AsfStream * stream, GstBuffer ** p_buffer); +static void gst_asf_demux_activate_stream (GstASFDemux * demux, + AsfStream * stream); +static GstStructure *gst_asf_demux_get_metadata_for_stream (GstASFDemux * d, + guint stream_num); +static GstFlowReturn gst_asf_demux_push_complete_payloads (GstASFDemux * demux, + gboolean force); + +#define gst_asf_demux_parent_class parent_class +G_DEFINE_TYPE (GstASFDemux, gst_asf_demux, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (asfdemux, "asfdemux", GST_RANK_SECONDARY, + GST_TYPE_ASF_DEMUX, asf_element_init (plugin)); + +static void +gst_asf_demux_class_init (GstASFDemuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_asf_demux_finalize; + + gst_element_class_set_static_metadata (gstelement_class, "ASF Demuxer", + "Codec/Demuxer", + "Demultiplexes ASF Streams", "Owen Fraser-Green "); + + gst_element_class_add_static_pad_template (gstelement_class, + &audio_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &video_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_asf_demux_sink_template); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_asf_demux_change_state); + gstelement_class->send_event = + GST_DEBUG_FUNCPTR (gst_asf_demux_element_send_event); +} + +static void +gst_asf_demux_free_stream (GstASFDemux * demux, AsfStream * stream) +{ + gst_caps_replace (&stream->caps, NULL); + if (stream->pending_tags) { + gst_tag_list_unref (stream->pending_tags); + stream->pending_tags = NULL; + } + if (stream->streamheader) { + gst_buffer_unref (stream->streamheader); + stream->streamheader = NULL; + } + if (stream->pad) { + if (stream->active) { + gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad); + gst_flow_combiner_remove_pad (demux->flowcombiner, stream->pad); + } else + gst_object_unref (stream->pad); + stream->pad = NULL; + } + + if (stream->payloads) { + while (stream->payloads->len > 0) { + AsfPayload *payload; + guint last; + + last = stream->payloads->len - 1; + payload = &g_array_index (stream->payloads, AsfPayload, last); + gst_buffer_replace (&payload->buf, NULL); + g_array_remove_index (stream->payloads, last); + } + g_array_free (stream->payloads, TRUE); + stream->payloads = NULL; + } + + if (stream->payloads_rev) { + while (stream->payloads_rev->len > 0) { + AsfPayload *payload; + guint last; + + last = stream->payloads_rev->len - 1; + payload = &g_array_index (stream->payloads_rev, AsfPayload, last); + gst_buffer_replace (&payload->buf, NULL); + g_array_remove_index (stream->payloads_rev, last); + } + g_array_free (stream->payloads_rev, TRUE); + stream->payloads_rev = NULL; + } + + if (stream->ext_props.valid) { + g_free (stream->ext_props.payload_extensions); + stream->ext_props.payload_extensions = NULL; + } +} + +static void +gst_asf_demux_reset (GstASFDemux * demux, gboolean chain_reset) +{ + GST_LOG_OBJECT (demux, "resetting"); + + gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); + demux->segment_running = FALSE; + if (demux->adapter && !chain_reset) { + gst_adapter_clear (demux->adapter); + g_object_unref (demux->adapter); + demux->adapter = NULL; + } + if (demux->taglist) { + gst_tag_list_unref (demux->taglist); + demux->taglist = NULL; + } + if (demux->metadata) { + gst_caps_unref (demux->metadata); + demux->metadata = NULL; + } + demux->metadata = gst_caps_new_empty (); + if (demux->global_metadata) { + gst_structure_free (demux->global_metadata); + demux->global_metadata = NULL; + } + demux->global_metadata = gst_structure_new_empty ("metadata"); + if (demux->mut_ex_streams) { + g_slist_free (demux->mut_ex_streams); + demux->mut_ex_streams = NULL; + } + + demux->state = GST_ASF_DEMUX_STATE_HEADER; + g_free (demux->objpath); + demux->objpath = NULL; + g_strfreev (demux->languages); + demux->languages = NULL; + demux->num_languages = 0; + g_slist_foreach (demux->ext_stream_props, (GFunc) gst_mini_object_unref, + NULL); + g_slist_free (demux->ext_stream_props); + demux->ext_stream_props = NULL; + + while (demux->old_num_streams > 0) { + gst_asf_demux_free_stream (demux, + &demux->old_stream[demux->old_num_streams - 1]); + --demux->old_num_streams; + } + memset (demux->old_stream, 0, sizeof (demux->old_stream)); + demux->old_num_streams = 0; + + /* when resetting for a new chained asf, we don't want to remove the pads + * before adding the new ones */ + if (chain_reset) { + memcpy (demux->old_stream, demux->stream, sizeof (demux->stream)); + demux->old_num_streams = demux->num_streams; + demux->num_streams = 0; + } + + while (demux->num_streams > 0) { + gst_asf_demux_free_stream (demux, &demux->stream[demux->num_streams - 1]); + --demux->num_streams; + } + memset (demux->stream, 0, sizeof (demux->stream)); + if (!chain_reset) { + /* do not remove those for not adding pads with same name */ + demux->num_audio_streams = 0; + demux->num_video_streams = 0; + demux->have_group_id = FALSE; + demux->group_id = G_MAXUINT; + } + demux->num_streams = 0; + demux->activated_streams = FALSE; + demux->first_ts = GST_CLOCK_TIME_NONE; + demux->segment_ts = GST_CLOCK_TIME_NONE; + demux->in_gap = 0; + if (!chain_reset) + gst_segment_init (&demux->in_segment, GST_FORMAT_UNDEFINED); + demux->state = GST_ASF_DEMUX_STATE_HEADER; + demux->seekable = FALSE; + demux->broadcast = FALSE; + demux->sidx_interval = 0; + demux->sidx_num_entries = 0; + g_free (demux->sidx_entries); + demux->sidx_entries = NULL; + + demux->speed_packets = 1; + + demux->asf_3D_mode = GST_ASF_3D_NONE; + + if (chain_reset) { + GST_LOG_OBJECT (demux, "Restarting"); + gst_segment_init (&demux->segment, GST_FORMAT_TIME); + demux->need_newsegment = TRUE; + demux->segment_seqnum = 0; + demux->segment_running = FALSE; + demux->keyunit_sync = FALSE; + demux->accurate = FALSE; + demux->data_size = 0; + demux->data_offset = 0; + demux->index_offset = 0; + } else { + demux->base_offset = 0; + } + + g_slist_free (demux->other_streams); + demux->other_streams = NULL; +} + +static void +gst_asf_demux_init (GstASFDemux * demux) +{ + demux->sinkpad = + gst_pad_new_from_static_template (&gst_asf_demux_sink_template, "sink"); + gst_pad_set_chain_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_asf_demux_chain)); + gst_pad_set_event_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_asf_demux_sink_event)); + gst_pad_set_activate_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_asf_demux_activate)); + gst_pad_set_activatemode_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_asf_demux_activate_mode)); + gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); + + /* set initial state */ + gst_asf_demux_reset (demux, FALSE); +} + +static gboolean +gst_asf_demux_activate (GstPad * sinkpad, GstObject * parent) +{ + GstQuery *query; + gboolean pull_mode; + + query = gst_query_new_scheduling (); + + if (!gst_pad_peer_query (sinkpad, query)) { + gst_query_unref (query); + goto activate_push; + } + + pull_mode = gst_query_has_scheduling_mode_with_flags (query, + GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); + gst_query_unref (query); + + if (!pull_mode) + goto activate_push; + + GST_DEBUG_OBJECT (sinkpad, "activating pull"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); + +activate_push: + { + GST_DEBUG_OBJECT (sinkpad, "activating push"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); + } +} + +static gboolean +gst_asf_demux_activate_mode (GstPad * sinkpad, GstObject * parent, + GstPadMode mode, gboolean active) +{ + gboolean res; + GstASFDemux *demux; + + demux = GST_ASF_DEMUX (parent); + + switch (mode) { + case GST_PAD_MODE_PUSH: + demux->state = GST_ASF_DEMUX_STATE_HEADER; + demux->streaming = TRUE; + res = TRUE; + break; + case GST_PAD_MODE_PULL: + if (active) { + demux->state = GST_ASF_DEMUX_STATE_HEADER; + demux->streaming = FALSE; + + res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_asf_demux_loop, + demux, NULL); + } else { + res = gst_pad_stop_task (sinkpad); + } + break; + default: + res = FALSE; + break; + } + return res; +} + +static gboolean +gst_asf_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstASFDemux *demux; + gboolean ret = TRUE; + + demux = GST_ASF_DEMUX (parent); + + GST_LOG_OBJECT (demux, "handling %s event", GST_EVENT_TYPE_NAME (event)); + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEGMENT:{ + const GstSegment *segment; + + gst_event_parse_segment (event, &segment); + + if (segment->format == GST_FORMAT_BYTES) { + if (demux->packet_size && segment->start > demux->data_offset) + demux->packet = (segment->start - demux->data_offset) / + demux->packet_size; + else + demux->packet = 0; + } else if (segment->format == GST_FORMAT_TIME) { + /* do not know packet position, not really a problem */ + demux->packet = -1; + } else { + GST_WARNING_OBJECT (demux, "unsupported newsegment format, ignoring"); + gst_event_unref (event); + break; + } + + /* record upstream segment for interpolation */ + if (segment->format != demux->in_segment.format) + gst_segment_init (&demux->in_segment, GST_FORMAT_UNDEFINED); + gst_segment_copy_into (segment, &demux->in_segment); + + /* in either case, clear some state and generate newsegment later on */ + GST_OBJECT_LOCK (demux); + demux->segment_ts = GST_CLOCK_TIME_NONE; + demux->in_gap = GST_CLOCK_TIME_NONE; + demux->need_newsegment = TRUE; + demux->segment_seqnum = gst_event_get_seqnum (event); + gst_asf_demux_reset_stream_state_after_discont (demux); + /* if we seek back after reaching EOS, go back to packet reading state */ + if (demux->data_offset > 0 && segment->start >= demux->data_offset + && demux->state == GST_ASF_DEMUX_STATE_INDEX) { + demux->state = GST_ASF_DEMUX_STATE_DATA; + } + GST_OBJECT_UNLOCK (demux); + + gst_event_unref (event); + break; + } + case GST_EVENT_EOS:{ + GstFlowReturn flow; + + if (demux->state == GST_ASF_DEMUX_STATE_HEADER) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (_("This stream contains no data.")), + ("got eos and didn't receive a complete header object")); + break; + } + flow = gst_asf_demux_push_complete_payloads (demux, TRUE); + if (!demux->activated_streams) { + /* If we still haven't got activated streams, the file is most likely corrupt */ + GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, + (_("This stream contains no data.")), + ("got eos and didn't receive a complete header object")); + break; + } + if (flow < GST_FLOW_EOS || flow == GST_FLOW_NOT_LINKED) { + GST_ELEMENT_FLOW_ERROR (demux, flow); + break; + } + + GST_OBJECT_LOCK (demux); + gst_adapter_clear (demux->adapter); + GST_OBJECT_UNLOCK (demux); + gst_asf_demux_send_event_unlocked (demux, event); + break; + } + + case GST_EVENT_FLUSH_STOP: + GST_OBJECT_LOCK (demux); + gst_asf_demux_reset_stream_state_after_discont (demux); + GST_OBJECT_UNLOCK (demux); + gst_asf_demux_send_event_unlocked (demux, event); + /* upon activation, latency is no longer introduced, e.g. after seek */ + if (demux->activated_streams) + demux->latency = 0; + break; + + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; +} + +static gboolean +gst_asf_demux_seek_index_lookup (GstASFDemux * demux, guint * packet, + GstClockTime seek_time, GstClockTime * p_idx_time, guint * speed, + gboolean next, gboolean * eos) +{ + GstClockTime idx_time; + guint idx; + + if (eos) + *eos = FALSE; + + if (G_UNLIKELY (demux->sidx_num_entries == 0 || demux->sidx_interval == 0)) + return FALSE; + + idx = (guint) ((seek_time + demux->preroll) / demux->sidx_interval); + + if (next) { + /* if we want the next keyframe, we have to go forward till we find + a different packet number */ + guint idx2; + if (idx >= demux->sidx_num_entries - 1) { + /* If we get here, we're asking for next keyframe after the last one. There isn't one. */ + if (eos) + *eos = TRUE; + return FALSE; + } + for (idx2 = idx + 1; idx2 < demux->sidx_num_entries; ++idx2) { + if (demux->sidx_entries[idx].packet != demux->sidx_entries[idx2].packet) { + idx = idx2; + break; + } + } + } + + if (G_UNLIKELY (idx >= demux->sidx_num_entries)) { + if (eos) + *eos = TRUE; + return FALSE; + } + + *packet = demux->sidx_entries[idx].packet; + if (speed) + *speed = demux->sidx_entries[idx].count; + + /* so we get closer to the actual time of the packet ... actually, let's not + * do this, since we throw away superfluous payloads before the seek position + * anyway; this way, our key unit seek 'snap resolution' is a bit better + * (ie. same as index resolution) */ + /* + while (idx > 0 && demux->sidx_entries[idx-1] == demux->sidx_entries[idx]) + --idx; + */ + + idx_time = demux->sidx_interval * idx; + if (G_LIKELY (idx_time >= demux->preroll)) + idx_time -= demux->preroll; + + GST_DEBUG_OBJECT (demux, "%" GST_TIME_FORMAT " => packet %u at %" + GST_TIME_FORMAT, GST_TIME_ARGS (seek_time), *packet, + GST_TIME_ARGS (idx_time)); + + if (G_LIKELY (p_idx_time)) + *p_idx_time = idx_time; + + return TRUE; +} + +static void +gst_asf_demux_reset_stream_state_after_discont (GstASFDemux * demux) +{ + guint n; + + gst_adapter_clear (demux->adapter); + + GST_DEBUG_OBJECT (demux, "reset stream state"); + + gst_flow_combiner_reset (demux->flowcombiner); + for (n = 0; n < demux->num_streams; n++) { + demux->stream[n].discont = TRUE; + demux->stream[n].first_buffer = TRUE; + + while (demux->stream[n].payloads->len > 0) { + AsfPayload *payload; + guint last; + + last = demux->stream[n].payloads->len - 1; + payload = &g_array_index (demux->stream[n].payloads, AsfPayload, last); + gst_buffer_replace (&payload->buf, NULL); + g_array_remove_index (demux->stream[n].payloads, last); + } + } +} + +static void +gst_asf_demux_mark_discont (GstASFDemux * demux) +{ + guint n; + + GST_DEBUG_OBJECT (demux, "Mark stream discont"); + + for (n = 0; n < demux->num_streams; n++) + demux->stream[n].discont = TRUE; +} + +/* do a seek in push based mode */ +static gboolean +gst_asf_demux_handle_seek_push (GstASFDemux * demux, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + guint packet; + gboolean res; + GstEvent *byte_event; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + stop_type = GST_SEEK_TYPE_NONE; + stop = -1; + + GST_DEBUG_OBJECT (demux, "seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (cur)); + + /* determine packet, by index or by estimation */ + if (!gst_asf_demux_seek_index_lookup (demux, &packet, cur, NULL, NULL, FALSE, + NULL)) { + packet = + (guint) gst_util_uint64_scale (demux->num_packets, cur, + demux->play_time); + } + + if (packet > demux->num_packets) { + GST_DEBUG_OBJECT (demux, "could not determine packet to seek to, " + "seek aborted."); + return FALSE; + } + + GST_DEBUG_OBJECT (demux, "seeking to packet %d", packet); + + cur = demux->data_offset + ((guint64) packet * demux->packet_size); + + GST_DEBUG_OBJECT (demux, "Pushing BYTE seek rate %g, " + "start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, rate, cur, stop); + /* BYTE seek event */ + byte_event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, + cur, stop_type, stop); + gst_event_set_seqnum (byte_event, gst_event_get_seqnum (event)); + res = gst_pad_push_event (demux->sinkpad, byte_event); + + return res; +} + +static gboolean +gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) +{ + gboolean ret = TRUE; + GstClockTime idx_time; + GstSegment segment; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + GstFormat format; + gboolean only_need_update; + gboolean after, before, next; + gboolean flush; + gdouble rate; + gint64 cur, stop; + gint64 seek_time; + guint packet, speed_count = 1; + gboolean eos; + guint32 seqnum; + GstEvent *fevent; + gint i; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + if (G_UNLIKELY (format != GST_FORMAT_TIME)) { + GST_LOG_OBJECT (demux, "seeking is only supported in TIME format"); + return FALSE; + } + + if (G_UNLIKELY (demux->seekable == FALSE || demux->packet_size == 0 || + demux->num_packets == 0 || demux->play_time == 0)) { + GST_LOG_OBJECT (demux, "stream is not seekable"); + return FALSE; + } + + if (G_UNLIKELY (!demux->activated_streams)) { + GST_LOG_OBJECT (demux, "streams not yet activated, ignoring seek"); + return FALSE; + } + + if (G_UNLIKELY (rate <= 0.0)) { + GST_LOG_OBJECT (demux, "backward playback"); + demux->seek_to_cur_pos = TRUE; + for (i = 0; i < demux->num_streams; i++) { + demux->stream[i].reverse_kf_ready = FALSE; + } + } + + seqnum = gst_event_get_seqnum (event); + flush = ((flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); + demux->accurate = + ((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE); + demux->keyunit_sync = + ((flags & GST_SEEK_FLAG_KEY_UNIT) == GST_SEEK_FLAG_KEY_UNIT); + after = ((flags & GST_SEEK_FLAG_SNAP_AFTER) == GST_SEEK_FLAG_SNAP_AFTER); + before = ((flags & GST_SEEK_FLAG_SNAP_BEFORE) == GST_SEEK_FLAG_SNAP_BEFORE); + next = after && !before; + + if (G_UNLIKELY (demux->streaming)) { + /* upstream might handle TIME seek, e.g. mms or rtsp, or not, e.g. http, + * so first try to let it handle the seek event. */ + if (gst_pad_push_event (demux->sinkpad, gst_event_ref (event))) + return TRUE; + + /* support it safely needs more segment handling, e.g. closing etc */ + if (!flush) { + GST_LOG_OBJECT (demux, "streaming; non-flushing seek not supported"); + return FALSE; + } + /* we can (re)construct the start later on, but not the end */ + if (stop_type != GST_SEEK_TYPE_NONE && + (stop_type != GST_SEEK_TYPE_SET || GST_CLOCK_TIME_IS_VALID (stop))) { + GST_LOG_OBJECT (demux, "streaming; end position must be NONE"); + return FALSE; + } + return gst_asf_demux_handle_seek_push (demux, event); + } + + /* unlock the streaming thread */ + if (G_LIKELY (flush)) { + fevent = gst_event_new_flush_start (); + + gst_event_set_seqnum (fevent, seqnum); + gst_pad_push_event (demux->sinkpad, gst_event_ref (fevent)); + gst_asf_demux_send_event_unlocked (demux, fevent); + } else { + gst_pad_pause_task (demux->sinkpad); + } + + /* grab the stream lock so that streaming cannot continue, for + * non flushing seeks when the element is in PAUSED this could block + * forever */ + GST_PAD_STREAM_LOCK (demux->sinkpad); + + if (G_LIKELY (flush)) { + /* we now can stop flushing, since we have the stream lock now */ + fevent = gst_event_new_flush_stop (TRUE); + gst_event_set_seqnum (fevent, seqnum); + gst_pad_push_event (demux->sinkpad, gst_event_ref (fevent)); + gst_asf_demux_send_event_unlocked (demux, fevent); + } + + /* operating on copy of segment until we know the seek worked */ + segment = demux->segment; + + if (!gst_segment_do_seek (&segment, rate, format, flags, cur_type, + cur, stop_type, stop, &only_need_update)) { + ret = FALSE; + goto skip; + } + + GST_DEBUG_OBJECT (demux, "seeking to time %" GST_TIME_FORMAT ", segment: " + "%" GST_SEGMENT_FORMAT, GST_TIME_ARGS (segment.start), &segment); + + if (cur_type != GST_SEEK_TYPE_SET) + seek_time = segment.start; + else + seek_time = cur; + + /* FIXME: should check the KEY_UNIT flag; need to adjust position to + * real start of data and segment_start to indexed time for key unit seek*/ + if (G_UNLIKELY (!gst_asf_demux_seek_index_lookup (demux, &packet, seek_time, + &idx_time, &speed_count, next, &eos))) { + gint64 offset; + + if (eos) { + demux->packet = demux->num_packets; + goto skip; + } + + /* First try to query our source to see if it can convert for us. This is + the case when our source is an mms stream, notice that in this case + gstmms will do a time based seek to get the byte offset, this is not a + problem as the seek to this offset needs to happen anyway. */ + if (gst_pad_peer_query_convert (demux->sinkpad, GST_FORMAT_TIME, seek_time, + GST_FORMAT_BYTES, &offset)) { + packet = (offset - demux->data_offset) / demux->packet_size; + GST_LOG_OBJECT (demux, "convert %" GST_TIME_FORMAT + " to bytes query result: %" G_GINT64_FORMAT ", data_ofset: %" + G_GINT64_FORMAT ", packet_size: %u," " resulting packet: %u\n", + GST_TIME_ARGS (seek_time), offset, demux->data_offset, + demux->packet_size, packet); + } else { + /* FIXME: For streams containing video, seek to an earlier position in + * the hope of hitting a keyframe and let the sinks throw away the stuff + * before the segment start. For audio-only this is unnecessary as every + * frame is 'key'. */ + if (flush && (demux->accurate || (demux->keyunit_sync && !next)) + && demux->num_video_streams > 0) { + seek_time -= 5 * GST_SECOND; + if (seek_time < 0) + seek_time = 0; + } + + packet = (guint) gst_util_uint64_scale (demux->num_packets, + seek_time, demux->play_time); + + if (packet > demux->num_packets) + packet = demux->num_packets; + } + } else { + if (G_LIKELY (demux->keyunit_sync && !demux->accurate)) { + GST_DEBUG_OBJECT (demux, "key unit seek, adjust seek_time = %" + GST_TIME_FORMAT " to index_time = %" GST_TIME_FORMAT, + GST_TIME_ARGS (seek_time), GST_TIME_ARGS (idx_time)); + segment.start = idx_time; + segment.position = idx_time; + segment.time = idx_time; + } + } + + GST_DEBUG_OBJECT (demux, "seeking to packet %u (%d)", packet, speed_count); + + GST_OBJECT_LOCK (demux); + demux->segment = segment; + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + demux->packet = (gint64) gst_util_uint64_scale (demux->num_packets, + stop, demux->play_time); + } else { + demux->packet = packet; + } + + demux->need_newsegment = TRUE; + demux->segment_seqnum = seqnum; + demux->speed_packets = + GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) ? 1 : speed_count; + gst_asf_demux_reset_stream_state_after_discont (demux); + GST_OBJECT_UNLOCK (demux); + +skip: + /* restart our task since it might have been stopped when we did the flush */ + gst_pad_start_task (demux->sinkpad, (GstTaskFunction) gst_asf_demux_loop, + demux, NULL); + + /* streaming can continue now */ + GST_PAD_STREAM_UNLOCK (demux->sinkpad); + + return ret; +} + +static gboolean +gst_asf_demux_handle_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + GstASFDemux *demux; + gboolean ret; + guint32 seqnum; + + demux = GST_ASF_DEMUX (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + GST_LOG_OBJECT (pad, "seek event"); + seqnum = gst_event_get_seqnum (event); + if (demux->segment_seqnum == seqnum) { + GST_LOG_OBJECT (pad, + "Drop duplicated SEEK event seqnum %" G_GUINT32_FORMAT, seqnum); + gst_event_unref (event); + ret = TRUE; + break; + } + ret = gst_asf_demux_handle_seek_event (demux, event); + gst_event_unref (event); + break; + case GST_EVENT_QOS: + case GST_EVENT_NAVIGATION: + /* just drop these two silently */ + gst_event_unref (event); + ret = FALSE; + break; + default: + GST_LOG_OBJECT (pad, "%s event", GST_EVENT_TYPE_NAME (event)); + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; +} + +static inline guint32 +gst_asf_demux_identify_guid (const ASFGuidHash * guids, ASFGuid * guid) +{ + guint32 ret; + + ret = gst_asf_identify_guid (guids, guid); + + GST_LOG ("%s 0x%08x-0x%08x-0x%08x-0x%08x", + gst_asf_get_guid_nick (guids, ret), + guid->v1, guid->v2, guid->v3, guid->v4); + + return ret; +} + +typedef struct +{ + AsfObjectID id; + guint64 size; +} AsfObject; + + +/* Peek for an object. + * + * Returns FALSE is the object is corrupted (such as the reported + * object size being greater than 2**32bits. + */ +static gboolean +asf_demux_peek_object (GstASFDemux * demux, const guint8 * data, + guint data_len, AsfObject * object, gboolean expect) +{ + ASFGuid guid; + + /* Callers should have made sure that data_len is big enough */ + g_assert (data_len >= ASF_OBJECT_HEADER_SIZE); + + if (data_len < ASF_OBJECT_HEADER_SIZE) + return FALSE; + + guid.v1 = GST_READ_UINT32_LE (data + 0); + guid.v2 = GST_READ_UINT32_LE (data + 4); + guid.v3 = GST_READ_UINT32_LE (data + 8); + guid.v4 = GST_READ_UINT32_LE (data + 12); + + /* FIXME: make asf_demux_identify_object_guid() */ + object->id = gst_asf_demux_identify_guid (asf_object_guids, &guid); + if (object->id == ASF_OBJ_UNDEFINED && expect) { + GST_WARNING_OBJECT (demux, "Unknown object %08x-%08x-%08x-%08x", + guid.v1, guid.v2, guid.v3, guid.v4); + } + + object->size = GST_READ_UINT64_LE (data + 16); + if (object->id != ASF_OBJ_DATA && object->size >= G_MAXUINT) { + GST_WARNING_OBJECT (demux, + "ASF Object size corrupted (greater than 32bit)"); + return FALSE; + } + + + return TRUE; +} + +static void +gst_asf_demux_release_old_pads (GstASFDemux * demux) +{ + GST_DEBUG_OBJECT (demux, "Releasing old pads"); + + while (demux->old_num_streams > 0) { + gst_pad_push_event (demux->old_stream[demux->old_num_streams - 1].pad, + gst_event_new_eos ()); + gst_asf_demux_free_stream (demux, + &demux->old_stream[demux->old_num_streams - 1]); + --demux->old_num_streams; + } + memset (demux->old_stream, 0, sizeof (demux->old_stream)); + demux->old_num_streams = 0; +} + +static GstFlowReturn +gst_asf_demux_chain_headers (GstASFDemux * demux) +{ + AsfObject obj; + guint8 *header_data, *data = NULL; + const guint8 *cdata = NULL; + guint64 header_size; + GstFlowReturn flow = GST_FLOW_OK; + + cdata = (guint8 *) gst_adapter_map (demux->adapter, ASF_OBJECT_HEADER_SIZE); + if (cdata == NULL) + goto need_more_data; + + if (!asf_demux_peek_object (demux, cdata, ASF_OBJECT_HEADER_SIZE, &obj, TRUE)) + goto parse_failed; + if (obj.id != ASF_OBJ_HEADER) + goto wrong_type; + + GST_LOG_OBJECT (demux, "header size = %u", (guint) obj.size); + + /* + 50 for non-packet data at beginning of ASF_OBJ_DATA */ + if (gst_adapter_available (demux->adapter) < obj.size + 50) + goto need_more_data; + + data = gst_adapter_take (demux->adapter, obj.size + 50); + + header_data = data; + header_size = obj.size; + flow = gst_asf_demux_process_object (demux, &header_data, &header_size); + if (flow != GST_FLOW_OK) + goto parse_failed; + + /* calculate where the packet data starts */ + demux->data_offset = obj.size + 50; + + /* now parse the beginning of the ASF_OBJ_DATA object */ + if (!gst_asf_demux_parse_data_object_start (demux, data + obj.size)) + goto wrong_type; + + if (demux->num_streams == 0) + goto no_streams; + + g_free (data); + return GST_FLOW_OK; + +/* NON-FATAL */ +need_more_data: + { + GST_LOG_OBJECT (demux, "not enough data in adapter yet"); + return GST_FLOW_OK; + } + +/* ERRORS */ +wrong_type: + { + GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), + ("This doesn't seem to be an ASF file")); + g_free (data); + return GST_FLOW_ERROR; + } +no_streams: +parse_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("header parsing failed, or no streams found, flow = %s", + gst_flow_get_name (flow))); + g_free (data); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_asf_demux_pull_data (GstASFDemux * demux, guint64 offset, guint size, + GstBuffer ** p_buf, GstFlowReturn * p_flow) +{ + gsize buffer_size; + GstFlowReturn flow; + + GST_LOG_OBJECT (demux, "pulling buffer at %" G_GUINT64_FORMAT "+%u", + offset, size); + + flow = gst_pad_pull_range (demux->sinkpad, offset, size, p_buf); + + if (G_LIKELY (p_flow)) + *p_flow = flow; + + if (G_UNLIKELY (flow != GST_FLOW_OK)) { + GST_DEBUG_OBJECT (demux, "flow %s pulling buffer at %" G_GUINT64_FORMAT + "+%u", gst_flow_get_name (flow), offset, size); + *p_buf = NULL; + return FALSE; + } + + g_assert (*p_buf != NULL); + + buffer_size = gst_buffer_get_size (*p_buf); + if (G_UNLIKELY (buffer_size < size)) { + GST_DEBUG_OBJECT (demux, "short read pulling buffer at %" G_GUINT64_FORMAT + "+%u (got only %" G_GSIZE_FORMAT " bytes)", offset, size, buffer_size); + gst_buffer_unref (*p_buf); + if (G_LIKELY (p_flow)) + *p_flow = GST_FLOW_EOS; + *p_buf = NULL; + return FALSE; + } + + return TRUE; +} + +static GstFlowReturn +gst_asf_demux_pull_indices (GstASFDemux * demux) +{ + GstBuffer *buf = NULL; + guint64 offset; + guint num_read = 0; + GstFlowReturn ret = GST_FLOW_OK; + + offset = demux->index_offset; + + if (G_UNLIKELY (offset == 0)) { + GST_DEBUG_OBJECT (demux, "can't read indices, don't know index offset"); + /* non-fatal */ + return GST_FLOW_OK; + } + + while (gst_asf_demux_pull_data (demux, offset, 16 + 8, &buf, NULL)) { + AsfObject obj; + GstMapInfo map; + guint8 *bufdata; + guint64 obj_size; + + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= 16 + 8); + if (!asf_demux_peek_object (demux, map.data, 16 + 8, &obj, TRUE)) { + GST_DEBUG_OBJECT (demux, "No valid object, corrupted index, ignoring"); + GST_MEMDUMP_OBJECT (demux, "Corrupted index ?", map.data, MIN (map.size, + 64)); + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + /* Non-fatal, return */ + break; + } + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + + /* check for sanity */ + if (G_UNLIKELY (obj.size > (5 * 1024 * 1024))) { + GST_DEBUG_OBJECT (demux, "implausible index object size, bailing out"); + break; + } + + if (G_UNLIKELY (!gst_asf_demux_pull_data (demux, offset, obj.size, &buf, + NULL))) + break; + + GST_LOG_OBJECT (demux, "index object at offset 0x%" G_GINT64_MODIFIER "X" + ", size %u", offset, (guint) obj.size); + + offset += obj.size; /* increase before _process_object changes it */ + + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= obj.size); + bufdata = (guint8 *) map.data; + obj_size = obj.size; + ret = gst_asf_demux_process_object (demux, &bufdata, &obj_size); + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + + if (ret == ASF_FLOW_NEED_MORE_DATA) { + /* Since indices are at the end of the file, if we need more data, + * we consider it as a non-fatal corrupted index */ + ret = GST_FLOW_OK; + break; + } + + if (G_UNLIKELY (ret != GST_FLOW_OK)) + break; + + ++num_read; + } + + GST_DEBUG_OBJECT (demux, "read %u index objects , returning %s", num_read, + gst_flow_get_name (ret)); + return ret; +} + +static gboolean +gst_asf_demux_parse_data_object_start (GstASFDemux * demux, guint8 * data) +{ + AsfObject obj; + + if (!asf_demux_peek_object (demux, data, 50, &obj, TRUE)) { + GST_WARNING_OBJECT (demux, "Corrupted data"); + return FALSE; + } + if (obj.id != ASF_OBJ_DATA) { + GST_WARNING_OBJECT (demux, "headers not followed by a DATA object"); + return FALSE; + } + + demux->state = GST_ASF_DEMUX_STATE_DATA; + + if (!demux->broadcast && obj.size > 50) { + demux->data_size = obj.size - 50; + /* CHECKME: for at least one file this is off by +158 bytes?! */ + demux->index_offset = demux->data_offset + demux->data_size; + } else { + demux->data_size = 0; + demux->index_offset = 0; + } + + demux->packet = 0; + + if (!demux->broadcast) { + /* skip object header (24 bytes) and file GUID (16 bytes) */ + demux->num_packets = GST_READ_UINT64_LE (data + (16 + 8) + 16); + } else { + demux->num_packets = 0; + } + + if (demux->num_packets == 0) + demux->seekable = FALSE; + + /* fallback in the unlikely case that headers are inconsistent, can't hurt */ + if (demux->data_size == 0 && demux->num_packets > 0) { + demux->data_size = demux->num_packets * demux->packet_size; + demux->index_offset = demux->data_offset + demux->data_size; + } + + /* process pending stream objects and create pads for those */ + gst_asf_demux_process_queued_extended_stream_objects (demux); + + GST_INFO_OBJECT (demux, "Stream has %" G_GUINT64_FORMAT " packets, " + "data_offset=%" G_GINT64_FORMAT ", data_size=%" G_GINT64_FORMAT + ", index_offset=%" G_GUINT64_FORMAT, demux->num_packets, + demux->data_offset, demux->data_size, demux->index_offset); + + return TRUE; +} + +static gboolean +gst_asf_demux_pull_headers (GstASFDemux * demux, GstFlowReturn * pflow) +{ + GstFlowReturn flow = GST_FLOW_OK; + AsfObject obj; + GstBuffer *buf = NULL; + guint64 size; + GstMapInfo map; + guint8 *bufdata; + + GST_LOG_OBJECT (demux, "reading headers"); + + /* pull HEADER object header, so we know its size */ + if (!gst_asf_demux_pull_data (demux, demux->base_offset, 16 + 8, &buf, &flow)) + goto read_failed; + + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= 16 + 8); + if (!asf_demux_peek_object (demux, map.data, 16 + 8, &obj, TRUE)) { + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + flow = GST_FLOW_ERROR; + goto read_failed; + } + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + + if (obj.id != ASF_OBJ_HEADER) + goto wrong_type; + + GST_LOG_OBJECT (demux, "header size = %" G_GUINT64_FORMAT, obj.size); + + /* pull HEADER object */ + if (!gst_asf_demux_pull_data (demux, demux->base_offset, obj.size, &buf, + &flow)) + goto read_failed; + + size = obj.size; /* don't want obj.size changed */ + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= size); + bufdata = (guint8 *) map.data; + flow = gst_asf_demux_process_object (demux, &bufdata, &size); + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + + if (flow != GST_FLOW_OK) { + GST_WARNING_OBJECT (demux, "process_object: %s", gst_flow_get_name (flow)); + goto parse_failed; + } + + /* calculate where the packet data starts */ + demux->data_offset = demux->base_offset + obj.size + 50; + + /* now pull beginning of DATA object before packet data */ + if (!gst_asf_demux_pull_data (demux, demux->base_offset + obj.size, 50, &buf, + &flow)) + goto read_failed; + + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= size); + bufdata = (guint8 *) map.data; + if (!gst_asf_demux_parse_data_object_start (demux, bufdata)) + goto wrong_type; + + if (demux->num_streams == 0) + goto no_streams; + + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + + return TRUE; + +/* ERRORS */ +wrong_type: + { + if (buf != NULL) { + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + } + GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), + ("This doesn't seem to be an ASF file")); + *pflow = GST_FLOW_ERROR; + return FALSE; + } + +no_streams: + flow = GST_FLOW_ERROR; + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("header parsing failed, or no streams found, flow = %s", + gst_flow_get_name (flow))); +read_failed: +parse_failed: + { + if (buf) + gst_buffer_unmap (buf, &map); + gst_buffer_replace (&buf, NULL); + if (flow == ASF_FLOW_NEED_MORE_DATA) + flow = GST_FLOW_ERROR; + *pflow = flow; + return FALSE; + } +} + +static gboolean +all_streams_prerolled (GstASFDemux * demux) +{ + GstClockTime preroll_time; + guint i, num_no_data = 0; + AsfStreamType prerolled_types = 0, all_types = 0; + + /* Allow at least 500ms of preroll_time */ + preroll_time = MAX (demux->preroll, 500 * GST_MSECOND); + + /* returns TRUE as long as there isn't a stream which (a) has data queued + * and (b) the timestamp of last piece of data queued is < demux->preroll + * AND there is at least one other stream with data queued */ + for (i = 0; i < demux->num_streams; ++i) { + AsfPayload *last_payload = NULL; + AsfStream *stream; + gint last_idx; + + stream = &demux->stream[i]; + + all_types |= stream->type; + + if (G_UNLIKELY (stream->payloads->len == 0)) { + ++num_no_data; + GST_LOG_OBJECT (stream->pad, "no data queued"); + continue; + } + + prerolled_types |= stream->type; + + /* find last payload with timestamp */ + for (last_idx = stream->payloads->len - 1; + last_idx >= 0 && (last_payload == NULL + || !GST_CLOCK_TIME_IS_VALID (last_payload->ts)); --last_idx) { + last_payload = &g_array_index (stream->payloads, AsfPayload, last_idx); + } + + GST_LOG_OBJECT (stream->pad, "checking if %" GST_TIME_FORMAT " > %" + GST_TIME_FORMAT, GST_TIME_ARGS (last_payload->ts), + GST_TIME_ARGS (preroll_time)); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (last_payload->ts) + || last_payload->ts <= preroll_time)) { + GST_LOG_OBJECT (stream->pad, "not beyond preroll point yet"); + return FALSE; + } + } + + GST_LOG_OBJECT (demux, "all_types:%d prerolled_types:%d", + all_types, prerolled_types); + + /* If streams of each present type have prerolled, we are good to go */ + if (all_types != 0 && prerolled_types == all_types) + return TRUE; + + if (G_UNLIKELY (num_no_data > 0)) + return FALSE; + + return TRUE; +} + +#if 0 +static gboolean +gst_asf_demux_have_mutually_exclusive_active_stream (GstASFDemux * demux, + AsfStream * stream) +{ + GSList *l; + + for (l = demux->mut_ex_streams; l != NULL; l = l->next) { + guint8 *mes; + + /* check for each mutual exclusion group whether it affects this stream */ + for (mes = (guint8 *) l->data; mes != NULL && *mes != 0xff; ++mes) { + if (*mes == stream->id) { + /* we are in this group; let's check if we've already activated streams + * that are in the same group (and hence mutually exclusive to this + * one) */ + for (mes = (guint8 *) l->data; mes != NULL && *mes != 0xff; ++mes) { + guint i; + + for (i = 0; i < demux->num_streams; ++i) { + if (demux->stream[i].id == *mes && demux->stream[i].active) { + GST_LOG_OBJECT (demux, "stream with ID %d is mutually exclusive " + "to already active stream with ID %d", stream->id, + demux->stream[i].id); + return TRUE; + } + } + } + /* we can only be in this group once, let's break out and move on to + * the next mutual exclusion group */ + break; + } + } + } + + return FALSE; +} +#endif + +static void +gst_asf_demux_check_segment_ts (GstASFDemux * demux, GstClockTime payload_ts) +{ + /* remember the first queued timestamp for the segment */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (demux->segment_ts) && + GST_CLOCK_TIME_IS_VALID (demux->first_ts))) { + GST_DEBUG_OBJECT (demux, "segment ts: %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->first_ts)); + demux->segment_ts = payload_ts; + /* always note, but only determines segment when streaming */ + if (demux->streaming) + if (!gst_segment_do_seek (&demux->segment, demux->in_segment.rate, + GST_FORMAT_TIME, (GstSeekFlags) demux->segment.flags, + GST_SEEK_TYPE_SET, demux->segment_ts, GST_SEEK_TYPE_NONE, 0, + NULL)) { + GST_WARNING_OBJECT (demux, "Initial segment seek failed"); + } + } +} + +static gboolean +gst_asf_demux_get_first_ts (GstASFDemux * demux) +{ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (demux->first_ts))) { + GstClockTime first_ts = GST_CLOCK_TIME_NONE; + int i; + + /* go trhough each stream, find smallest timestamp */ + for (i = 0; i < demux->num_streams; ++i) { + AsfStream *stream; + int j; + GstClockTime stream_min_ts = GST_CLOCK_TIME_NONE; + GstClockTime stream_min_ts2 = GST_CLOCK_TIME_NONE; /* second smallest timestamp */ + stream = &demux->stream[i]; + + for (j = 0; j < stream->payloads->len; ++j) { + AsfPayload *payload = &g_array_index (stream->payloads, AsfPayload, j); + if (GST_CLOCK_TIME_IS_VALID (payload->ts) && + (!GST_CLOCK_TIME_IS_VALID (stream_min_ts) + || stream_min_ts > payload->ts)) { + stream_min_ts = payload->ts; + } + if (GST_CLOCK_TIME_IS_VALID (payload->ts) && + payload->ts > stream_min_ts && + (!GST_CLOCK_TIME_IS_VALID (stream_min_ts2) + || stream_min_ts2 > payload->ts)) { + stream_min_ts2 = payload->ts; + } + } + + /* there are some DVR ms files where first packet has TS of 0 (instead of -1) while subsequent packets have + regular (singificantly larger) timestamps. If we don't deal with it, we may end up with huge gap in timestamps + which makes playback stuck. The 0 timestamp may also be valid though, if the second packet timestamp continues + from it. I haven't found a better way to distinguish between these two, except to set an arbitrary boundary + and disregard the first 0 timestamp if the second timestamp is bigger than the boundary) */ + + GST_DEBUG_OBJECT (demux, + "stream #%u stream_min_ts %" GST_TIME_FORMAT " stream_min_ts2 %" + GST_TIME_FORMAT, stream->id, GST_TIME_ARGS (stream_min_ts), + GST_TIME_ARGS (stream_min_ts2)); + + if (stream_min_ts == 0 && stream_min_ts2 > GST_SECOND) /* first timestamp is 0 and second is significantly larger, disregard the 0 */ + stream_min_ts = stream_min_ts2; + + if (GST_CLOCK_TIME_IS_VALID (stream_min_ts) && + (!GST_CLOCK_TIME_IS_VALID (first_ts) || first_ts > stream_min_ts)) + first_ts = stream_min_ts; + } + + if (!GST_CLOCK_TIME_IS_VALID (first_ts)) /* can happen */ + first_ts = 0; + + demux->first_ts = first_ts; + + /* update packets queued before we knew first timestamp */ + for (i = 0; i < demux->num_streams; ++i) { + AsfStream *stream; + int j; + stream = &demux->stream[i]; + + for (j = 0; j < stream->payloads->len; ++j) { + AsfPayload *payload = &g_array_index (stream->payloads, AsfPayload, j); + if (GST_CLOCK_TIME_IS_VALID (payload->ts)) { + if (payload->ts > first_ts) + payload->ts -= first_ts; + else + payload->ts = 0; + } + } + } + } + + gst_asf_demux_check_segment_ts (demux, 0); + + return TRUE; +} + +static gboolean +gst_asf_demux_update_caps_from_payload (GstASFDemux * demux, AsfStream * stream) +{ + /* try to determine whether the stream is AC-3 or MPEG; In dvr-ms the codecTag is unreliable + and often set wrong, inspecting the data is the only way that seem to be working */ + GstTypeFindProbability prob = GST_TYPE_FIND_NONE; + GstCaps *caps = NULL; + int i; + GstAdapter *adapter = gst_adapter_new (); + + for (i = 0; i < stream->payloads->len && prob < GST_TYPE_FIND_LIKELY; ++i) { + const guint8 *data; + AsfPayload *payload; + int len; + + payload = &g_array_index (stream->payloads, AsfPayload, i); + gst_adapter_push (adapter, gst_buffer_ref (payload->buf)); + len = gst_adapter_available (adapter); + data = gst_adapter_map (adapter, len); + + again: + +#define MIN_LENGTH 128 + + /* look for the sync points */ + while (TRUE) { + if (len < MIN_LENGTH || /* give typefind something to work on */ + (data[0] == 0x0b && data[1] == 0x77) || /* AC-3 sync point */ + (data[0] == 0xFF && ((data[1] & 0xF0) >> 4) == 0xF)) /* MPEG sync point */ + break; + ++data; + --len; + } + + gst_caps_take (&caps, gst_type_find_helper_for_data (GST_OBJECT (demux), + data, len, &prob)); + + if (prob < GST_TYPE_FIND_LIKELY) { + ++data; + --len; + if (len > MIN_LENGTH) + /* this wasn't it, look for another sync point */ + goto again; + } + + gst_adapter_unmap (adapter); + } + + gst_object_unref (adapter); + + if (caps) { + gst_caps_take (&stream->caps, caps); + return TRUE; + } else { + return FALSE; + } +} + +static gboolean +gst_asf_demux_check_activate_streams (GstASFDemux * demux, gboolean force) +{ + guint i, actual_streams = 0; + + if (demux->activated_streams) + return TRUE; + + if (!all_streams_prerolled (demux) && !force) { + GST_DEBUG_OBJECT (demux, "not all streams with data beyond preroll yet"); + return FALSE; + } + + if (G_UNLIKELY (!gst_asf_demux_get_first_ts (demux))) + return FALSE; + + for (i = 0; i < demux->num_streams; ++i) { + AsfStream *stream = &demux->stream[i]; + + if (stream->payloads->len > 0) { + + if (stream->inspect_payload && /* dvr-ms required payload inspection */ + !stream->active && /* do not inspect active streams (caps were already set) */ + !gst_asf_demux_update_caps_from_payload (demux, stream) && /* failed to determine caps */ + stream->payloads->len < 20) { /* if we couldn't determine the caps from 20 packets then just give up and use whatever was in codecTag */ + /* try to gather some more data */ + return FALSE; + } + /* we don't check mutual exclusion stuff here; either we have data for + * a stream, then we active it, or we don't, then we'll ignore it */ + GST_LOG_OBJECT (stream->pad, "is prerolled - activate!"); + gst_asf_demux_activate_stream (demux, stream); + actual_streams += 1; + } else { + GST_LOG_OBJECT (stream->pad, "no data, ignoring stream"); + } + } + + if (actual_streams == 0) { + /* We don't have any streams activated ! */ + GST_ERROR_OBJECT (demux, "No streams activated!"); + return FALSE; + } + + gst_asf_demux_release_old_pads (demux); + + demux->activated_streams = TRUE; + GST_LOG_OBJECT (demux, "signalling no more pads"); + gst_element_no_more_pads (GST_ELEMENT (demux)); + return TRUE; +} + +/* returns the stream that has a complete payload with the lowest timestamp + * queued, or NULL (we push things by timestamp because during the internal + * prerolling we might accumulate more data then the external queues can take, + * so we'd lock up if we pushed all accumulated data for stream N in one go) */ +static AsfStream * +gst_asf_demux_find_stream_with_complete_payload (GstASFDemux * demux) +{ + AsfPayload *best_payload = NULL; + AsfStream *best_stream = NULL; + guint i; + + for (i = 0; i < demux->num_streams; ++i) { + AsfStream *stream; + int j; + + stream = &demux->stream[i]; + + /* Don't push any data until we have at least one payload that falls within + * the current segment. This way we can remove out-of-segment payloads that + * don't need to be decoded after a seek, sending only data from the + * keyframe directly before our segment start */ + if (stream->payloads->len > 0) { + AsfPayload *payload = NULL; + gint last_idx; + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + /* Reverse playback */ + + if (stream->is_video) { + /* We have to push payloads from KF to the first frame we accumulated (reverse order) */ + if (stream->reverse_kf_ready) { + payload = + &g_array_index (stream->payloads, AsfPayload, stream->kf_pos); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (payload->ts))) { + /* TODO : remove payload from the list? */ + continue; + } + } else { + continue; + } + } else { + /* find first complete payload with timestamp */ + for (j = stream->payloads->len - 1; + j >= 0 && (payload == NULL + || !GST_CLOCK_TIME_IS_VALID (payload->ts)); --j) { + payload = &g_array_index (stream->payloads, AsfPayload, j); + } + + /* If there's a complete payload queued for this stream */ + if (!gst_asf_payload_is_complete (payload)) + continue; + + } + } else { + + /* find last payload with timestamp */ + for (last_idx = stream->payloads->len - 1; + last_idx >= 0 && (payload == NULL + || !GST_CLOCK_TIME_IS_VALID (payload->ts)); --last_idx) { + payload = &g_array_index (stream->payloads, AsfPayload, last_idx); + } + + /* if this is first payload after seek we might need to update the segment */ + if (GST_CLOCK_TIME_IS_VALID (payload->ts)) + gst_asf_demux_check_segment_ts (demux, payload->ts); + + if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) && + (payload->ts < demux->segment.start))) { + if (G_UNLIKELY ((demux->keyunit_sync) && (!demux->accurate) + && payload->keyframe)) { + GST_DEBUG_OBJECT (stream->pad, + "Found keyframe, updating segment start to %" GST_TIME_FORMAT, + GST_TIME_ARGS (payload->ts)); + demux->segment.start = payload->ts; + demux->segment.time = payload->ts; + } else { + GST_DEBUG_OBJECT (stream->pad, "Last queued payload has timestamp %" + GST_TIME_FORMAT " which is before our segment start %" + GST_TIME_FORMAT ", not pushing yet", + GST_TIME_ARGS (payload->ts), + GST_TIME_ARGS (demux->segment.start)); + continue; + } + } + payload = NULL; + /* find first complete payload with timestamp */ + for (j = 0; + j < stream->payloads->len && (payload == NULL + || !GST_CLOCK_TIME_IS_VALID (payload->ts)); ++j) { + payload = &g_array_index (stream->payloads, AsfPayload, j); + } + + /* Now see if there's a complete payload queued for this stream */ + if (!gst_asf_payload_is_complete (payload)) + continue; + } + + /* ... and whether its timestamp is lower than the current best */ + if (best_stream == NULL || best_payload->ts > payload->ts) { + best_stream = stream; + best_payload = payload; + } + } + } + + return best_stream; +} + +static GstFlowReturn +gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) +{ + AsfStream *stream; + GstFlowReturn ret = GST_FLOW_OK; + + if (G_UNLIKELY (!demux->activated_streams)) { + if (!gst_asf_demux_check_activate_streams (demux, force)) + return GST_FLOW_OK; + /* streams are now activated */ + } + + while ((stream = gst_asf_demux_find_stream_with_complete_payload (demux))) { + AsfPayload *payload; + GstClockTime timestamp = GST_CLOCK_TIME_NONE; + GstClockTime duration = GST_CLOCK_TIME_NONE; + + /* wait until we had a chance to "lock on" some payload's timestamp */ + if (G_UNLIKELY (demux->need_newsegment + && !GST_CLOCK_TIME_IS_VALID (demux->segment_ts))) + return GST_FLOW_OK; + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) && stream->is_video + && stream->payloads->len) { + payload = &g_array_index (stream->payloads, AsfPayload, stream->kf_pos); + } else { + payload = &g_array_index (stream->payloads, AsfPayload, 0); + } + + /* do we need to send a newsegment event */ + if ((G_UNLIKELY (demux->need_newsegment))) { + GstEvent *segment_event; + + /* safe default if insufficient upstream info */ + if (!GST_CLOCK_TIME_IS_VALID (demux->in_gap)) + demux->in_gap = 0; + + if (demux->segment.stop == GST_CLOCK_TIME_NONE && + demux->segment.duration > 0) { + /* slight HACK; prevent clipping of last bit */ + demux->segment.stop = demux->segment.duration + demux->in_gap; + } + + /* FIXME : only if ACCURATE ! */ + if (G_LIKELY (demux->keyunit_sync && !demux->accurate + && (GST_CLOCK_TIME_IS_VALID (payload->ts))) + && !GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + GST_DEBUG ("Adjusting newsegment start to %" GST_TIME_FORMAT, + GST_TIME_ARGS (payload->ts)); + demux->segment.start = payload->ts; + demux->segment.time = payload->ts; + } + + GST_DEBUG_OBJECT (demux, "sending new-segment event %" GST_SEGMENT_FORMAT, + &demux->segment); + + /* note: we fix up all timestamps to start from 0, so this should be ok */ + segment_event = gst_event_new_segment (&demux->segment); + if (demux->segment_seqnum) + gst_event_set_seqnum (segment_event, demux->segment_seqnum); + gst_asf_demux_send_event_unlocked (demux, segment_event); + + /* now post any global tags we may have found */ + if (demux->taglist == NULL) { + demux->taglist = gst_tag_list_new_empty (); + gst_tag_list_set_scope (demux->taglist, GST_TAG_SCOPE_GLOBAL); + } + + gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, + GST_TAG_CONTAINER_FORMAT, "ASF", NULL); + + GST_DEBUG_OBJECT (demux, "global tags: %" GST_PTR_FORMAT, demux->taglist); + gst_asf_demux_send_event_unlocked (demux, + gst_event_new_tag (demux->taglist)); + demux->taglist = NULL; + + demux->need_newsegment = FALSE; + demux->segment_running = TRUE; + } + + /* Do we have tags pending for this stream? */ + if (G_UNLIKELY (stream->pending_tags)) { + GST_LOG_OBJECT (stream->pad, "%" GST_PTR_FORMAT, stream->pending_tags); + gst_pad_push_event (stream->pad, + gst_event_new_tag (stream->pending_tags)); + stream->pending_tags = NULL; + } + + /* We have the whole packet now so we should push the packet to + * the src pad now. First though we should check if we need to do + * descrambling */ + if (G_UNLIKELY (stream->span > 1)) { + gst_asf_demux_descramble_buffer (demux, stream, &payload->buf); + } + + payload->buf = gst_buffer_make_writable (payload->buf); + + if (G_LIKELY (!payload->keyframe)) { + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DELTA_UNIT); + } + + if (G_UNLIKELY (stream->discont)) { + GST_DEBUG_OBJECT (stream->pad, "marking DISCONT on stream"); + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + if (G_UNLIKELY (stream->is_video && payload->par_x && payload->par_y && + (payload->par_x != stream->par_x) && + (payload->par_y != stream->par_y))) { + GST_DEBUG ("Updating PAR (%d/%d => %d/%d)", + stream->par_x, stream->par_y, payload->par_x, payload->par_y); + stream->par_x = payload->par_x; + stream->par_y = payload->par_y; + stream->caps = gst_caps_make_writable (stream->caps); + gst_caps_set_simple (stream->caps, "pixel-aspect-ratio", + GST_TYPE_FRACTION, stream->par_x, stream->par_y, NULL); + gst_pad_set_caps (stream->pad, stream->caps); + } + + if (G_UNLIKELY (stream->interlaced != payload->interlaced)) { + GST_DEBUG ("Updating interlaced status (%d => %d)", stream->interlaced, + payload->interlaced); + stream->interlaced = payload->interlaced; + stream->caps = gst_caps_make_writable (stream->caps); + gst_caps_set_simple (stream->caps, "interlace-mode", G_TYPE_BOOLEAN, + (stream->interlaced ? "mixed" : "progressive"), NULL); + gst_pad_set_caps (stream->pad, stream->caps); + } + + /* (sort of) interpolate timestamps using upstream "frame of reference", + * typically useful for live src, but might (unavoidably) mess with + * position reporting if a live src is playing not so live content + * (e.g. rtspsrc taking some time to fall back to tcp) */ + timestamp = payload->ts; + if (GST_CLOCK_TIME_IS_VALID (timestamp) + && !GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + timestamp += demux->in_gap; + + /* Check if we're after the segment already, if so no need to push + * anything here */ + if (demux->segment.stop != -1 && timestamp > demux->segment.stop) { + GST_DEBUG_OBJECT (stream->pad, + "Payload after segment stop %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->segment.stop)); + ret = + gst_flow_combiner_update_pad_flow (demux->flowcombiner, stream->pad, + GST_FLOW_EOS); + gst_buffer_unref (payload->buf); + payload->buf = NULL; + g_array_remove_index (stream->payloads, 0); + /* Break out as soon as we have an issue */ + if (G_UNLIKELY (ret != GST_FLOW_OK)) + break; + + continue; + } + } + + GST_BUFFER_PTS (payload->buf) = timestamp; + + if (payload->duration == GST_CLOCK_TIME_NONE + && stream->ext_props.avg_time_per_frame != 0) { + duration = stream->ext_props.avg_time_per_frame * 100; + } else { + duration = payload->duration; + } + GST_BUFFER_DURATION (payload->buf) = duration; + + /* FIXME: we should really set durations on buffers if we can */ + + GST_LOG_OBJECT (stream->pad, "pushing buffer, %" GST_PTR_FORMAT, + payload->buf); + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) && stream->is_video) { + if (stream->reverse_kf_ready == TRUE && stream->kf_pos == 0) { + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT); + } + } else if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { + GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT); + } + + + if (stream->active) { + if (G_UNLIKELY (stream->first_buffer)) { + if (stream->streamheader != NULL) { + GST_DEBUG_OBJECT (stream->pad, + "Pushing streamheader before first buffer"); + gst_pad_push (stream->pad, gst_buffer_ref (stream->streamheader)); + } + stream->first_buffer = FALSE; + } + + if (GST_CLOCK_TIME_IS_VALID (timestamp) + && timestamp > demux->segment.position) { + demux->segment.position = timestamp; + if (GST_CLOCK_TIME_IS_VALID (duration)) + demux->segment.position += timestamp; + } + + ret = gst_pad_push (stream->pad, payload->buf); + ret = + gst_flow_combiner_update_pad_flow (demux->flowcombiner, stream->pad, + ret); + } else { + gst_buffer_unref (payload->buf); + ret = GST_FLOW_OK; + } + payload->buf = NULL; + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) && stream->is_video + && stream->reverse_kf_ready) { + g_array_remove_index (stream->payloads, stream->kf_pos); + stream->kf_pos--; + + if (stream->reverse_kf_ready == TRUE && stream->kf_pos < 0) { + stream->kf_pos = 0; + stream->reverse_kf_ready = FALSE; + } + } else { + g_array_remove_index (stream->payloads, 0); + } + + /* Break out as soon as we have an issue */ + if (G_UNLIKELY (ret != GST_FLOW_OK)) + break; + } + + return ret; +} + +static gboolean +gst_asf_demux_check_buffer_is_header (GstASFDemux * demux, GstBuffer * buf) +{ + AsfObject obj; + GstMapInfo map; + gboolean valid; + g_assert (buf != NULL); + + GST_LOG_OBJECT (demux, "Checking if buffer is a header"); + + gst_buffer_map (buf, &map, GST_MAP_READ); + + /* we return false on buffer too small */ + if (map.size < ASF_OBJECT_HEADER_SIZE) { + gst_buffer_unmap (buf, &map); + return FALSE; + } + + /* check if it is a header */ + valid = + asf_demux_peek_object (demux, map.data, ASF_OBJECT_HEADER_SIZE, &obj, + TRUE); + gst_buffer_unmap (buf, &map); + if (valid && obj.id == ASF_OBJ_HEADER) { + return TRUE; + } + return FALSE; +} + +static gboolean +gst_asf_demux_check_chained_asf (GstASFDemux * demux) +{ + guint64 off = demux->data_offset + (demux->packet * demux->packet_size); + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buf = NULL; + gboolean header = FALSE; + + /* TODO maybe we should skip index objects after the data and look + * further for a new header */ + if (gst_asf_demux_pull_data (demux, off, ASF_OBJECT_HEADER_SIZE, &buf, &ret)) { + g_assert (buf != NULL); + /* check if it is a header */ + if (gst_asf_demux_check_buffer_is_header (demux, buf)) { + GST_DEBUG_OBJECT (demux, "new base offset: %" G_GUINT64_FORMAT, off); + demux->base_offset = off; + header = TRUE; + } + + gst_buffer_unref (buf); + } + + return header; +} + +static void +gst_asf_demux_loop (GstASFDemux * demux) +{ + GstFlowReturn flow = GST_FLOW_OK; + GstBuffer *buf = NULL; + guint64 off; + + if (G_UNLIKELY (demux->state == GST_ASF_DEMUX_STATE_HEADER)) { + if (!gst_asf_demux_pull_headers (demux, &flow)) { + goto pause; + } + + flow = gst_asf_demux_pull_indices (demux); + if (flow != GST_FLOW_OK) + goto pause; + } + + g_assert (demux->state == GST_ASF_DEMUX_STATE_DATA); + + if (G_UNLIKELY (demux->num_packets != 0 + && demux->packet >= demux->num_packets)) + goto eos; + + GST_LOG_OBJECT (demux, "packet %u/%u", (guint) demux->packet + 1, + (guint) demux->num_packets); + + off = demux->data_offset + (demux->packet * demux->packet_size); + + if (G_UNLIKELY (!gst_asf_demux_pull_data (demux, off, + demux->packet_size * demux->speed_packets, &buf, &flow))) { + GST_DEBUG_OBJECT (demux, "got flow %s", gst_flow_get_name (flow)); + if (flow == GST_FLOW_EOS) { + goto eos; + } else if (flow == GST_FLOW_FLUSHING) { + GST_DEBUG_OBJECT (demux, "Not fatal"); + goto pause; + } else { + goto read_failed; + } + } + + if (G_LIKELY (demux->speed_packets == 1)) { + GstAsfDemuxParsePacketError err; + err = gst_asf_demux_parse_packet (demux, buf); + if (G_UNLIKELY (err != GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE)) { + /* when we don't know when the data object ends, we should check + * for a chained asf */ + if (demux->num_packets == 0) { + if (gst_asf_demux_check_buffer_is_header (demux, buf)) { + GST_INFO_OBJECT (demux, "Chained asf found"); + demux->base_offset = off; + gst_asf_demux_reset (demux, TRUE); + gst_buffer_unref (buf); + return; + } + } + /* FIXME: We should tally up fatal errors and error out only + * after a few broken packets in a row? */ + + GST_INFO_OBJECT (demux, "Ignoring recoverable parse error"); + gst_buffer_unref (buf); + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) + && !demux->seek_to_cur_pos) { + --demux->packet; + if (demux->packet < 0) { + goto eos; + } + } else { + ++demux->packet; + } + + return; + } + + flow = gst_asf_demux_push_complete_payloads (demux, FALSE); + + if (GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment) + && !demux->seek_to_cur_pos) { + --demux->packet; + if (demux->packet < 0) { + goto eos; + } + } else { + ++demux->packet; + } + + } else { + guint n; + for (n = 0; n < demux->speed_packets; n++) { + GstBuffer *sub; + GstAsfDemuxParsePacketError err; + + sub = + gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, + n * demux->packet_size, demux->packet_size); + err = gst_asf_demux_parse_packet (demux, sub); + if (G_UNLIKELY (err != GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE)) { + /* when we don't know when the data object ends, we should check + * for a chained asf */ + if (demux->num_packets == 0) { + if (gst_asf_demux_check_buffer_is_header (demux, sub)) { + GST_INFO_OBJECT (demux, "Chained asf found"); + demux->base_offset = off + n * demux->packet_size; + gst_asf_demux_reset (demux, TRUE); + gst_buffer_unref (sub); + gst_buffer_unref (buf); + return; + } + } + /* FIXME: We should tally up fatal errors and error out only + * after a few broken packets in a row? */ + + GST_INFO_OBJECT (demux, "Ignoring recoverable parse error"); + flow = GST_FLOW_OK; + } + + gst_buffer_unref (sub); + + if (err == GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE) + flow = gst_asf_demux_push_complete_payloads (demux, FALSE); + + ++demux->packet; + + } + + /* reset speed pull */ + demux->speed_packets = 1; + } + + gst_buffer_unref (buf); + + if (G_UNLIKELY ((demux->num_packets > 0 + && demux->packet >= demux->num_packets) + || flow == GST_FLOW_EOS)) { + GST_LOG_OBJECT (demux, "reached EOS"); + goto eos; + } + + if (G_UNLIKELY (flow != GST_FLOW_OK)) { + GST_DEBUG_OBJECT (demux, "pushing complete payloads failed"); + goto pause; + } + + /* check if we're at the end of the configured segment */ + /* FIXME: check if segment end reached etc. */ + + return; + +eos: + { + /* if we haven't activated our streams yet, this might be because we have + * less data queued than required for preroll; force stream activation and + * send any pending payloads before sending EOS */ + if (!demux->activated_streams) + flow = gst_asf_demux_push_complete_payloads (demux, TRUE); + + /* we want to push an eos or post a segment-done in any case */ + if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gint64 stop; + + /* for segment playback we need to post when (in stream time) + * we stopped, this is either stop (when set) or the duration. */ + if ((stop = demux->segment.stop) == -1) + stop = demux->segment.duration; + + GST_INFO_OBJECT (demux, "Posting segment-done, at end of segment"); + gst_element_post_message (GST_ELEMENT_CAST (demux), + gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME, + stop)); + gst_asf_demux_send_event_unlocked (demux, + gst_event_new_segment_done (GST_FORMAT_TIME, stop)); + } else if (flow != GST_FLOW_EOS) { + /* check if we have a chained asf, in case, we don't eos yet */ + if (gst_asf_demux_check_chained_asf (demux)) { + GST_INFO_OBJECT (demux, "Chained ASF starting"); + gst_asf_demux_reset (demux, TRUE); + return; + } + } + + if (!(demux->segment.flags & GST_SEEK_FLAG_SEGMENT)) { + if (demux->activated_streams) { + /* normal playback, send EOS to all linked pads */ + GST_INFO_OBJECT (demux, "Sending EOS, at end of stream"); + gst_asf_demux_send_event_unlocked (demux, gst_event_new_eos ()); + } else { + GST_WARNING_OBJECT (demux, "EOS without exposed streams"); + flow = GST_FLOW_EOS; + } + } + /* ... and fall through to pause */ + } +pause: + { + GST_DEBUG_OBJECT (demux, "pausing task, flow return: %s", + gst_flow_get_name (flow)); + demux->segment_running = FALSE; + gst_pad_pause_task (demux->sinkpad); + + /* For the error cases */ + if (flow == GST_FLOW_EOS && !demux->activated_streams) { + GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), + ("This doesn't seem to be an ASF file")); + } else if (flow < GST_FLOW_EOS || flow == GST_FLOW_NOT_LINKED) { + /* Post an error. Hopefully something else already has, but if not... */ + GST_ELEMENT_FLOW_ERROR (demux, flow); + gst_asf_demux_send_event_unlocked (demux, gst_event_new_eos ()); + } + + return; + } + +/* ERRORS */ +read_failed: + { + GST_DEBUG_OBJECT (demux, "Read failed, doh"); + flow = GST_FLOW_EOS; + goto pause; + } +#if 0 + /* See FIXMEs above */ +parse_error: + { + gst_buffer_unref (buf); + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Error parsing ASF packet %u", (guint) demux->packet)); + gst_asf_demux_send_event_unlocked (demux, gst_event_new_eos ()); + flow = GST_FLOW_ERROR; + goto pause; + } +#endif +} + +#define GST_ASF_DEMUX_CHECK_HEADER_YES 0 +#define GST_ASF_DEMUX_CHECK_HEADER_NO 1 +#define GST_ASF_DEMUX_CHECK_HEADER_NEED_DATA 2 + +static gint +gst_asf_demux_check_header (GstASFDemux * demux) +{ + AsfObject obj; + guint8 *cdata = (guint8 *) gst_adapter_map (demux->adapter, + ASF_OBJECT_HEADER_SIZE); + if (cdata == NULL) /* need more data */ + return GST_ASF_DEMUX_CHECK_HEADER_NEED_DATA; + + if (asf_demux_peek_object (demux, cdata, ASF_OBJECT_HEADER_SIZE, &obj, FALSE) + && obj.id == ASF_OBJ_HEADER) { + return GST_ASF_DEMUX_CHECK_HEADER_YES; + } + + return GST_ASF_DEMUX_CHECK_HEADER_NO; +} + +static GstFlowReturn +gst_asf_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstASFDemux *demux; + + demux = GST_ASF_DEMUX (parent); + + GST_LOG_OBJECT (demux, + "buffer: size=%" G_GSIZE_FORMAT ", offset=%" G_GINT64_FORMAT ", time=%" + GST_TIME_FORMAT, gst_buffer_get_size (buf), GST_BUFFER_OFFSET (buf), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buf))) { + GST_DEBUG_OBJECT (demux, "received DISCONT"); + gst_asf_demux_mark_discont (demux); + } + + if (G_UNLIKELY ((!GST_CLOCK_TIME_IS_VALID (demux->in_gap) && + GST_BUFFER_TIMESTAMP_IS_VALID (buf)))) { + demux->in_gap = GST_BUFFER_TIMESTAMP (buf) - demux->in_segment.start; + GST_DEBUG_OBJECT (demux, "upstream segment start %" GST_TIME_FORMAT + ", interpolation gap: %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->in_segment.start), GST_TIME_ARGS (demux->in_gap)); + } + + gst_adapter_push (demux->adapter, buf); + + switch (demux->state) { + case GST_ASF_DEMUX_STATE_INDEX:{ + gint result = gst_asf_demux_check_header (demux); + if (result == GST_ASF_DEMUX_CHECK_HEADER_NEED_DATA) /* need more data */ + break; + + if (result == GST_ASF_DEMUX_CHECK_HEADER_NO) { + /* we don't care about this, probably an index */ + /* TODO maybe would be smarter to skip all the indices + * until we got a new header or EOS to decide */ + GST_LOG_OBJECT (demux, "Received index object, its EOS"); + goto eos; + } else { + GST_INFO_OBJECT (demux, "Chained asf starting"); + /* cleanup and get ready for a chained asf */ + gst_asf_demux_reset (demux, TRUE); + /* fall through */ + } + } + case GST_ASF_DEMUX_STATE_HEADER:{ + ret = gst_asf_demux_chain_headers (demux); + if (demux->state != GST_ASF_DEMUX_STATE_DATA) + break; + /* otherwise fall through */ + } + case GST_ASF_DEMUX_STATE_DATA: + { + guint64 data_size; + + data_size = demux->packet_size; + + while (gst_adapter_available (demux->adapter) >= data_size) { + GstBuffer *buf; + GstAsfDemuxParsePacketError err; + + /* we don't know the length of the stream + * check for a chained asf every time */ + if (demux->num_packets == 0) { + gint result = gst_asf_demux_check_header (demux); + + if (result == GST_ASF_DEMUX_CHECK_HEADER_YES) { + GST_INFO_OBJECT (demux, "Chained asf starting"); + /* cleanup and get ready for a chained asf */ + gst_asf_demux_reset (demux, TRUE); + break; + } + } else if (G_UNLIKELY (demux->num_packets != 0 && demux->packet >= 0 + && demux->packet >= demux->num_packets)) { + /* do not overshoot data section when streaming */ + break; + } + + buf = gst_adapter_take_buffer (demux->adapter, data_size); + + /* FIXME: We should tally up fatal errors and error out only + * after a few broken packets in a row? */ + err = gst_asf_demux_parse_packet (demux, buf); + + gst_buffer_unref (buf); + + if (G_LIKELY (err == GST_ASF_DEMUX_PARSE_PACKET_ERROR_NONE)) + ret = gst_asf_demux_push_complete_payloads (demux, FALSE); + else + GST_WARNING_OBJECT (demux, "Parse error"); + + if (demux->packet >= 0) + ++demux->packet; + } + if (G_UNLIKELY (demux->num_packets != 0 && demux->packet >= 0 + && demux->packet >= demux->num_packets)) { + demux->state = GST_ASF_DEMUX_STATE_INDEX; + } + break; + } + default: + g_assert_not_reached (); + } + +done: + if (ret != GST_FLOW_OK) + GST_DEBUG_OBJECT (demux, "flow: %s", gst_flow_get_name (ret)); + + return ret; + +eos: + { + GST_DEBUG_OBJECT (demux, "Handled last packet, setting EOS"); + ret = GST_FLOW_EOS; + goto done; + } +} + +static inline gboolean +gst_asf_demux_skip_bytes (guint num_bytes, guint8 ** p_data, guint64 * p_size) +{ + if (*p_size < num_bytes) + return FALSE; + + *p_data += num_bytes; + *p_size -= num_bytes; + return TRUE; +} + +static inline guint8 +gst_asf_demux_get_uint8 (guint8 ** p_data, guint64 * p_size) +{ + guint8 ret; + + g_assert (*p_size >= 1); + ret = GST_READ_UINT8 (*p_data); + *p_data += sizeof (guint8); + *p_size -= sizeof (guint8); + return ret; +} + +static inline guint16 +gst_asf_demux_get_uint16 (guint8 ** p_data, guint64 * p_size) +{ + guint16 ret; + + g_assert (*p_size >= 2); + ret = GST_READ_UINT16_LE (*p_data); + *p_data += sizeof (guint16); + *p_size -= sizeof (guint16); + return ret; +} + +static inline guint32 +gst_asf_demux_get_uint32 (guint8 ** p_data, guint64 * p_size) +{ + guint32 ret; + + g_assert (*p_size >= 4); + ret = GST_READ_UINT32_LE (*p_data); + *p_data += sizeof (guint32); + *p_size -= sizeof (guint32); + return ret; +} + +static inline guint64 +gst_asf_demux_get_uint64 (guint8 ** p_data, guint64 * p_size) +{ + guint64 ret; + + g_assert (*p_size >= 8); + ret = GST_READ_UINT64_LE (*p_data); + *p_data += sizeof (guint64); + *p_size -= sizeof (guint64); + return ret; +} + +static gboolean +gst_asf_demux_get_buffer (GstBuffer ** p_buf, guint num_bytes_to_read, + guint8 ** p_data, guint64 * p_size) +{ + *p_buf = NULL; + + if (*p_size < num_bytes_to_read) + return FALSE; + + *p_buf = gst_buffer_new_and_alloc (num_bytes_to_read); + gst_buffer_fill (*p_buf, 0, *p_data, num_bytes_to_read); + + *p_data += num_bytes_to_read; + *p_size -= num_bytes_to_read; + + return TRUE; +} + +static gboolean +gst_asf_demux_get_bytes (guint8 ** p_buf, guint64 num_bytes_to_read, + guint8 ** p_data, guint64 * p_size) +{ + *p_buf = NULL; + + if (num_bytes_to_read >= G_MAXUINT) + return FALSE; + + if (*p_size < num_bytes_to_read) + return FALSE; + + *p_buf = g_memdup2 (*p_data, num_bytes_to_read); + *p_data += num_bytes_to_read; + *p_size -= num_bytes_to_read; + return TRUE; +} + +static gboolean +gst_asf_demux_get_string (gchar ** p_str, guint16 * p_strlen, + guint8 ** p_data, guint64 * p_size) +{ + guint16 s_length; + guint8 *s; + + *p_str = NULL; + + if (*p_size < 2) + return FALSE; + + s_length = gst_asf_demux_get_uint16 (p_data, p_size); + + if (p_strlen) + *p_strlen = s_length; + + if (s_length == 0) { + GST_WARNING ("zero-length string"); + *p_str = g_strdup (""); + return TRUE; + } + + if (!gst_asf_demux_get_bytes (&s, s_length, p_data, p_size)) + return FALSE; + + g_assert (s != NULL); + + /* just because They don't exist doesn't + * mean They are not out to get you ... */ + if (s[s_length - 1] != '\0') { + s = g_realloc (s, s_length + 1); + s[s_length] = '\0'; + } + + *p_str = (gchar *) s; + return TRUE; +} + + +static void +gst_asf_demux_get_guid (ASFGuid * guid, guint8 ** p_data, guint64 * p_size) +{ + g_assert (*p_size >= 4 * sizeof (guint32)); + + guid->v1 = gst_asf_demux_get_uint32 (p_data, p_size); + guid->v2 = gst_asf_demux_get_uint32 (p_data, p_size); + guid->v3 = gst_asf_demux_get_uint32 (p_data, p_size); + guid->v4 = gst_asf_demux_get_uint32 (p_data, p_size); +} + +static gboolean +gst_asf_demux_get_stream_audio (asf_stream_audio * audio, guint8 ** p_data, + guint64 * p_size) +{ + if (*p_size < (2 + 2 + 4 + 4 + 2 + 2 + 2)) + return FALSE; + + /* WAVEFORMATEX Structure */ + audio->codec_tag = gst_asf_demux_get_uint16 (p_data, p_size); + audio->channels = gst_asf_demux_get_uint16 (p_data, p_size); + audio->sample_rate = gst_asf_demux_get_uint32 (p_data, p_size); + audio->byte_rate = gst_asf_demux_get_uint32 (p_data, p_size); + audio->block_align = gst_asf_demux_get_uint16 (p_data, p_size); + audio->word_size = gst_asf_demux_get_uint16 (p_data, p_size); + /* Codec specific data size */ + audio->size = gst_asf_demux_get_uint16 (p_data, p_size); + if (audio->size > *p_size) { + GST_WARNING ("Corrupted audio codec_data (should be at least %u bytes, is %" + G_GUINT64_FORMAT " long)", audio->size, *p_size); + return FALSE; + } + return TRUE; +} + +static gboolean +gst_asf_demux_get_stream_video (asf_stream_video * video, guint8 ** p_data, + guint64 * p_size) +{ + if (*p_size < (4 + 4 + 1 + 2)) + return FALSE; + + video->width = gst_asf_demux_get_uint32 (p_data, p_size); + video->height = gst_asf_demux_get_uint32 (p_data, p_size); + video->unknown = gst_asf_demux_get_uint8 (p_data, p_size); + video->size = gst_asf_demux_get_uint16 (p_data, p_size); + return TRUE; +} + +static gboolean +gst_asf_demux_get_stream_video_format (asf_stream_video_format * fmt, + guint8 ** p_data, guint64 * p_size) +{ + if (*p_size < (4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4)) + return FALSE; + + fmt->size = gst_asf_demux_get_uint32 (p_data, p_size); + /* Sanity checks */ + if (fmt->size < 40) { + GST_WARNING ("Corrupted asf_stream_video_format (size < 40)"); + return FALSE; + } + if ((guint64) fmt->size - 4 > *p_size) { + GST_WARNING ("Corrupted asf_stream_video_format (codec_data is too small)"); + return FALSE; + } + fmt->width = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->height = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->planes = gst_asf_demux_get_uint16 (p_data, p_size); + fmt->depth = gst_asf_demux_get_uint16 (p_data, p_size); + fmt->tag = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->image_size = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->xpels_meter = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->ypels_meter = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->num_colors = gst_asf_demux_get_uint32 (p_data, p_size); + fmt->imp_colors = gst_asf_demux_get_uint32 (p_data, p_size); + return TRUE; +} + +AsfStream * +gst_asf_demux_get_stream (GstASFDemux * demux, guint16 id) +{ + guint i; + + for (i = 0; i < demux->num_streams; i++) { + if (demux->stream[i].id == id) + return &demux->stream[i]; + } + + if (gst_asf_demux_is_unknown_stream (demux, id)) + GST_WARNING ("Segment found for undefined stream: (%d)", id); + return NULL; +} + +static AsfStream * +gst_asf_demux_setup_pad (GstASFDemux * demux, GstPad * src_pad, + GstCaps * caps, guint16 id, gboolean is_video, GstBuffer * streamheader, + GstTagList * tags) +{ + AsfStream *stream; + + gst_pad_use_fixed_caps (src_pad); + gst_pad_set_caps (src_pad, caps); + + gst_pad_set_event_function (src_pad, + GST_DEBUG_FUNCPTR (gst_asf_demux_handle_src_event)); + gst_pad_set_query_function (src_pad, + GST_DEBUG_FUNCPTR (gst_asf_demux_handle_src_query)); + + stream = &demux->stream[demux->num_streams]; + stream->caps = caps; + stream->pad = src_pad; + stream->id = id; + stream->fps_known = !is_video; /* bit hacky for audio */ + stream->is_video = is_video; + stream->pending_tags = tags; + stream->discont = TRUE; + stream->first_buffer = TRUE; + stream->streamheader = streamheader; + if (stream->streamheader) { + stream->streamheader = gst_buffer_make_writable (streamheader); + GST_BUFFER_FLAG_SET (stream->streamheader, GST_BUFFER_FLAG_HEADER); + } + if (is_video) { + GstStructure *st; + gint par_x, par_y; + st = gst_caps_get_structure (caps, 0); + if (gst_structure_get_fraction (st, "pixel-aspect-ratio", &par_x, &par_y) && + par_x > 0 && par_y > 0) { + GST_DEBUG ("PAR %d/%d", par_x, par_y); + stream->par_x = par_x; + stream->par_y = par_y; + } + } + + stream->payloads = g_array_new (FALSE, FALSE, sizeof (AsfPayload)); + + /* TODO: create this array during reverse play? */ + stream->payloads_rev = g_array_new (FALSE, FALSE, sizeof (AsfPayload)); + + GST_INFO ("Created pad %s for stream %u with caps %" GST_PTR_FORMAT, + GST_PAD_NAME (src_pad), demux->num_streams, caps); + + ++demux->num_streams; + + stream->active = FALSE; + + return stream; +} + +static void +gst_asf_demux_add_stream_headers_to_caps (GstASFDemux * demux, + GstBuffer * buffer, GstStructure * structure) +{ + GValue arr_val = G_VALUE_INIT; + GValue buf_val = G_VALUE_INIT; + + g_value_init (&arr_val, GST_TYPE_ARRAY); + g_value_init (&buf_val, GST_TYPE_BUFFER); + + gst_value_set_buffer (&buf_val, buffer); + gst_value_array_append_and_take_value (&arr_val, &buf_val); + + gst_structure_take_value (structure, "streamheader", &arr_val); +} + +static AsfStream * +gst_asf_demux_add_audio_stream (GstASFDemux * demux, + asf_stream_audio * audio, guint16 id, guint8 ** p_data, guint64 * p_size) +{ + GstTagList *tags = NULL; + GstBuffer *extradata = NULL; + GstPad *src_pad; + GstCaps *caps; + guint16 size_left = 0; + gchar *codec_name = NULL; + gchar *name = NULL; + + size_left = audio->size; + + /* Create the audio pad */ + name = g_strdup_printf ("audio_%u", demux->num_audio_streams); + + src_pad = gst_pad_new_from_static_template (&audio_src_template, name); + g_free (name); + + /* Swallow up any left over data and set up the + * standard properties from the header info */ + if (size_left) { + GST_INFO_OBJECT (demux, "Audio header contains %d bytes of " + "codec specific data", size_left); + + g_assert (size_left <= *p_size); + gst_asf_demux_get_buffer (&extradata, size_left, p_data, p_size); + } + + /* asf_stream_audio is the same as gst_riff_strf_auds, but with an + * additional two bytes indicating extradata. */ + /* FIXME: Handle the channel reorder map here */ + caps = gst_riff_create_audio_caps (audio->codec_tag, NULL, + (gst_riff_strf_auds *) audio, extradata, NULL, &codec_name, NULL); + + if (caps == NULL) { + caps = gst_caps_new_simple ("audio/x-asf-unknown", "codec_id", + G_TYPE_INT, (gint) audio->codec_tag, NULL); + } + + /* Informing about that audio format we just added */ + if (codec_name) { + tags = gst_tag_list_new (GST_TAG_AUDIO_CODEC, codec_name, NULL); + g_free (codec_name); + } + + if (audio->byte_rate > 0) { + /* Some ASF files have no bitrate props object (often seen with + * ASF files that contain raw audio data). Example files can + * be generated with FFmpeg (tested with v2.8.6), like this: + * + * ffmpeg -i sine-wave.wav -c:a pcm_alaw file.asf + * + * In this case, if audio->byte_rate is nonzero, use that as + * the bitrate. */ + + guint bitrate = audio->byte_rate * 8; + + if (tags == NULL) + tags = gst_tag_list_new_empty (); + + /* Add bitrate, but only if there is none set already, since + * this is just a fallback in case there is no bitrate tag + * already present */ + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_BITRATE, bitrate, NULL); + } + + if (extradata) + gst_buffer_unref (extradata); + + GST_INFO ("Adding audio stream #%u, id %u codec %u (0x%04x), tags=%" + GST_PTR_FORMAT, demux->num_audio_streams, id, audio->codec_tag, + audio->codec_tag, tags); + + ++demux->num_audio_streams; + + return gst_asf_demux_setup_pad (demux, src_pad, caps, id, FALSE, NULL, tags); +} + +static AsfStream * +gst_asf_demux_add_video_stream (GstASFDemux * demux, + asf_stream_video_format * video, guint16 id, + guint8 ** p_data, guint64 * p_size) +{ + GstTagList *tags = NULL; + GstStructure *caps_s; + GstBuffer *extradata = NULL; + GstPad *src_pad; + GstCaps *caps; + gchar *str; + gchar *name = NULL; + gchar *codec_name = NULL; + guint64 size_left = video->size - 40; + GstBuffer *streamheader = NULL; + guint par_w = 1, par_h = 1; + + /* Create the video pad */ + name = g_strdup_printf ("video_%u", demux->num_video_streams); + src_pad = gst_pad_new_from_static_template (&video_src_template, name); + g_free (name); + + /* Now try some gstreamer formatted MIME types (from gst_avi_demux_strf_vids) */ + if (size_left) { + GST_LOG ("Video header has %" G_GUINT64_FORMAT + " bytes of codec specific data (vs %" G_GUINT64_FORMAT ")", size_left, + *p_size); + g_assert (size_left <= *p_size); + gst_asf_demux_get_buffer (&extradata, size_left, p_data, p_size); + } + + GST_DEBUG ("video codec %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (video->tag)); + + /* yes, asf_stream_video_format and gst_riff_strf_vids are the same */ + caps = gst_riff_create_video_caps (video->tag, NULL, + (gst_riff_strf_vids *) video, extradata, NULL, &codec_name); + + if (caps == NULL) { + caps = gst_caps_new_simple ("video/x-asf-unknown", "fourcc", + G_TYPE_UINT, video->tag, NULL); + } else { + GstStructure *s; + gint ax, ay; + + s = gst_asf_demux_get_metadata_for_stream (demux, id); + if (gst_structure_get_int (s, "AspectRatioX", &ax) && + gst_structure_get_int (s, "AspectRatioY", &ay) && (ax > 0 && ay > 0)) { + par_w = ax; + par_h = ay; + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + ax, ay, NULL); + } else { + guint ax, ay; + /* retry with the global metadata */ + GST_DEBUG ("Retrying with global metadata %" GST_PTR_FORMAT, + demux->global_metadata); + s = demux->global_metadata; + if (gst_structure_get_uint (s, "AspectRatioX", &ax) && + gst_structure_get_uint (s, "AspectRatioY", &ay)) { + GST_DEBUG ("ax:%d, ay:%d", ax, ay); + if (ax > 0 && ay > 0) { + par_w = ax; + par_h = ay; + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + ax, ay, NULL); + } + } + } + s = gst_caps_get_structure (caps, 0); + gst_structure_remove_field (s, "framerate"); + } + + caps_s = gst_caps_get_structure (caps, 0); + + /* add format field with fourcc to WMV/VC1 caps to differentiate variants */ + if (gst_structure_has_name (caps_s, "video/x-wmv")) { + str = g_strdup_printf ("%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (video->tag)); + gst_caps_set_simple (caps, "format", G_TYPE_STRING, str, NULL); + g_free (str); + + /* check if h264 has codec_data (avc) or streamheaders (bytestream) */ + } else if (gst_structure_has_name (caps_s, "video/x-h264")) { + const GValue *value = gst_structure_get_value (caps_s, "codec_data"); + if (value) { + GstBuffer *buf = gst_value_get_buffer (value); + GstMapInfo mapinfo; + + if (gst_buffer_map (buf, &mapinfo, GST_MAP_READ)) { + if (mapinfo.size >= 4 && GST_READ_UINT32_BE (mapinfo.data) == 1) { + /* this looks like a bytestream start */ + streamheader = gst_buffer_ref (buf); + gst_asf_demux_add_stream_headers_to_caps (demux, buf, caps_s); + gst_structure_remove_field (caps_s, "codec_data"); + gst_structure_set (caps_s, "stream-format", G_TYPE_STRING, + "byte-stream", NULL); + } else { + gst_structure_set (caps_s, "stream-format", G_TYPE_STRING, "avc", + NULL); + } + + gst_buffer_unmap (buf, &mapinfo); + } + } else { + gst_structure_set (caps_s, "stream-format", G_TYPE_STRING, "byte-stream", + NULL); + } + } + + /* For a 3D video, set multiview information into the caps based on + * what was detected during object parsing */ + if (demux->asf_3D_mode != GST_ASF_3D_NONE) { + GstVideoMultiviewMode mv_mode = GST_VIDEO_MULTIVIEW_MODE_NONE; + GstVideoMultiviewFlags mv_flags = GST_VIDEO_MULTIVIEW_FLAGS_NONE; + const gchar *mview_mode_str; + + switch (demux->asf_3D_mode) { + case GST_ASF_3D_SIDE_BY_SIDE_HALF_LR: + mv_mode = GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE; + break; + case GST_ASF_3D_SIDE_BY_SIDE_HALF_RL: + mv_mode = GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE; + mv_flags = GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST; + break; + case GST_ASF_3D_TOP_AND_BOTTOM_HALF_LR: + mv_mode = GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM; + break; + case GST_ASF_3D_TOP_AND_BOTTOM_HALF_RL: + mv_mode = GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM; + mv_flags = GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST; + break; + case GST_ASF_3D_DUAL_STREAM:{ + gboolean is_right_view = FALSE; + /* if Advanced_Mutual_Exclusion object exists, use it + * to figure out which is the left view (lower ID) */ + if (demux->mut_ex_streams != NULL) { + guint length; + gint i; + + length = g_slist_length (demux->mut_ex_streams); + + for (i = 0; i < length; i++) { + gpointer v_s_id; + + v_s_id = g_slist_nth_data (demux->mut_ex_streams, i); + + GST_DEBUG_OBJECT (demux, + "has Mutual_Exclusion object. stream id in object is %d", + GPOINTER_TO_INT (v_s_id)); + + if (id > GPOINTER_TO_INT (v_s_id)) + is_right_view = TRUE; + } + } else { + /* if the Advaced_Mutual_Exclusion object doesn't exist, assume the + * first video stream encountered has the lower ID */ + if (demux->num_video_streams > 0) { + /* This is not the first video stream, assuming right eye view */ + is_right_view = TRUE; + } + } + if (is_right_view) + mv_mode = GST_VIDEO_MULTIVIEW_MODE_RIGHT; + else + mv_mode = GST_VIDEO_MULTIVIEW_MODE_LEFT; + break; + } + default: + break; + } + + GST_INFO_OBJECT (demux, + "stream_id %d, has multiview-mode %d flags 0x%x", id, mv_mode, + (guint) mv_flags); + + mview_mode_str = gst_video_multiview_mode_to_caps_string (mv_mode); + if (mview_mode_str != NULL) { + if (gst_video_multiview_guess_half_aspect (mv_mode, video->width, + video->height, par_w, par_h)) + mv_flags |= GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT; + + gst_caps_set_simple (caps, + "multiview-mode", G_TYPE_STRING, mview_mode_str, + "multiview-flags", GST_TYPE_VIDEO_MULTIVIEW_FLAGSET, mv_flags, + GST_FLAG_SET_MASK_EXACT, NULL); + } + } + + if (codec_name) { + tags = gst_tag_list_new (GST_TAG_VIDEO_CODEC, codec_name, NULL); + g_free (codec_name); + } + + if (extradata) + gst_buffer_unref (extradata); + + GST_INFO ("Adding video stream #%u, id %u, codec %" + GST_FOURCC_FORMAT " (0x%08x)", demux->num_video_streams, id, + GST_FOURCC_ARGS (video->tag), video->tag); + + ++demux->num_video_streams; + + return gst_asf_demux_setup_pad (demux, src_pad, caps, id, TRUE, + streamheader, tags); +} + +static void +gst_asf_demux_activate_stream (GstASFDemux * demux, AsfStream * stream) +{ + if (!stream->active) { + GstEvent *event; + gchar *stream_id; + + GST_INFO_OBJECT (demux, "Activating stream %2u, pad %s, caps %" + GST_PTR_FORMAT, stream->id, GST_PAD_NAME (stream->pad), stream->caps); + gst_pad_set_active (stream->pad, TRUE); + + stream_id = + gst_pad_create_stream_id_printf (stream->pad, GST_ELEMENT_CAST (demux), + "%03u", stream->id); + + event = + gst_pad_get_sticky_event (demux->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &demux->group_id)) + demux->have_group_id = TRUE; + else + demux->have_group_id = FALSE; + gst_event_unref (event); + } else if (!demux->have_group_id) { + demux->have_group_id = TRUE; + demux->group_id = gst_util_group_id_next (); + } + + event = gst_event_new_stream_start (stream_id); + if (demux->have_group_id) + gst_event_set_group_id (event, demux->group_id); + + gst_pad_push_event (stream->pad, event); + g_free (stream_id); + gst_pad_set_caps (stream->pad, stream->caps); + + gst_element_add_pad (GST_ELEMENT_CAST (demux), stream->pad); + gst_flow_combiner_add_pad (demux->flowcombiner, stream->pad); + stream->active = TRUE; + } +} + +static AsfStream * +gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + AsfCorrectionType correction_type; + AsfStreamType stream_type; + GstClockTime time_offset; + gboolean is_encrypted G_GNUC_UNUSED; + guint16 stream_id; + guint16 flags; + ASFGuid guid; + guint stream_specific_size; + guint type_specific_size G_GNUC_UNUSED; + guint unknown G_GNUC_UNUSED; + gboolean inspect_payload = FALSE; + AsfStream *stream = NULL; + + /* Get the rest of the header's header */ + if (size < (16 + 16 + 8 + 4 + 4 + 2 + 4)) + goto not_enough_data; + + gst_asf_demux_get_guid (&guid, &data, &size); + stream_type = gst_asf_demux_identify_guid (asf_stream_guids, &guid); + + gst_asf_demux_get_guid (&guid, &data, &size); + correction_type = gst_asf_demux_identify_guid (asf_correction_guids, &guid); + + time_offset = gst_asf_demux_get_uint64 (&data, &size) * 100; + + type_specific_size = gst_asf_demux_get_uint32 (&data, &size); + stream_specific_size = gst_asf_demux_get_uint32 (&data, &size); + + flags = gst_asf_demux_get_uint16 (&data, &size); + stream_id = flags & 0x7f; + is_encrypted = ! !(flags & 0x8000); + unknown = gst_asf_demux_get_uint32 (&data, &size); + + GST_DEBUG_OBJECT (demux, "Found stream %u, time_offset=%" GST_TIME_FORMAT, + stream_id, GST_TIME_ARGS (time_offset)); + + /* dvr-ms has audio stream declared in stream specific data */ + if (stream_type == ASF_STREAM_EXT_EMBED_HEADER) { + AsfExtStreamType ext_stream_type; + gst_asf_demux_get_guid (&guid, &data, &size); + ext_stream_type = gst_asf_demux_identify_guid (asf_ext_stream_guids, &guid); + + if (ext_stream_type == ASF_EXT_STREAM_AUDIO) { + inspect_payload = TRUE; + + gst_asf_demux_get_guid (&guid, &data, &size); + gst_asf_demux_get_uint32 (&data, &size); + gst_asf_demux_get_uint32 (&data, &size); + gst_asf_demux_get_uint32 (&data, &size); + gst_asf_demux_get_guid (&guid, &data, &size); + gst_asf_demux_get_uint32 (&data, &size); + stream_type = ASF_STREAM_AUDIO; + } + } + + switch (stream_type) { + case ASF_STREAM_AUDIO:{ + asf_stream_audio audio_object; + + if (!gst_asf_demux_get_stream_audio (&audio_object, &data, &size)) + goto not_enough_data; + + GST_INFO ("Object is an audio stream with %u bytes of additional data", + audio_object.size); + + stream = gst_asf_demux_add_audio_stream (demux, &audio_object, stream_id, + &data, &size); + + switch (correction_type) { + case ASF_CORRECTION_ON:{ + guint span, packet_size, chunk_size, data_size, silence_data; + + GST_INFO ("Using error correction"); + + if (size < (1 + 2 + 2 + 2 + 1)) + goto not_enough_data; + + span = gst_asf_demux_get_uint8 (&data, &size); + packet_size = gst_asf_demux_get_uint16 (&data, &size); + chunk_size = gst_asf_demux_get_uint16 (&data, &size); + data_size = gst_asf_demux_get_uint16 (&data, &size); + silence_data = gst_asf_demux_get_uint8 (&data, &size); + + stream->span = span; + + GST_DEBUG_OBJECT (demux, "Descrambling ps:%u cs:%u ds:%u s:%u sd:%u", + packet_size, chunk_size, data_size, span, silence_data); + + if (stream->span > 1) { + if (chunk_size == 0 || ((packet_size / chunk_size) <= 1)) { + /* Disable descrambling */ + stream->span = 0; + } else { + /* FIXME: this else branch was added for + * weird_al_yankovic - the saga begins.asf */ + stream->ds_packet_size = packet_size; + stream->ds_chunk_size = chunk_size; + } + } else { + /* Descambling is enabled */ + stream->ds_packet_size = packet_size; + stream->ds_chunk_size = chunk_size; + } +#if 0 + /* Now skip the rest of the silence data */ + if (data_size > 1) + gst_bytestream_flush (demux->bs, data_size - 1); +#else + /* FIXME: CHECKME. And why -1? */ + if (data_size > 1) { + if (!gst_asf_demux_skip_bytes (data_size - 1, &data, &size)) { + goto not_enough_data; + } + } +#endif + break; + } + case ASF_CORRECTION_OFF:{ + GST_INFO ("Error correction off"); + if (!gst_asf_demux_skip_bytes (stream_specific_size, &data, &size)) + goto not_enough_data; + break; + } + default: + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Audio stream using unknown error correction")); + return NULL; + } + + break; + } + + case ASF_STREAM_VIDEO:{ + asf_stream_video_format video_format_object; + asf_stream_video video_object; + guint16 vsize; + + if (!gst_asf_demux_get_stream_video (&video_object, &data, &size)) + goto not_enough_data; + + vsize = video_object.size - 40; /* Byte order gets offset by single byte */ + + GST_INFO ("object is a video stream with %u bytes of " + "additional data", vsize); + + if (!gst_asf_demux_get_stream_video_format (&video_format_object, + &data, &size)) { + goto not_enough_data; + } + + stream = gst_asf_demux_add_video_stream (demux, &video_format_object, + stream_id, &data, &size); + + break; + } + + default: + GST_WARNING_OBJECT (demux, "Unknown stream type for stream %u", + stream_id); + demux->other_streams = + g_slist_append (demux->other_streams, GINT_TO_POINTER (stream_id)); + break; + } + + if (stream) { + stream->inspect_payload = inspect_payload; + stream->type = stream_type; + } + return stream; + +not_enough_data: + { + GST_WARNING_OBJECT (demux, "Unexpected end of data parsing stream object"); + /* we'll error out later if we found no streams */ + return NULL; + } +} + +static const gchar * +gst_asf_demux_get_gst_tag_from_tag_name (const gchar * name_utf8) +{ + /* *INDENT-OFF* */ + const struct + { + const gchar *asf_name; + const gchar *gst_name; + } tags[] = { + { + "WM/Genre", GST_TAG_GENRE}, { + "WM/AlbumTitle", GST_TAG_ALBUM}, { + "WM/AlbumArtist", GST_TAG_ARTIST}, { + "WM/PartOfSet", GST_TAG_ALBUM_VOLUME_COUNT}, { + "WM/Picture", GST_TAG_IMAGE}, { + "WM/Track", GST_TAG_TRACK_NUMBER}, { + "WM/TrackNumber", GST_TAG_TRACK_NUMBER}, { + "WM/Year", GST_TAG_DATE_TIME} + /* { "WM/Composer", GST_TAG_COMPOSER } */ + }; + /* *INDENT-ON* */ + gsize out; + guint i; + + if (name_utf8 == NULL) { + GST_WARNING ("Failed to convert name to UTF8, skipping"); + return NULL; + } + + out = strlen (name_utf8); + + for (i = 0; i < G_N_ELEMENTS (tags); ++i) { + if (strncmp (tags[i].asf_name, name_utf8, out) == 0) { + GST_LOG ("map tagname '%s' -> '%s'", name_utf8, tags[i].gst_name); + return tags[i].gst_name; + } + } + + return NULL; +} + +/* gst_asf_demux_add_global_tags() takes ownership of taglist! */ +static void +gst_asf_demux_add_global_tags (GstASFDemux * demux, GstTagList * taglist) +{ + GstTagList *t; + + GST_DEBUG_OBJECT (demux, "adding global tags: %" GST_PTR_FORMAT, taglist); + + if (taglist == NULL) + return; + + if (gst_tag_list_is_empty (taglist)) { + gst_tag_list_unref (taglist); + return; + } + + t = gst_tag_list_merge (demux->taglist, taglist, GST_TAG_MERGE_APPEND); + gst_tag_list_set_scope (t, GST_TAG_SCOPE_GLOBAL); + if (demux->taglist) + gst_tag_list_unref (demux->taglist); + gst_tag_list_unref (taglist); + demux->taglist = t; + GST_LOG_OBJECT (demux, "global tags now: %" GST_PTR_FORMAT, demux->taglist); +} + +#define ASF_DEMUX_DATA_TYPE_UTF16LE_STRING 0 +#define ASF_DEMUX_DATA_TYPE_BYTE_ARRAY 1 +#define ASF_DEMUX_DATA_TYPE_BOOL 2 +#define ASF_DEMUX_DATA_TYPE_DWORD 3 + +static void +asf_demux_parse_picture_tag (GstTagList * tags, const guint8 * tag_data, + guint tag_data_len) +{ + GstByteReader r; + const guint8 *img_data = NULL; + guint32 img_data_len = 0; + guint8 pic_type = 0; + + gst_byte_reader_init (&r, tag_data, tag_data_len); + + /* skip mime type string (we don't trust it and do our own typefinding), + * and also skip the description string, since we don't use it */ + if (!gst_byte_reader_get_uint8 (&r, &pic_type) || + !gst_byte_reader_get_uint32_le (&r, &img_data_len) || + !gst_byte_reader_skip_string_utf16 (&r) || + !gst_byte_reader_skip_string_utf16 (&r) || + !gst_byte_reader_get_data (&r, img_data_len, &img_data)) { + goto not_enough_data; + } + + + if (!gst_tag_list_add_id3_image (tags, img_data, img_data_len, pic_type)) + GST_DEBUG ("failed to add image extracted from WM/Picture tag to taglist"); + + return; + +not_enough_data: + { + GST_DEBUG ("Failed to read WM/Picture tag: not enough data"); + GST_MEMDUMP ("WM/Picture data", tag_data, tag_data_len); + return; + } +} + +/* Extended Content Description Object */ +static GstFlowReturn +gst_asf_demux_process_ext_content_desc (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + /* Other known (and unused) 'text/unicode' metadata available : + * + * WM/Lyrics = + * WM/MediaPrimaryClassID = {D1607DBC-E323-4BE2-86A1-48A42A28441E} + * WMFSDKVersion = 9.00.00.2980 + * WMFSDKNeeded = 0.0.0.0000 + * WM/UniqueFileIdentifier = AMGa_id=R 15334;AMGp_id=P 5149;AMGt_id=T 2324984 + * WM/Publisher = 4AD + * WM/Provider = AMG + * WM/ProviderRating = 8 + * WM/ProviderStyle = Rock (similar to WM/Genre) + * WM/GenreID (similar to WM/Genre) + * WM/TrackNumber (same as WM/Track but as a string) + * + * Other known (and unused) 'non-text' metadata available : + * + * WM/EncodingTime + * WM/MCDI + * IsVBR + * + * We might want to read WM/TrackNumber and use atoi() if we don't have + * WM/Track + */ + + GstTagList *taglist; + guint16 blockcount, i; + gboolean content3D = FALSE; + + /* *INDENT-OFF* */ + struct + { + const gchar *interleave_name; + GstASF3DMode interleaving_type; + } stereoscopic_layout_map[] = { + { + "SideBySideRF", GST_ASF_3D_SIDE_BY_SIDE_HALF_RL}, { + "SideBySideLF", GST_ASF_3D_SIDE_BY_SIDE_HALF_LR}, { + "OverUnderRT", GST_ASF_3D_TOP_AND_BOTTOM_HALF_RL}, { + "OverUnderLT", GST_ASF_3D_TOP_AND_BOTTOM_HALF_LR}, { + "DualStream", GST_ASF_3D_DUAL_STREAM} + }; + /* *INDENT-ON* */ + + GST_INFO_OBJECT (demux, "object is an extended content description"); + + taglist = gst_tag_list_new_empty (); + + /* Content Descriptor Count */ + if (size < 2) + goto not_enough_data; + + blockcount = gst_asf_demux_get_uint16 (&data, &size); + + for (i = 1; i <= blockcount; ++i) { + const gchar *gst_tag_name; + guint16 datatype; + guint16 value_len; + guint16 name_len; + GValue tag_value = { 0, }; + gsize in, out; + gchar *name; + gchar *name_utf8 = NULL; + gchar *value; + + /* Descriptor */ + if (!gst_asf_demux_get_string (&name, &name_len, &data, &size)) + goto not_enough_data; + + if (size < 2) { + g_free (name); + goto not_enough_data; + } + /* Descriptor Value Data Type */ + datatype = gst_asf_demux_get_uint16 (&data, &size); + + /* Descriptor Value (not really a string, but same thing reading-wise) */ + if (!gst_asf_demux_get_string (&value, &value_len, &data, &size)) { + g_free (name); + goto not_enough_data; + } + + name_utf8 = + g_convert (name, name_len, "UTF-8", "UTF-16LE", &in, &out, NULL); + + if (name_utf8 != NULL) { + GST_DEBUG ("Found tag/metadata %s", name_utf8); + + gst_tag_name = gst_asf_demux_get_gst_tag_from_tag_name (name_utf8); + GST_DEBUG ("gst_tag_name %s", GST_STR_NULL (gst_tag_name)); + + switch (datatype) { + case ASF_DEMUX_DATA_TYPE_UTF16LE_STRING:{ + gchar *value_utf8; + + value_utf8 = g_convert (value, value_len, "UTF-8", "UTF-16LE", + &in, &out, NULL); + + /* get rid of tags with empty value */ + if (value_utf8 != NULL && *value_utf8 != '\0') { + GST_DEBUG ("string value %s", value_utf8); + + value_utf8[out] = '\0'; + + if (gst_tag_name != NULL) { + if (strcmp (gst_tag_name, GST_TAG_DATE_TIME) == 0) { + guint year = atoi (value_utf8); + + if (year > 0) { + g_value_init (&tag_value, GST_TYPE_DATE_TIME); + g_value_take_boxed (&tag_value, gst_date_time_new_y (year)); + } + } else if (strcmp (gst_tag_name, GST_TAG_GENRE) == 0) { + guint id3v1_genre_id; + const gchar *genre_str; + + if (sscanf (value_utf8, "(%u)", &id3v1_genre_id) == 1 && + ((genre_str = gst_tag_id3_genre_get (id3v1_genre_id)))) { + GST_DEBUG ("Genre: %s -> %s", value_utf8, genre_str); + g_free (value_utf8); + value_utf8 = g_strdup (genre_str); + } + } else if (!strcmp (gst_tag_name, GST_TAG_ALBUM_VOLUME_COUNT)) { + guint num = 0, count = 0; + + if (sscanf (value_utf8, "%u/%u", &num, &count) == 2 + && num > 0 && num <= 99999 && count > 0 && count <= 99999) { + GST_DEBUG ("Disc %u of %u (%s)", num, count, value_utf8); + g_value_init (&tag_value, G_TYPE_UINT); + /* disc number */ + g_value_set_uint (&tag_value, num); + gst_tag_list_add_values (taglist, GST_TAG_MERGE_APPEND, + GST_TAG_ALBUM_VOLUME_NUMBER, &tag_value, NULL); + /* disc count (will be added to the taglist below) */ + g_value_set_uint (&tag_value, count); + } else { + GST_DEBUG ("Couldn't parse PartOfSet value %s", value_utf8); + } + } else { + GType tag_type; + + /* convert tag from string to other type if required */ + tag_type = gst_tag_get_type (gst_tag_name); + g_value_init (&tag_value, tag_type); + if (!gst_value_deserialize (&tag_value, value_utf8)) { + GValue from_val = { 0, }; + + g_value_init (&from_val, G_TYPE_STRING); + g_value_set_string (&from_val, value_utf8); + if (!g_value_transform (&from_val, &tag_value)) { + GST_WARNING_OBJECT (demux, + "Could not transform string tag to " "%s tag type %s", + gst_tag_name, g_type_name (tag_type)); + g_value_unset (&tag_value); + } + g_value_unset (&from_val); + } + } + } else { + /* metadata ! */ + GST_DEBUG ("Setting metadata"); + g_value_init (&tag_value, G_TYPE_STRING); + g_value_set_string (&tag_value, value_utf8); + /* If we found a stereoscopic marker, look for StereoscopicLayout + * metadata */ + if (content3D) { + guint i; + if (strncmp ("StereoscopicLayout", name_utf8, + strlen (name_utf8)) == 0) { + for (i = 0; i < G_N_ELEMENTS (stereoscopic_layout_map); i++) { + if (g_str_equal (stereoscopic_layout_map[i].interleave_name, + value_utf8)) { + demux->asf_3D_mode = + stereoscopic_layout_map[i].interleaving_type; + GST_INFO ("find interleave type %u", demux->asf_3D_mode); + } + } + } + GST_INFO_OBJECT (demux, "3d type is %u", demux->asf_3D_mode); + } else { + demux->asf_3D_mode = GST_ASF_3D_NONE; + GST_INFO_OBJECT (demux, "None 3d type"); + } + } + } else if (value_utf8 == NULL) { + GST_WARNING ("Failed to convert string value to UTF8, skipping"); + } else { + GST_DEBUG ("Skipping empty string value for %s", + GST_STR_NULL (gst_tag_name)); + } + g_free (value_utf8); + break; + } + case ASF_DEMUX_DATA_TYPE_BYTE_ARRAY:{ + if (gst_tag_name) { + if (!g_str_equal (gst_tag_name, GST_TAG_IMAGE)) { + GST_FIXME ("Unhandled byte array tag %s", + GST_STR_NULL (gst_tag_name)); + break; + } else { + asf_demux_parse_picture_tag (taglist, (guint8 *) value, + value_len); + } + } + break; + } + case ASF_DEMUX_DATA_TYPE_DWORD:{ + guint uint_val; + + if (value_len < 4) + break; + + uint_val = GST_READ_UINT32_LE (value); + + /* this is the track number */ + g_value_init (&tag_value, G_TYPE_UINT); + + /* WM/Track counts from 0 */ + if (!strcmp (name_utf8, "WM/Track")) + ++uint_val; + + g_value_set_uint (&tag_value, uint_val); + break; + } + /* Detect 3D */ + case ASF_DEMUX_DATA_TYPE_BOOL:{ + gboolean bool_val; + + if (value_len < 4) + break; + + bool_val = GST_READ_UINT32_LE (value); + + if (strncmp ("Stereoscopic", name_utf8, strlen (name_utf8)) == 0) { + if (bool_val) { + GST_INFO_OBJECT (demux, "This is 3D contents"); + content3D = TRUE; + } else { + GST_INFO_OBJECT (demux, "This is not 3D contenst"); + content3D = FALSE; + } + } + + break; + } + default:{ + GST_DEBUG ("Skipping tag %s of type %d", gst_tag_name, datatype); + break; + } + } + + if (G_IS_VALUE (&tag_value)) { + if (gst_tag_name) { + GstTagMergeMode merge_mode = GST_TAG_MERGE_APPEND; + + /* WM/TrackNumber is more reliable than WM/Track, since the latter + * is supposed to have a 0 base but is often wrongly written to start + * from 1 as well, so prefer WM/TrackNumber when we have it: either + * replace the value added earlier from WM/Track or put it first in + * the list, so that it will get picked up by _get_uint() */ + if (strcmp (name_utf8, "WM/TrackNumber") == 0) + merge_mode = GST_TAG_MERGE_REPLACE; + + gst_tag_list_add_values (taglist, merge_mode, gst_tag_name, + &tag_value, NULL); + } else { + GST_DEBUG ("Setting global metadata %s", name_utf8); + gst_structure_set_value (demux->global_metadata, name_utf8, + &tag_value); + } + + g_value_unset (&tag_value); + } + } + + g_free (name); + g_free (value); + g_free (name_utf8); + } + + gst_asf_demux_add_global_tags (demux, taglist); + + return GST_FLOW_OK; + + /* Errors */ +not_enough_data: + { + GST_WARNING ("Unexpected end of data parsing ext content desc object"); + gst_tag_list_unref (taglist); + return GST_FLOW_OK; /* not really fatal */ + } +} + +static GstStructure * +gst_asf_demux_get_metadata_for_stream (GstASFDemux * demux, guint stream_num) +{ + gchar sname[32]; + guint i; + + g_snprintf (sname, sizeof (sname), "stream-%u", stream_num); + + for (i = 0; i < gst_caps_get_size (demux->metadata); ++i) { + GstStructure *s; + + s = gst_caps_get_structure (demux->metadata, i); + if (gst_structure_has_name (s, sname)) + return s; + } + + gst_caps_append_structure (demux->metadata, gst_structure_new_empty (sname)); + + /* try lookup again; demux->metadata took ownership of the structure, so we + * can't really make any assumptions about what happened to it, so we can't + * just return it directly after appending it */ + return gst_asf_demux_get_metadata_for_stream (demux, stream_num); +} + +static GstFlowReturn +gst_asf_demux_process_metadata (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + guint16 blockcount, i; + + GST_INFO_OBJECT (demux, "object is a metadata object"); + + /* Content Descriptor Count */ + if (size < 2) + goto not_enough_data; + + blockcount = gst_asf_demux_get_uint16 (&data, &size); + + for (i = 0; i < blockcount; ++i) { + GstStructure *s; + guint16 stream_num, name_len, data_type, lang_idx G_GNUC_UNUSED; + guint32 data_len, ival; + gchar *name_utf8; + + if (size < (2 + 2 + 2 + 2 + 4)) + goto not_enough_data; + + lang_idx = gst_asf_demux_get_uint16 (&data, &size); + stream_num = gst_asf_demux_get_uint16 (&data, &size); + name_len = gst_asf_demux_get_uint16 (&data, &size); + data_type = gst_asf_demux_get_uint16 (&data, &size); + data_len = gst_asf_demux_get_uint32 (&data, &size); + + if (size < name_len + data_len) + goto not_enough_data; + + /* convert name to UTF-8 */ + name_utf8 = g_convert ((gchar *) data, name_len, "UTF-8", "UTF-16LE", + NULL, NULL, NULL); + gst_asf_demux_skip_bytes (name_len, &data, &size); + + if (name_utf8 == NULL) { + GST_WARNING ("Failed to convert value name to UTF8, skipping"); + gst_asf_demux_skip_bytes (data_len, &data, &size); + continue; + } + + if (data_type != ASF_DEMUX_DATA_TYPE_DWORD) { + gst_asf_demux_skip_bytes (data_len, &data, &size); + g_free (name_utf8); + continue; + } + + /* read DWORD */ + if (size < 4) { + g_free (name_utf8); + goto not_enough_data; + } + + ival = gst_asf_demux_get_uint32 (&data, &size); + + /* skip anything else there may be, just in case */ + gst_asf_demux_skip_bytes (data_len - 4, &data, &size); + + s = gst_asf_demux_get_metadata_for_stream (demux, stream_num); + gst_structure_set (s, name_utf8, G_TYPE_INT, ival, NULL); + g_free (name_utf8); + } + + GST_INFO_OBJECT (demux, "metadata = %" GST_PTR_FORMAT, demux->metadata); + return GST_FLOW_OK; + + /* Errors */ +not_enough_data: + { + GST_WARNING ("Unexpected end of data parsing metadata object"); + return GST_FLOW_OK; /* not really fatal */ + } +} + +static GstFlowReturn +gst_asf_demux_process_header (GstASFDemux * demux, guint8 * data, guint64 size) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 i, num_objects; + guint8 unknown G_GNUC_UNUSED; + + /* Get the rest of the header's header */ + if (size < (4 + 1 + 1)) + goto not_enough_data; + + num_objects = gst_asf_demux_get_uint32 (&data, &size); + unknown = gst_asf_demux_get_uint8 (&data, &size); + unknown = gst_asf_demux_get_uint8 (&data, &size); + + GST_INFO_OBJECT (demux, "object is a header with %u parts", num_objects); + demux->saw_file_header = FALSE; + /* Loop through the header's objects, processing those */ + for (i = 0; i < num_objects; ++i) { + GST_INFO_OBJECT (demux, "reading header part %u", i); + ret = gst_asf_demux_process_object (demux, &data, &size); + if (ret != GST_FLOW_OK) { + GST_WARNING ("process_object returned %s", gst_asf_get_flow_name (ret)); + break; + } + } + if (!demux->saw_file_header) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Header does not have mandatory FILE section")); + return GST_FLOW_ERROR; + } + + return ret; + +not_enough_data: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("short read parsing HEADER object")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_asf_demux_process_file (GstASFDemux * demux, guint8 * data, guint64 size) +{ + guint64 creation_time G_GNUC_UNUSED; + guint64 file_size G_GNUC_UNUSED; + guint64 send_time G_GNUC_UNUSED; + guint64 packets_count, play_time, preroll; + guint32 flags, min_pktsize, max_pktsize, min_bitrate G_GNUC_UNUSED; + + if (size < (16 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 4)) + goto not_enough_data; + + gst_asf_demux_skip_bytes (16, &data, &size); /* skip GUID */ + file_size = gst_asf_demux_get_uint64 (&data, &size); + creation_time = gst_asf_demux_get_uint64 (&data, &size); + packets_count = gst_asf_demux_get_uint64 (&data, &size); + play_time = gst_asf_demux_get_uint64 (&data, &size); + send_time = gst_asf_demux_get_uint64 (&data, &size); + preroll = gst_asf_demux_get_uint64 (&data, &size); + flags = gst_asf_demux_get_uint32 (&data, &size); + min_pktsize = gst_asf_demux_get_uint32 (&data, &size); + max_pktsize = gst_asf_demux_get_uint32 (&data, &size); + min_bitrate = gst_asf_demux_get_uint32 (&data, &size); + + demux->broadcast = ! !(flags & 0x01); + demux->seekable = ! !(flags & 0x02); + + GST_DEBUG_OBJECT (demux, "min_pktsize = %u", min_pktsize); + GST_DEBUG_OBJECT (demux, "flags::broadcast = %d", demux->broadcast); + GST_DEBUG_OBJECT (demux, "flags::seekable = %d", demux->seekable); + + if (demux->broadcast) { + /* these fields are invalid if the broadcast flag is set */ + play_time = 0; + file_size = 0; + } + + if (min_pktsize != max_pktsize) + goto non_fixed_packet_size; + + demux->packet_size = max_pktsize; + + /* FIXME: do we need send_time as well? what is it? */ + if ((play_time * 100) >= (preroll * GST_MSECOND)) + demux->play_time = (play_time * 100) - (preroll * GST_MSECOND); + else + demux->play_time = 0; + + demux->preroll = preroll * GST_MSECOND; + + /* initial latency */ + demux->latency = demux->preroll; + + if (demux->play_time == 0) + demux->seekable = FALSE; + + GST_DEBUG_OBJECT (demux, "play_time %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->play_time)); + GST_DEBUG_OBJECT (demux, "preroll %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->preroll)); + + if (demux->play_time > 0) { + demux->segment.duration = demux->play_time; + } + + GST_INFO ("object is a file with %" G_GUINT64_FORMAT " data packets", + packets_count); + GST_INFO ("preroll = %" G_GUINT64_FORMAT, demux->preroll); + + demux->saw_file_header = TRUE; + + return GST_FLOW_OK; + +/* ERRORS */ +non_fixed_packet_size: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("packet size must be fixed")); + return GST_FLOW_ERROR; + } +not_enough_data: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("short read parsing FILE object")); + return GST_FLOW_ERROR; + } +} + +/* Content Description Object */ +static GstFlowReturn +gst_asf_demux_process_comment (GstASFDemux * demux, guint8 * data, guint64 size) +{ + /* *INDENT-OFF* */ + struct + { + const gchar *gst_tag; + guint16 val_length; + gchar *val_utf8; + } tags[5] = { + { + GST_TAG_TITLE, 0, NULL}, { + GST_TAG_ARTIST, 0, NULL}, { + GST_TAG_COPYRIGHT, 0, NULL}, { + GST_TAG_DESCRIPTION, 0, NULL}, { + GST_TAG_COMMENT, 0, NULL} + }; + /* *INDENT-ON* */ + GstTagList *taglist; + GValue value = { 0 }; + gsize in, out; + gint i = -1; + + GST_INFO_OBJECT (demux, "object is a comment"); + + if (size < (2 + 2 + 2 + 2 + 2)) + goto not_enough_data; + + tags[0].val_length = gst_asf_demux_get_uint16 (&data, &size); + tags[1].val_length = gst_asf_demux_get_uint16 (&data, &size); + tags[2].val_length = gst_asf_demux_get_uint16 (&data, &size); + tags[3].val_length = gst_asf_demux_get_uint16 (&data, &size); + tags[4].val_length = gst_asf_demux_get_uint16 (&data, &size); + + GST_DEBUG_OBJECT (demux, "Comment lengths: title=%d author=%d copyright=%d " + "description=%d rating=%d", tags[0].val_length, tags[1].val_length, + tags[2].val_length, tags[3].val_length, tags[4].val_length); + + for (i = 0; i < G_N_ELEMENTS (tags); ++i) { + if (size < tags[i].val_length) + goto not_enough_data; + + /* might be just '/0', '/0'... */ + if (tags[i].val_length > 2 && tags[i].val_length % 2 == 0) { + /* convert to UTF-8 */ + tags[i].val_utf8 = g_convert ((gchar *) data, tags[i].val_length, + "UTF-8", "UTF-16LE", &in, &out, NULL); + } + gst_asf_demux_skip_bytes (tags[i].val_length, &data, &size); + } + + /* parse metadata into taglist */ + taglist = gst_tag_list_new_empty (); + g_value_init (&value, G_TYPE_STRING); + for (i = 0; i < G_N_ELEMENTS (tags); ++i) { + if (tags[i].val_utf8 && strlen (tags[i].val_utf8) > 0 && tags[i].gst_tag) { + g_value_set_string (&value, tags[i].val_utf8); + gst_tag_list_add_values (taglist, GST_TAG_MERGE_APPEND, + tags[i].gst_tag, &value, NULL); + } + } + g_value_unset (&value); + + gst_asf_demux_add_global_tags (demux, taglist); + + for (i = 0; i < G_N_ELEMENTS (tags); ++i) + g_free (tags[i].val_utf8); + + return GST_FLOW_OK; + +not_enough_data: + { + GST_WARNING_OBJECT (demux, "unexpectedly short of data while processing " + "comment tag section %d, skipping comment object", i); + for (i = 0; i < G_N_ELEMENTS (tags); i++) + g_free (tags[i].val_utf8); + return GST_FLOW_OK; /* not really fatal */ + } +} + +static GstFlowReturn +gst_asf_demux_process_bitrate_props_object (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + guint16 num_streams, i; + AsfStream *stream; + + if (size < 2) + goto not_enough_data; + + num_streams = gst_asf_demux_get_uint16 (&data, &size); + + GST_INFO ("object is a bitrate properties object with %u streams", + num_streams); + + if (size < (num_streams * (2 + 4))) + goto not_enough_data; + + for (i = 0; i < num_streams; ++i) { + guint32 bitrate; + guint16 stream_id; + + stream_id = gst_asf_demux_get_uint16 (&data, &size); + bitrate = gst_asf_demux_get_uint32 (&data, &size); + + if (stream_id < GST_ASF_DEMUX_NUM_STREAM_IDS) { + GST_DEBUG_OBJECT (demux, "bitrate of stream %u = %u", stream_id, bitrate); + stream = gst_asf_demux_get_stream (demux, stream_id); + if (stream) { + if (stream->pending_tags == NULL) + stream->pending_tags = gst_tag_list_new_empty (); + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, bitrate, NULL); + } else { + GST_WARNING_OBJECT (demux, "Stream id %u wasn't found", stream_id); + } + } else { + GST_WARNING ("stream id %u is too large", stream_id); + } + } + + return GST_FLOW_OK; + +not_enough_data: + { + GST_WARNING_OBJECT (demux, "short read parsing bitrate props object!"); + return GST_FLOW_OK; /* not really fatal */ + } +} + +static GstFlowReturn +gst_asf_demux_process_header_ext (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint64 hdr_size; + + /* Get the rest of the header's header */ + if (size < (16 + 2 + 4)) + goto not_enough_data; + + /* skip GUID and two other bytes */ + gst_asf_demux_skip_bytes (16 + 2, &data, &size); + hdr_size = gst_asf_demux_get_uint32 (&data, &size); + + GST_INFO ("extended header object with a size of %u bytes", (guint) size); + + /* FIXME: does data_size include the rest of the header that we have read? */ + if (hdr_size > size) + goto not_enough_data; + + while (hdr_size > 0) { + ret = gst_asf_demux_process_object (demux, &data, &hdr_size); + if (ret != GST_FLOW_OK) + break; + } + + return ret; + +not_enough_data: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("short read parsing extended header object")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_asf_demux_process_language_list (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + guint i; + + if (size < 2) + goto not_enough_data; + + if (demux->languages) { + GST_WARNING ("More than one LANGUAGE_LIST object in stream"); + g_strfreev (demux->languages); + demux->languages = NULL; + demux->num_languages = 0; + } + + demux->num_languages = gst_asf_demux_get_uint16 (&data, &size); + GST_LOG ("%u languages:", demux->num_languages); + + demux->languages = g_new0 (gchar *, demux->num_languages + 1); + for (i = 0; i < demux->num_languages; ++i) { + guint8 len, *lang_data = NULL; + + if (size < 1) + goto not_enough_data; + len = gst_asf_demux_get_uint8 (&data, &size); + if (gst_asf_demux_get_bytes (&lang_data, len, &data, &size)) { + gchar *utf8; + + utf8 = g_convert ((gchar *) lang_data, len, "UTF-8", "UTF-16LE", NULL, + NULL, NULL); + + /* truncate "en-us" etc. to just "en" */ + if (utf8 && strlen (utf8) >= 5 && (utf8[2] == '-' || utf8[2] == '_')) { + utf8[2] = '\0'; + } + GST_DEBUG ("[%u] %s", i, GST_STR_NULL (utf8)); + demux->languages[i] = utf8; + g_free (lang_data); + } else { + goto not_enough_data; + } + } + + return GST_FLOW_OK; + +not_enough_data: + { + GST_WARNING_OBJECT (demux, "short read parsing language list object!"); + g_free (demux->languages); + demux->languages = NULL; + demux->num_languages = 0; + return GST_FLOW_OK; /* not fatal */ + } +} + +static GstFlowReturn +gst_asf_demux_process_simple_index (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + GstClockTime interval; + guint32 count, i; + + if (size < (16 + 8 + 4 + 4)) + goto not_enough_data; + + /* skip file id */ + gst_asf_demux_skip_bytes (16, &data, &size); + interval = gst_asf_demux_get_uint64 (&data, &size) * (GstClockTime) 100; + gst_asf_demux_skip_bytes (4, &data, &size); + count = gst_asf_demux_get_uint32 (&data, &size); + if (count > 0) { + demux->sidx_interval = interval; + demux->sidx_num_entries = count; + g_free (demux->sidx_entries); + demux->sidx_entries = g_new0 (AsfSimpleIndexEntry, count); + + for (i = 0; i < count; ++i) { + if (G_UNLIKELY (size < 6)) { + /* adjust for broken files, to avoid having entries at the end + * of the parsed index that point to time=0. Resulting in seeking to + * the end of the file leading back to the beginning */ + demux->sidx_num_entries -= (count - i); + break; + } + demux->sidx_entries[i].packet = gst_asf_demux_get_uint32 (&data, &size); + demux->sidx_entries[i].count = gst_asf_demux_get_uint16 (&data, &size); + GST_LOG_OBJECT (demux, "%" GST_TIME_FORMAT " = packet %4u count : %2d", + GST_TIME_ARGS (i * interval), demux->sidx_entries[i].packet, + demux->sidx_entries[i].count); + } + } else { + GST_DEBUG_OBJECT (demux, "simple index object with 0 entries"); + } + + return GST_FLOW_OK; + +not_enough_data: + { + GST_WARNING_OBJECT (demux, "short read parsing simple index object!"); + return GST_FLOW_OK; /* not fatal */ + } +} + +static GstFlowReturn +gst_asf_demux_process_advanced_mutual_exclusion (GstASFDemux * demux, + guint8 * data, guint64 size) +{ + ASFGuid guid; + guint16 num, i; + + if (size < 16 + 2 + (2 * 2)) + goto not_enough_data; + + gst_asf_demux_get_guid (&guid, &data, &size); + num = gst_asf_demux_get_uint16 (&data, &size); + + if (num < 2) { + GST_WARNING_OBJECT (demux, "nonsensical mutually exclusive streams count"); + return GST_FLOW_OK; + } + + if (size < (num * sizeof (guint16))) + goto not_enough_data; + + /* read mutually exclusive stream numbers */ + for (i = 0; i < num; ++i) { + guint8 mes; + mes = gst_asf_demux_get_uint16 (&data, &size) & 0x7f; + GST_LOG_OBJECT (demux, "mutually exclusive: stream %d", mes); + + demux->mut_ex_streams = + g_slist_append (demux->mut_ex_streams, GINT_TO_POINTER (mes)); + } + + + return GST_FLOW_OK; + + /* Errors */ +not_enough_data: + { + GST_WARNING_OBJECT (demux, "short read parsing advanced mutual exclusion"); + return GST_FLOW_OK; /* not absolutely fatal */ + } +} + +gboolean +gst_asf_demux_is_unknown_stream (GstASFDemux * demux, guint stream_num) +{ + return g_slist_find (demux->other_streams, + GINT_TO_POINTER (stream_num)) == NULL; +} + +static GstFlowReturn +gst_asf_demux_process_ext_stream_props (GstASFDemux * demux, guint8 * data, + guint64 size) +{ + AsfStreamExtProps esp; + AsfStream *stream = NULL; + AsfObject stream_obj; + guint16 stream_name_count; + guint16 num_payload_ext; + guint64 len; + guint8 *stream_obj_data = NULL; + guint8 *data_start; + guint obj_size; + guint i, stream_num; + + data_start = data; + obj_size = (guint) size; + + esp.payload_extensions = NULL; + + if (size < 64) + goto not_enough_data; + + esp.valid = TRUE; + esp.start_time = gst_asf_demux_get_uint64 (&data, &size) * GST_MSECOND; + esp.end_time = gst_asf_demux_get_uint64 (&data, &size) * GST_MSECOND; + esp.data_bitrate = gst_asf_demux_get_uint32 (&data, &size); + esp.buffer_size = gst_asf_demux_get_uint32 (&data, &size); + esp.intial_buf_fullness = gst_asf_demux_get_uint32 (&data, &size); + esp.data_bitrate2 = gst_asf_demux_get_uint32 (&data, &size); + esp.buffer_size2 = gst_asf_demux_get_uint32 (&data, &size); + esp.intial_buf_fullness2 = gst_asf_demux_get_uint32 (&data, &size); + esp.max_obj_size = gst_asf_demux_get_uint32 (&data, &size); + esp.flags = gst_asf_demux_get_uint32 (&data, &size); + stream_num = gst_asf_demux_get_uint16 (&data, &size); + esp.lang_idx = gst_asf_demux_get_uint16 (&data, &size); + esp.avg_time_per_frame = gst_asf_demux_get_uint64 (&data, &size); + stream_name_count = gst_asf_demux_get_uint16 (&data, &size); + num_payload_ext = gst_asf_demux_get_uint16 (&data, &size); + + GST_INFO ("start_time = %" GST_TIME_FORMAT, + GST_TIME_ARGS (esp.start_time)); + GST_INFO ("end_time = %" GST_TIME_FORMAT, + GST_TIME_ARGS (esp.end_time)); + GST_INFO ("flags = %08x", esp.flags); + GST_INFO ("average time per frame = %" GST_TIME_FORMAT, + GST_TIME_ARGS (esp.avg_time_per_frame * 100)); + GST_INFO ("stream number = %u", stream_num); + GST_INFO ("stream language ID idx = %u (%s)", esp.lang_idx, + (esp.lang_idx < demux->num_languages) ? + GST_STR_NULL (demux->languages[esp.lang_idx]) : "??"); + GST_INFO ("stream name count = %u", stream_name_count); + + /* read stream names */ + for (i = 0; i < stream_name_count; ++i) { + guint16 stream_lang_idx G_GNUC_UNUSED; + gchar *stream_name = NULL; + + if (size < 2) + goto not_enough_data; + stream_lang_idx = gst_asf_demux_get_uint16 (&data, &size); + if (!gst_asf_demux_get_string (&stream_name, NULL, &data, &size)) + goto not_enough_data; + GST_INFO ("stream name %d: %s", i, GST_STR_NULL (stream_name)); + g_free (stream_name); /* TODO: store names in struct */ + } + + /* read payload extension systems stuff */ + GST_LOG ("payload extension systems count = %u", num_payload_ext); + + if (num_payload_ext > 0) + esp.payload_extensions = g_new0 (AsfPayloadExtension, num_payload_ext + 1); + + for (i = 0; i < num_payload_ext; ++i) { + AsfPayloadExtension ext; + ASFGuid ext_guid; + guint32 sys_info_len; + + if (size < 16 + 2 + 4) + goto not_enough_data; + + gst_asf_demux_get_guid (&ext_guid, &data, &size); + ext.id = gst_asf_demux_identify_guid (asf_payload_ext_guids, &ext_guid); + ext.len = gst_asf_demux_get_uint16 (&data, &size); + + sys_info_len = gst_asf_demux_get_uint32 (&data, &size); + GST_LOG ("payload systems info len = %u", sys_info_len); + if (!gst_asf_demux_skip_bytes (sys_info_len, &data, &size)) + goto not_enough_data; + + esp.payload_extensions[i] = ext; + } + + GST_LOG ("bytes read: %u/%u", (guint) (data - data_start), obj_size); + + /* there might be an optional STREAM_INFO object here now; if not, we + * should have parsed the corresponding stream info object already (since + * we are parsing the extended stream properties objects delayed) */ + if (size == 0) { + stream = gst_asf_demux_get_stream (demux, stream_num); + goto done; + } + + if (size < ASF_OBJECT_HEADER_SIZE) + goto not_enough_data; + + /* get size of the stream object */ + if (!asf_demux_peek_object (demux, data, size, &stream_obj, TRUE)) + goto corrupted_stream; + + if (stream_obj.id != ASF_OBJ_STREAM) + goto expected_stream_object; + + if (stream_obj.size < ASF_OBJECT_HEADER_SIZE || + stream_obj.size > (10 * 1024 * 1024)) + goto not_enough_data; + + gst_asf_demux_skip_bytes (ASF_OBJECT_HEADER_SIZE, &data, &size); + + /* process this stream object later after all the other 'normal' ones + * have been processed (since the others are more important/non-hidden) */ + len = stream_obj.size - ASF_OBJECT_HEADER_SIZE; + if (!gst_asf_demux_get_bytes (&stream_obj_data, len, &data, &size)) + goto not_enough_data; + + /* parse stream object */ + stream = gst_asf_demux_parse_stream_object (demux, stream_obj_data, len); + g_free (stream_obj_data); + +done: + + if (stream) { + stream->ext_props = esp; + + /* try to set the framerate */ + if (stream->is_video && stream->caps) { + GValue framerate = { 0 }; + GstStructure *s; + gint num, denom; + + g_value_init (&framerate, GST_TYPE_FRACTION); + + num = GST_SECOND / 100; + denom = esp.avg_time_per_frame; + if (denom == 0) { + /* avoid division by 0, assume 25/1 framerate */ + denom = GST_SECOND / 2500; + } + + gst_value_set_fraction (&framerate, num, denom); + + stream->caps = gst_caps_make_writable (stream->caps); + s = gst_caps_get_structure (stream->caps, 0); + gst_structure_set_value (s, "framerate", &framerate); + g_value_unset (&framerate); + GST_DEBUG_OBJECT (demux, "setting framerate of %d/%d = %f", + num, denom, ((gdouble) num) / denom); + } + + /* add language info now if we have it */ + if (stream->ext_props.lang_idx < demux->num_languages) { + if (stream->pending_tags == NULL) + stream->pending_tags = gst_tag_list_new_empty (); + GST_LOG_OBJECT (demux, "stream %u has language '%s'", stream->id, + demux->languages[stream->ext_props.lang_idx]); + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_APPEND, + GST_TAG_LANGUAGE_CODE, demux->languages[stream->ext_props.lang_idx], + NULL); + } + } else if (gst_asf_demux_is_unknown_stream (demux, stream_num)) { + GST_WARNING_OBJECT (demux, "Ext. stream properties for unknown stream"); + } + + if (!stream) + g_free (esp.payload_extensions); + + return GST_FLOW_OK; + + /* Errors */ +not_enough_data: + { + GST_WARNING_OBJECT (demux, "short read parsing ext stream props object!"); + g_free (esp.payload_extensions); + return GST_FLOW_OK; /* not absolutely fatal */ + } +expected_stream_object: + { + GST_WARNING_OBJECT (demux, "error parsing extended stream properties " + "object: expected embedded stream object, but got %s object instead!", + gst_asf_get_guid_nick (asf_object_guids, stream_obj.id)); + g_free (esp.payload_extensions); + return GST_FLOW_OK; /* not absolutely fatal */ + } +corrupted_stream: + { + GST_WARNING_OBJECT (demux, "Corrupted stream"); + g_free (esp.payload_extensions); + return GST_FLOW_ERROR; + } +} + +static const gchar * +gst_asf_demux_push_obj (GstASFDemux * demux, guint32 obj_id) +{ + const gchar *nick; + + nick = gst_asf_get_guid_nick (asf_object_guids, obj_id); + if (g_str_has_prefix (nick, "ASF_OBJ_")) + nick += strlen ("ASF_OBJ_"); + + if (demux->objpath == NULL) { + demux->objpath = g_strdup (nick); + } else { + gchar *newpath; + + newpath = g_strdup_printf ("%s/%s", demux->objpath, nick); + g_free (demux->objpath); + demux->objpath = newpath; + } + + return (const gchar *) demux->objpath; +} + +static void +gst_asf_demux_pop_obj (GstASFDemux * demux) +{ + gchar *s; + + if ((s = g_strrstr (demux->objpath, "/"))) { + *s = '\0'; + } else { + g_free (demux->objpath); + demux->objpath = NULL; + } +} + +static void +gst_asf_demux_process_queued_extended_stream_objects (GstASFDemux * demux) +{ + GSList *l; + guint i; + + /* Parse the queued extended stream property objects and add the info + * to the existing streams or add the new embedded streams, but without + * activating them yet */ + GST_LOG_OBJECT (demux, "%u queued extended stream properties objects", + g_slist_length (demux->ext_stream_props)); + + for (l = demux->ext_stream_props, i = 0; l != NULL; l = l->next, ++i) { + GstBuffer *buf = GST_BUFFER (l->data); + GstMapInfo map; + + gst_buffer_map (buf, &map, GST_MAP_READ); + + GST_LOG_OBJECT (demux, "parsing ext. stream properties object #%u", i); + gst_asf_demux_process_ext_stream_props (demux, map.data, map.size); + gst_buffer_unmap (buf, &map); + gst_buffer_unref (buf); + } + g_slist_free (demux->ext_stream_props); + demux->ext_stream_props = NULL; +} + +#if 0 +static void +gst_asf_demux_activate_ext_props_streams (GstASFDemux * demux) +{ + guint i, j; + + for (i = 0; i < demux->num_streams; ++i) { + AsfStream *stream; + gboolean is_hidden; + GSList *x; + + stream = &demux->stream[i]; + + GST_LOG_OBJECT (demux, "checking stream %2u", stream->id); + + if (stream->active) { + GST_LOG_OBJECT (demux, "stream %2u is already activated", stream->id); + continue; + } + + is_hidden = FALSE; + for (x = demux->mut_ex_streams; x != NULL; x = x->next) { + guint8 *mes; + + /* check for each mutual exclusion whether it affects this stream */ + for (mes = (guint8 *) x->data; mes != NULL && *mes != 0xff; ++mes) { + if (*mes == stream->id) { + /* if yes, check if we've already added streams that are mutually + * exclusive with the stream we're about to add */ + for (mes = (guint8 *) x->data; mes != NULL && *mes != 0xff; ++mes) { + for (j = 0; j < demux->num_streams; ++j) { + /* if the broadcast flag is set, assume the hidden streams aren't + * actually streamed and hide them (or playbin won't work right), + * otherwise assume their data is available */ + if (demux->stream[j].id == *mes && demux->broadcast) { + is_hidden = TRUE; + GST_LOG_OBJECT (demux, "broadcast stream ID %d to be added is " + "mutually exclusive with already existing stream ID %d, " + "hiding stream", stream->id, demux->stream[j].id); + goto next; + } + } + } + break; + } + } + } + + next: + + /* FIXME: we should do stream activation based on preroll data in + * streaming mode too */ + if (demux->streaming && !is_hidden) + gst_asf_demux_activate_stream (demux, stream); + } +} +#endif + +static GstFlowReturn +gst_asf_demux_process_object (GstASFDemux * demux, guint8 ** p_data, + guint64 * p_size) +{ + GstFlowReturn ret = GST_FLOW_OK; + AsfObject obj; + guint64 obj_data_size; + + if (*p_size < ASF_OBJECT_HEADER_SIZE) + return ASF_FLOW_NEED_MORE_DATA; + + if (!asf_demux_peek_object (demux, *p_data, ASF_OBJECT_HEADER_SIZE, &obj, + TRUE)) + return GST_FLOW_ERROR; + gst_asf_demux_skip_bytes (ASF_OBJECT_HEADER_SIZE, p_data, p_size); + + obj_data_size = obj.size - ASF_OBJECT_HEADER_SIZE; + + if (*p_size < obj_data_size) + return ASF_FLOW_NEED_MORE_DATA; + + gst_asf_demux_push_obj (demux, obj.id); + + GST_INFO ("%s: size %" G_GUINT64_FORMAT, demux->objpath, obj.size); + + switch (obj.id) { + case ASF_OBJ_STREAM: + gst_asf_demux_parse_stream_object (demux, *p_data, obj_data_size); + ret = GST_FLOW_OK; + break; + case ASF_OBJ_FILE: + ret = gst_asf_demux_process_file (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_HEADER: + ret = gst_asf_demux_process_header (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_COMMENT: + ret = gst_asf_demux_process_comment (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_HEAD1: + ret = gst_asf_demux_process_header_ext (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_BITRATE_PROPS: + ret = + gst_asf_demux_process_bitrate_props_object (demux, *p_data, + obj_data_size); + break; + case ASF_OBJ_EXT_CONTENT_DESC: + ret = + gst_asf_demux_process_ext_content_desc (demux, *p_data, + obj_data_size); + break; + case ASF_OBJ_METADATA_OBJECT: + ret = gst_asf_demux_process_metadata (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_EXTENDED_STREAM_PROPS:{ + GstBuffer *buf; + + /* process these later, we might not have parsed the corresponding + * stream object yet */ + GST_LOG ("%s: queued for later parsing", demux->objpath); + buf = gst_buffer_new_and_alloc (obj_data_size); + gst_buffer_fill (buf, 0, *p_data, obj_data_size); + demux->ext_stream_props = g_slist_append (demux->ext_stream_props, buf); + ret = GST_FLOW_OK; + break; + } + case ASF_OBJ_LANGUAGE_LIST: + ret = gst_asf_demux_process_language_list (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_ADVANCED_MUTUAL_EXCLUSION: + ret = gst_asf_demux_process_advanced_mutual_exclusion (demux, *p_data, + obj_data_size); + break; + case ASF_OBJ_SIMPLE_INDEX: + ret = gst_asf_demux_process_simple_index (demux, *p_data, obj_data_size); + break; + case ASF_OBJ_CONTENT_ENCRYPTION: + case ASF_OBJ_EXT_CONTENT_ENCRYPTION: + case ASF_OBJ_DIGITAL_SIGNATURE_OBJECT: + case ASF_OBJ_UNKNOWN_ENCRYPTION_OBJECT: + goto error_encrypted; + case ASF_OBJ_CONCEAL_NONE: + case ASF_OBJ_HEAD2: + case ASF_OBJ_UNDEFINED: + case ASF_OBJ_CODEC_COMMENT: + case ASF_OBJ_INDEX: + case ASF_OBJ_PADDING: + case ASF_OBJ_BITRATE_MUTEX: + case ASF_OBJ_COMPATIBILITY: + case ASF_OBJ_INDEX_PLACEHOLDER: + case ASF_OBJ_INDEX_PARAMETERS: + case ASF_OBJ_STREAM_PRIORITIZATION: + case ASF_OBJ_SCRIPT_COMMAND: + case ASF_OBJ_METADATA_LIBRARY_OBJECT: + default: + /* Unknown/unhandled object, skip it and hope for the best */ + GST_INFO ("%s: skipping object", demux->objpath); + ret = GST_FLOW_OK; + break; + } + + /* this can't fail, we checked the number of bytes available before */ + gst_asf_demux_skip_bytes (obj_data_size, p_data, p_size); + + GST_LOG ("%s: ret = %s", demux->objpath, gst_asf_get_flow_name (ret)); + + gst_asf_demux_pop_obj (demux); + + return ret; + +/* ERRORS */ +error_encrypted: + { + GST_ELEMENT_ERROR (demux, STREAM, DECRYPT, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +} + +static void +gst_asf_demux_descramble_buffer (GstASFDemux * demux, AsfStream * stream, + GstBuffer ** p_buffer) +{ + GstBuffer *descrambled_buffer; + GstBuffer *scrambled_buffer; + GstBuffer *sub_buffer; + guint offset; + guint off; + guint row; + guint col; + guint idx; + + /* descrambled_buffer is initialised in the first iteration */ + descrambled_buffer = NULL; + scrambled_buffer = *p_buffer; + + if (gst_buffer_get_size (scrambled_buffer) < + stream->ds_packet_size * stream->span) + return; + + for (offset = 0; offset < gst_buffer_get_size (scrambled_buffer); + offset += stream->ds_chunk_size) { + off = offset / stream->ds_chunk_size; + row = off / stream->span; + col = off % stream->span; + idx = row + col * stream->ds_packet_size / stream->ds_chunk_size; + GST_DEBUG ("idx=%u, row=%u, col=%u, off=%u, ds_chunk_size=%u", idx, row, + col, off, stream->ds_chunk_size); + GST_DEBUG ("scrambled buffer size=%" G_GSIZE_FORMAT + ", span=%u, packet_size=%u", gst_buffer_get_size (scrambled_buffer), + stream->span, stream->ds_packet_size); + GST_DEBUG ("gst_buffer_get_size (scrambled_buffer) = %" G_GSIZE_FORMAT, + gst_buffer_get_size (scrambled_buffer)); + sub_buffer = + gst_buffer_copy_region (scrambled_buffer, GST_BUFFER_COPY_MEMORY, + idx * stream->ds_chunk_size, stream->ds_chunk_size); + if (!offset) { + descrambled_buffer = sub_buffer; + } else { + descrambled_buffer = gst_buffer_append (descrambled_buffer, sub_buffer); + } + } + + GST_BUFFER_TIMESTAMP (descrambled_buffer) = + GST_BUFFER_TIMESTAMP (scrambled_buffer); + GST_BUFFER_DURATION (descrambled_buffer) = + GST_BUFFER_DURATION (scrambled_buffer); + GST_BUFFER_OFFSET (descrambled_buffer) = GST_BUFFER_OFFSET (scrambled_buffer); + GST_BUFFER_OFFSET_END (descrambled_buffer) = + GST_BUFFER_OFFSET_END (scrambled_buffer); + + /* FIXME/CHECK: do we need to transfer buffer flags here too? */ + + gst_buffer_unref (scrambled_buffer); + *p_buffer = descrambled_buffer; +} + +static gboolean +gst_asf_demux_element_send_event (GstElement * element, GstEvent * event) +{ + GstASFDemux *demux = GST_ASF_DEMUX (element); + gint i; + + GST_DEBUG ("handling element event of type %s", GST_EVENT_TYPE_NAME (event)); + + for (i = 0; i < demux->num_streams; ++i) { + gst_event_ref (event); + if (gst_asf_demux_handle_src_event (demux->stream[i].pad, + GST_OBJECT_CAST (element), event)) { + gst_event_unref (event); + return TRUE; + } + } + + gst_event_unref (event); + return FALSE; +} + +/* takes ownership of the passed event */ +static gboolean +gst_asf_demux_send_event_unlocked (GstASFDemux * demux, GstEvent * event) +{ + gboolean ret = TRUE; + gint i; + + GST_DEBUG_OBJECT (demux, "sending %s event to all source pads", + GST_EVENT_TYPE_NAME (event)); + + for (i = 0; i < demux->num_streams; ++i) { + gst_event_ref (event); + ret &= gst_pad_push_event (demux->stream[i].pad, event); + } + gst_event_unref (event); + return ret; +} + +static gboolean +gst_asf_demux_handle_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + GstASFDemux *demux; + gboolean res = FALSE; + + demux = GST_ASF_DEMUX (parent); + + GST_DEBUG ("handling %s query", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + if (format != GST_FORMAT_TIME) { + GST_LOG ("only support duration queries in TIME format"); + break; + } + + res = gst_pad_query_default (pad, parent, query); + if (!res) { + GST_OBJECT_LOCK (demux); + + if (demux->segment.duration != GST_CLOCK_TIME_NONE) { + GST_LOG ("returning duration: %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->segment.duration)); + + gst_query_set_duration (query, GST_FORMAT_TIME, + demux->segment.duration); + + res = TRUE; + } else { + GST_LOG ("duration not known yet"); + } + + GST_OBJECT_UNLOCK (demux); + } + break; + } + + case GST_QUERY_POSITION:{ + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + if (format != GST_FORMAT_TIME) { + GST_LOG ("only support position queries in TIME format"); + break; + } + + GST_OBJECT_LOCK (demux); + + if (demux->segment.position != GST_CLOCK_TIME_NONE) { + GST_LOG ("returning position: %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->segment.position)); + + gst_query_set_position (query, GST_FORMAT_TIME, + demux->segment.position); + + res = TRUE; + } else { + GST_LOG ("position not known yet"); + } + + GST_OBJECT_UNLOCK (demux); + break; + } + + case GST_QUERY_SEEKING:{ + GstFormat format; + + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + if (format == GST_FORMAT_TIME) { + gint64 duration; + + GST_OBJECT_LOCK (demux); + duration = demux->segment.duration; + GST_OBJECT_UNLOCK (demux); + + if (!demux->streaming || !demux->seekable) { + gst_query_set_seeking (query, GST_FORMAT_TIME, demux->seekable, 0, + duration); + res = TRUE; + } else { + GstFormat fmt; + gboolean seekable; + + /* try upstream first in TIME */ + res = gst_pad_query_default (pad, parent, query); + + gst_query_parse_seeking (query, &fmt, &seekable, NULL, NULL); + GST_LOG_OBJECT (demux, "upstream %s seekable %d", + GST_STR_NULL (gst_format_get_name (fmt)), seekable); + /* if no luck, maybe in BYTES */ + if (!seekable || fmt != GST_FORMAT_TIME) { + GstQuery *q; + + q = gst_query_new_seeking (GST_FORMAT_BYTES); + if ((res = gst_pad_peer_query (demux->sinkpad, q))) { + gst_query_parse_seeking (q, &fmt, &seekable, NULL, NULL); + GST_LOG_OBJECT (demux, "upstream %s seekable %d", + GST_STR_NULL (gst_format_get_name (fmt)), seekable); + if (fmt != GST_FORMAT_BYTES) + seekable = FALSE; + } + gst_query_unref (q); + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, + duration); + res = TRUE; + } + } + } else + GST_LOG_OBJECT (demux, "only support seeking in TIME format"); + break; + } + + case GST_QUERY_LATENCY: + { + gboolean live; + GstClockTime min, max; + + /* preroll delay does not matter in non-live pipeline, + * but we might end up in a live (rtsp) one ... */ + + /* first forward */ + res = gst_pad_query_default (pad, parent, query); + if (!res) + break; + + gst_query_parse_latency (query, &live, &min, &max); + + GST_DEBUG_OBJECT (demux, "Peer latency: live %d, min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, live, + GST_TIME_ARGS (min), GST_TIME_ARGS (max)); + + GST_OBJECT_LOCK (demux); + min += demux->latency; + if (max != -1) + max += demux->latency; + GST_OBJECT_UNLOCK (demux); + + gst_query_set_latency (query, live, min, max); + break; + } + case GST_QUERY_SEGMENT: + { + GstFormat format; + gint64 start, stop; + + format = demux->segment.format; + + start = + gst_segment_to_stream_time (&demux->segment, format, + demux->segment.start); + if ((stop = demux->segment.stop) == -1) + stop = demux->segment.duration; + else + stop = gst_segment_to_stream_time (&demux->segment, format, stop); + + gst_query_set_segment (query, demux->segment.rate, format, start, stop); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + +static void +gst_asf_demux_finalize (GObject * object) +{ + GstASFDemux *demux = GST_ASF_DEMUX (object); + + if (demux->metadata) + gst_caps_unref (demux->metadata); + demux->metadata = NULL; + + if (demux->global_metadata) + gst_structure_free (demux->global_metadata); + demux->global_metadata = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_asf_demux_change_state (GstElement * element, GstStateChange transition) +{ + GstASFDemux *demux = GST_ASF_DEMUX (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY:{ + gst_segment_init (&demux->segment, GST_FORMAT_TIME); + demux->need_newsegment = TRUE; + demux->segment_running = FALSE; + demux->keyunit_sync = FALSE; + demux->accurate = FALSE; + demux->adapter = gst_adapter_new (); + demux->data_size = 0; + demux->data_offset = 0; + demux->index_offset = 0; + demux->base_offset = 0; + demux->flowcombiner = gst_flow_combiner_new (); + + break; + } + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_asf_demux_reset (demux, FALSE); + break; + + case GST_STATE_CHANGE_READY_TO_NULL: + gst_asf_demux_reset (demux, FALSE); + gst_flow_combiner_free (demux->flowcombiner); + demux->flowcombiner = NULL; + break; + default: + break; + } + + return ret; +} diff --git a/gst/asfdemux/gstasfdemux.h b/gst/asfdemux/gstasfdemux.h new file mode 100644 index 0000000000..841b21ad4f --- /dev/null +++ b/gst/asfdemux/gstasfdemux.h @@ -0,0 +1,256 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __ASF_DEMUX_H__ +#define __ASF_DEMUX_H__ + +#include +#include +#include + +#include "asfheaders.h" + +G_BEGIN_DECLS + +#define GST_TYPE_ASF_DEMUX \ + (gst_asf_demux_get_type()) +#define GST_ASF_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASF_DEMUX,GstASFDemux)) +#define GST_ASF_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASF_DEMUX,GstASFDemuxClass)) +#define GST_IS_ASF_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASF_DEMUX)) +#define GST_IS_ASF_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASF_DEMUX)) + +typedef struct _GstASFDemux GstASFDemux; +typedef struct _GstASFDemuxClass GstASFDemuxClass; +typedef enum _GstASF3DMode GstASF3DMode; + +typedef struct { + guint32 packet; + guint16 count; +} AsfSimpleIndexEntry; + +typedef struct { + AsfPayloadExtensionID id : 16; /* extension ID; the :16 makes sure the + * struct gets packed into 4 bytes */ + guint16 len; /* save this so we can skip unknown IDs */ +} AsfPayloadExtension; + +/* + * 3D Types for Media play + */ +enum _GstASF3DMode +{ + GST_ASF_3D_NONE = 0x00, + + //added, interim format - half + GST_ASF_3D_SIDE_BY_SIDE_HALF_LR = 0x01, + GST_ASF_3D_SIDE_BY_SIDE_HALF_RL = 0x02, + GST_ASF_3D_TOP_AND_BOTTOM_HALF_LR = 0x03, + GST_ASF_3D_TOP_AND_BOTTOM_HALF_RL = 0x04, + GST_ASF_3D_DUAL_STREAM = 0x0D, /*< Full format*/ +}; + +typedef struct +{ + gboolean valid; /* TRUE if structure is valid/filled */ + + GstClockTime start_time; + GstClockTime end_time; + GstClockTime avg_time_per_frame; + guint32 data_bitrate; + guint32 buffer_size; + guint32 intial_buf_fullness; + guint32 data_bitrate2; + guint32 buffer_size2; + guint32 intial_buf_fullness2; + guint32 max_obj_size; + guint32 flags; + guint16 lang_idx; + + /* may be NULL if there are no extensions; otherwise, terminated by + * an AsfPayloadExtension record with len 0 */ + AsfPayloadExtension *payload_extensions; + + /* missing: stream names */ +} AsfStreamExtProps; + +typedef struct +{ + AsfStreamType type; + + gboolean active; /* if the stream has been activated (pad added) */ + + GstPad *pad; + guint16 id; + + /* video-only */ + gboolean is_video; + gboolean fps_known; + + GstCaps *caps; + + GstBuffer *streamheader; + + GstTagList *pending_tags; + + gboolean discont; + gboolean first_buffer; + + /* Descrambler settings */ + guint8 span; + guint16 ds_packet_size; + guint16 ds_chunk_size; + guint16 ds_data_size; + + /* for new parsing code */ + GArray *payloads; /* pending payloads */ + + /* Video stream PAR & interlacing */ + guint8 par_x; + guint8 par_y; + gboolean interlaced; + + /* For reverse playback */ + gboolean reverse_kf_ready; /* Found complete KF payload*/ + GArray *payloads_rev; /* Temp queue for storing multiple payloads of packet*/ + gint kf_pos; /* KF position in payload queue. Payloads from this pos will be pushed */ + + /* extended stream properties (optional) */ + AsfStreamExtProps ext_props; + + gboolean inspect_payload; +} AsfStream; + +typedef enum { + GST_ASF_DEMUX_STATE_HEADER, + GST_ASF_DEMUX_STATE_DATA, + GST_ASF_DEMUX_STATE_INDEX +} GstASFDemuxState; + +#define GST_ASF_DEMUX_IS_REVERSE_PLAYBACK(seg) (seg.rate < 0.0? TRUE:FALSE) + +#define GST_ASF_DEMUX_NUM_VIDEO_PADS 16 +#define GST_ASF_DEMUX_NUM_AUDIO_PADS 32 +#define GST_ASF_DEMUX_NUM_STREAMS 32 +#define GST_ASF_DEMUX_NUM_STREAM_IDS 127 + +struct _GstASFDemux { + GstElement element; + + GstPad *sinkpad; + + gboolean have_group_id; + guint group_id; + + GstAdapter *adapter; + GstTagList *taglist; + GstASFDemuxState state; + + /* byte offset where the asf starts, which might not be zero on chained + * asfs, index_offset and data_offset already are 'offseted' by base_offset */ + guint64 base_offset; + + guint64 index_offset; /* byte offset where index might be, or 0 */ + guint64 data_offset; /* byte offset where packets start */ + guint64 data_size; /* total size of packet data in bytes, or 0 */ + guint64 num_packets; /* total number of data packets, or 0 */ + gint64 packet; /* current packet */ + guint speed_packets; /* Known number of packets to get in one go*/ + + gchar **languages; + guint num_languages; + + GstCaps *metadata; /* metadata, for delayed parsing; one + * structure ('stream-N') per stream */ + GstStructure *global_metadata; /* metadata which isn't specific to one stream */ + GSList *ext_stream_props; /* for delayed processing (buffers) */ + GSList *mut_ex_streams; /* mutually exclusive streams */ + + guint32 num_audio_streams; + guint32 num_video_streams; + guint32 num_streams; + AsfStream stream[GST_ASF_DEMUX_NUM_STREAMS]; + gboolean activated_streams; + GstFlowCombiner *flowcombiner; + + /* for chained asf handling, we need to hold the old asf streams until + * we detect the new ones */ + AsfStream old_stream[GST_ASF_DEMUX_NUM_STREAMS]; + gboolean old_num_streams; + + GstClockTime first_ts; /* smallest timestamp found */ + + guint32 packet_size; + guint64 play_time; + + guint64 preroll; + + gboolean seekable; + gboolean broadcast; + + GstSegment segment; /* configured play segment */ + gboolean keyunit_sync; + gboolean accurate; + + gboolean need_newsegment; /* do we need to send a new-segment event? */ + guint32 segment_seqnum; /* if the new segment must have this seqnum */ + GstClockTime segment_ts; /* streaming; timestamp for segment start */ + GstSegment in_segment; /* streaming; upstream segment info */ + GstClockTime in_gap; /* streaming; upstream initial segment gap for interpolation */ + gboolean segment_running; /* if we've started the current segment */ + gboolean streaming; /* TRUE if we are operating chain-based */ + GstClockTime latency; + + /* for debugging only */ + gchar *objpath; + + /* simple index, if available */ + GstClockTime sidx_interval; /* interval between entries in ns */ + guint sidx_num_entries; /* number of index entries */ + AsfSimpleIndexEntry *sidx_entries; /* packet number for each entry */ + + GSList *other_streams; /* remember streams that are in header but have unknown type */ + + /* For reverse playback */ + gboolean seek_to_cur_pos; /* Search packets till we reach 'seek' time */ + gboolean multiple_payloads; /* Whether packet has multiple payloads */ + + /* parsing 3D */ + GstASF3DMode asf_3D_mode; + + gboolean saw_file_header; +}; + +struct _GstASFDemuxClass { + GstElementClass parent_class; +}; + +GType gst_asf_demux_get_type (void); + +AsfStream * gst_asf_demux_get_stream (GstASFDemux * demux, guint16 id); + +gboolean gst_asf_demux_is_unknown_stream(GstASFDemux *demux, guint stream_num); + +G_END_DECLS + +#endif /* __ASF_DEMUX_H__ */ diff --git a/gst/asfdemux/gstasfelement.c b/gst/asfdemux/gstasfelement.c new file mode 100644 index 0000000000..3991f489e8 --- /dev/null +++ b/gst/asfdemux/gstasfelement.c @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gst/gst-i18n-plugin.h" + +#include "gstasfelements.h" + +/* #include "gstasfmux.h" */ +GST_DEBUG_CATEGORY_EXTERN (asfdemux_dbg); +#define GST_CAT_DEFAULT asfdemux_dbg + +void +asf_element_init (GstPlugin * plugin) +{ + static gsize res = FALSE; + if (g_once_init_enter (&res)) { + GST_DEBUG_CATEGORY_INIT (asfdemux_dbg, "asfdemux", 0, + "asf demuxer element"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + gst_riff_init (); + g_once_init_leave (&res, TRUE); + } + +} diff --git a/gst/asfdemux/gstasfelements.h b/gst/asfdemux/gstasfelements.h new file mode 100644 index 0000000000..5495322c28 --- /dev/null +++ b/gst/asfdemux/gstasfelements.h @@ -0,0 +1,39 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_ASF_ELEMENTS_H__ +#define __GST_ASF_ELEMENTS_H__ + + +#include +#include + + +G_BEGIN_DECLS + +void asf_element_init (GstPlugin * plugin); + +GST_ELEMENT_REGISTER_DECLARE (asfdemux); +GST_ELEMENT_REGISTER_DECLARE (rtspwms); +GST_ELEMENT_REGISTER_DECLARE (rtpasfdepay); + +G_END_DECLS + +#endif /* __GST_ASF_ELEMENTS_H__ */ diff --git a/gst/asfdemux/gstrtpasfdepay.c b/gst/asfdemux/gstrtpasfdepay.c new file mode 100644 index 0000000000..c9e247202b --- /dev/null +++ b/gst/asfdemux/gstrtpasfdepay.c @@ -0,0 +1,546 @@ +/* GStreamer RTP ASF depayloader + * Copyright (C) 2006 Tim-Philipp Müller + * 2009 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstasfelements.h" +#include "gstrtpasfdepay.h" +#include + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (rtpasfdepayload_debug); +#define GST_CAT_DEFAULT rtpasfdepayload_debug + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-ms-asf") + ); + +/* Other parameters: config, maxps */ +#define SINK_CAPS \ + "application/x-rtp, " \ + "media = (string) { \"application\", \"video\", \"audio\" }, " \ + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " \ + "clock-rate = (int) [1, MAX ], " \ + "encoding-name = (string) \"X-ASF-PF\"" + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +#define gst_rtp_asf_depay_parent_class parent_class +G_DEFINE_TYPE (GstRtpAsfDepay, gst_rtp_asf_depay, GST_TYPE_RTP_BASE_DEPAYLOAD); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (rtpasfdepay, "rtpasfdepay", + GST_RANK_MARGINAL, GST_TYPE_RTP_ASF_DEPAY, asf_element_init (plugin)); + +static void gst_rtp_asf_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_asf_depay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_asf_depay_setcaps (GstRTPBaseDepayload * depay, + GstCaps * caps); +static GstBuffer *gst_rtp_asf_depay_process (GstRTPBaseDepayload * basedepay, + GstBuffer * buf); + +static void +gst_rtp_asf_depay_class_init (GstRtpAsfDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstRTPBaseDepayloadClass *gstrtpbasedepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstrtpbasedepayload_class = (GstRTPBaseDepayloadClass *) klass; + + gst_element_class_add_static_pad_template (gstelement_class, &src_factory); + gst_element_class_add_static_pad_template (gstelement_class, &sink_factory); + + gst_element_class_set_static_metadata (gstelement_class, + "RTP ASF packet depayloader", "Codec/Depayloader/Network", + "Extracts ASF streams from RTP", + "Tim-Philipp Müller , " + "Wim Taymans "); + + gobject_class->finalize = gst_rtp_asf_depay_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_asf_depay_change_state); + + gstrtpbasedepayload_class->set_caps = + GST_DEBUG_FUNCPTR (gst_rtp_asf_depay_setcaps); + gstrtpbasedepayload_class->process = + GST_DEBUG_FUNCPTR (gst_rtp_asf_depay_process); + + GST_DEBUG_CATEGORY_INIT (rtpasfdepayload_debug, "rtpasfdepayload", 0, + "RTP asf depayloader element"); +} + +static void +gst_rtp_asf_depay_init (GstRtpAsfDepay * depay) +{ + depay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_asf_depay_finalize (GObject * object) +{ + GstRtpAsfDepay *depay; + + depay = GST_RTP_ASF_DEPAY (object); + + g_object_unref (depay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const guint8 asf_marker[16] = { 0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66, + 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c +}; + +static gboolean +gst_rtp_asf_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) +{ + GstRtpAsfDepay *depay; + GstStructure *s; + const gchar *config_str, *ps_string; + GstBuffer *buf; + GstCaps *src_caps; + guint8 *headers; + gsize headers_len; + gint clock_rate; + + depay = GST_RTP_ASF_DEPAY (depayload); + + s = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (s, "clock-rate", &clock_rate) || clock_rate < 0) + clock_rate = 1000; + depayload->clock_rate = clock_rate; + + /* config contains the asf headers in base64 coding */ + config_str = gst_structure_get_string (s, "config"); + if (config_str == NULL || *config_str == '\0') + goto no_config; + + ps_string = gst_structure_get_string (s, "maxps"); + if (ps_string == NULL || *ps_string == '\0') + goto no_packetsize; + + if (depay->packet_size) { + /* header sent again following seek; + * discard to avoid confusing upstream */ + if (depay->packet_size == atoi (ps_string)) { + goto duplicate_header; + } else { + /* since we should fiddle with downstream state to handle this */ + goto refuse_renegotiation; + } + } else + depay->packet_size = atoi (ps_string); + if (depay->packet_size <= 16) + goto invalid_packetsize; + + headers = (guint8 *) g_base64_decode (config_str, &headers_len); + + if (headers == NULL || headers_len < 16 + || memcmp (headers, asf_marker, 16) != 0) + goto invalid_headers; + + src_caps = gst_caps_new_empty_simple ("video/x-ms-asf"); + gst_pad_set_caps (depayload->srcpad, src_caps); + gst_caps_unref (src_caps); + + buf = gst_buffer_new (); + gst_buffer_append_memory (buf, + gst_memory_new_wrapped (0, headers, headers_len, 0, headers_len, headers, + g_free)); + + gst_rtp_base_depayload_push (depayload, buf); + + return TRUE; + + /* ERRORS */ +no_config: + { + GST_WARNING_OBJECT (depay, "caps without 'config' field with asf headers"); + return FALSE; + } +no_packetsize: + { + GST_WARNING_OBJECT (depay, "caps without 'maxps' (packet size) field"); + return FALSE; + } +invalid_packetsize: + { + GST_WARNING_OBJECT (depay, "packet size %u invalid", depay->packet_size); + return FALSE; + } +invalid_headers: + { + GST_WARNING_OBJECT (depay, "headers don't look like valid ASF headers"); + g_free (headers); + return FALSE; + } +duplicate_header: + { + GST_DEBUG_OBJECT (depayload, "discarding duplicate header"); + return TRUE; + } +refuse_renegotiation: + { + GST_WARNING_OBJECT (depayload, "cannot renegotiate to different header"); + return FALSE; + } +} + +static gint +field_size (guint8 field) +{ + switch (field) { + /* DWORD - 32 bits */ + case 3: + return 4; + + /* WORD - 16 bits */ + case 2: + return 2; + + /* BYTE - 8 bits */ + case 1: + return 1; + + /* non-exitent */ + case 0: + default: + return 0; + } +} + +/* Set the padding field to te correct value as the spec + * says it should be se to 0 in the rtp packets + */ +static GstBuffer * +gst_rtp_asf_depay_update_padding (GstRtpAsfDepay * depayload, GstBuffer * buf) +{ + GstBuffer *result; + GstMapInfo map; + guint8 *data; + gint offset = 0; + guint8 aux; + guint8 seq_type; + guint8 pad_type; + guint8 pkt_type; + gsize plen, padding; + + plen = gst_buffer_get_size (buf); + if (plen == depayload->packet_size) + return buf; + + padding = depayload->packet_size - plen; + + GST_LOG_OBJECT (depayload, + "padding buffer size %" G_GSIZE_FORMAT " to packet size %d", plen, + depayload->packet_size); + + result = gst_buffer_new_and_alloc (depayload->packet_size); + + gst_buffer_map (result, &map, GST_MAP_READ); + data = map.data; + memset (data + plen, 0, padding); + + gst_buffer_extract (buf, 0, data, plen); + gst_buffer_unref (buf); + + aux = data[offset++]; + if (aux & 0x80) { + guint8 err_len = 0; + if (aux & 0x60) { + GST_WARNING_OBJECT (depayload, "Error correction length type should be " + "set to 0"); + /* this packet doesn't follow the spec */ + gst_buffer_unmap (result, &map); + return result; + } + err_len = aux & 0x0F; + offset += err_len; + + aux = data[offset++]; + } + seq_type = (aux >> 1) & 0x3; + pad_type = (aux >> 3) & 0x3; + pkt_type = (aux >> 5) & 0x3; + + offset += 1; /* skip property flags */ + offset += field_size (pkt_type); /* skip packet length */ + offset += field_size (seq_type); /* skip sequence field */ + + /* write padding */ + switch (pad_type) { + /* DWORD */ + case 3: + GST_WRITE_UINT32_LE (&(data[offset]), padding); + break; + + /* WORD */ + case 2: + GST_WRITE_UINT16_LE (&(data[offset]), padding); + break; + + /* BYTE */ + case 1: + data[offset] = (guint8) padding; + break; + + /* non-existent */ + case 0: + default: + break; + } + gst_buffer_unmap (result, &map); + + return result; +} + +/* Docs: 'RTSP Protocol PDF' document from http://sdp.ppona.com/ (page 8) */ + +static GstBuffer * +gst_rtp_asf_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) +{ + GstRtpAsfDepay *depay; + const guint8 *payload; + GstBuffer *outbuf; + gboolean S, L, R, D, I; + guint payload_len, hdr_len, offset; + guint len_offs; + GstClockTime timestamp; + GstRTPBuffer rtpbuf = { NULL }; + + depay = GST_RTP_ASF_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_LOG_OBJECT (depay, "got DISCONT"); + gst_adapter_clear (depay->adapter); + depay->discont = TRUE; + } + + gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf); + timestamp = GST_BUFFER_TIMESTAMP (buf); + + payload_len = gst_rtp_buffer_get_payload_len (&rtpbuf); + payload = gst_rtp_buffer_get_payload (&rtpbuf); + offset = 0; + + GST_LOG_OBJECT (depay, "got payload len of %u", payload_len); + + do { + guint packet_len; + + /* packet header is at least 4 bytes */ + if (payload_len < 4) + goto too_small; + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |S|L|R|D|I|RES | Length/Offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Relative Timestamp (optional) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Duration (optional) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | LocationId (optional) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * S: packet contains a keyframe. + * L: If 1, Length/Offset contains length, else contains the byte offset + * of the fragment's first byte counted from the beginning of the + * complete ASF data packet. + * R: relative timestamp present + * D: duration present + * I: locationid present + */ + + S = ((payload[0] & 0x80) != 0); + L = ((payload[0] & 0x40) != 0); + R = ((payload[0] & 0x20) != 0); + D = ((payload[0] & 0x10) != 0); + I = ((payload[0] & 0x08) != 0); + + hdr_len = 4; + + len_offs = (payload[1] << 16) | (payload[2] << 8) | payload[3]; + + if (R) { + GST_DEBUG ("Relative timestamp field present : %u", + GST_READ_UINT32_BE (payload + hdr_len)); + hdr_len += 4; + } + if (D) { + GST_DEBUG ("Duration field present : %u", + GST_READ_UINT32_BE (payload + hdr_len)); + hdr_len += 4; + } + if (I) { + GST_DEBUG ("LocationId field present : %u", + GST_READ_UINT32_BE (payload + hdr_len)); + hdr_len += 4; + } + + GST_LOG_OBJECT (depay, "S %d, L %d, R %d, D %d, I %d", S, L, R, D, I); + GST_LOG_OBJECT (depay, "payload_len:%d, hdr_len:%d, len_offs:%d", + payload_len, hdr_len, len_offs); + + if (payload_len < hdr_len) + goto too_small; + + /* skip headers */ + payload_len -= hdr_len; + payload += hdr_len; + offset += hdr_len; + + if (L) { + /* L bit set, len contains the length of the packet */ + packet_len = len_offs; + } else { + /* else it contains an offset which we don't handle yet */ + GST_LOG_OBJECT (depay, "We have a fragmented packet"); + packet_len = payload_len; + } + + if (packet_len > payload_len) + packet_len = payload_len; + + GST_LOG_OBJECT (depay, "packet len %u, payload len %u, packet_size:%u", + packet_len, payload_len, depay->packet_size); + + if (!L) { + guint available; + GstBuffer *sub; + + /* Fragmented packet handling */ + outbuf = NULL; + + if (len_offs == (available = gst_adapter_available (depay->adapter))) { + /* fragment aligns with what we have, add it */ + GST_LOG_OBJECT (depay, "collecting fragment"); + sub = + gst_rtp_buffer_get_payload_subbuffer (&rtpbuf, offset, packet_len); + gst_adapter_push (depay->adapter, sub); + /* RTP marker bit M is set if this is last fragment */ + if (gst_rtp_buffer_get_marker (&rtpbuf)) { + GST_LOG_OBJECT (depay, "last fragment, assembling packet"); + outbuf = + gst_adapter_take_buffer (depay->adapter, available + packet_len); + } + } else { + if (available) { + GST_WARNING_OBJECT (depay, "Offset doesn't match previous data?!"); + GST_DEBUG_OBJECT (depay, "clearing for re-sync"); + gst_adapter_clear (depay->adapter); + } else + GST_DEBUG_OBJECT (depay, "waiting for start of packet"); + } + } else { + GST_LOG_OBJECT (depay, "collecting packet"); + outbuf = + gst_rtp_buffer_get_payload_subbuffer (&rtpbuf, offset, packet_len); + } + + /* If we haven't completed a full ASF packet, return */ + if (!outbuf) + return NULL; + + outbuf = gst_rtp_asf_depay_update_padding (depay, outbuf); + + if (!S) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + + if (depay->discont) { + GST_LOG_OBJECT (depay, "setting DISCONT"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + depay->discont = FALSE; + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + gst_rtp_base_depayload_push (depayload, outbuf); + + /* only apply the timestamp to the first buffer of this packet */ + timestamp = -1; + + /* skip packet data */ + payload += packet_len; + offset += packet_len; + payload_len -= packet_len; + } while (payload_len > 0); + + gst_rtp_buffer_unmap (&rtpbuf); + + return NULL; + +/* ERRORS */ +too_small: + { + gst_rtp_buffer_unmap (&rtpbuf); + GST_WARNING_OBJECT (depayload, "Payload too small, expected at least 4 " + "bytes for header, but got only %d bytes", payload_len); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_asf_depay_change_state (GstElement * element, GstStateChange trans) +{ + GstStateChangeReturn ret; + GstRtpAsfDepay *depay; + + depay = GST_RTP_ASF_DEPAY (element); + + switch (trans) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (depay->adapter); + depay->discont = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, trans); + + switch (trans) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (depay->adapter); + break; + default: + break; + } + + return ret; +} diff --git a/gst/asfdemux/gstrtpasfdepay.h b/gst/asfdemux/gstrtpasfdepay.h new file mode 100644 index 0000000000..8388c8af48 --- /dev/null +++ b/gst/asfdemux/gstrtpasfdepay.h @@ -0,0 +1,64 @@ +/* GStreamer RTP ASF depayloader + * Copyright (C) 2006 Tim-Philipp Müller + * 2009 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RTP_ASF_DEPAY_H__ +#define __GST_RTP_ASF_DEPAY_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_ASF_DEPAY \ + (gst_rtp_asf_depay_get_type()) +#define GST_RTP_ASF_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ASF_DEPAY,GstRtpAsfDepay)) +#define GST_RTP_ASF_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ASF_DEPAY,GstRtpAsfDepayClass)) +#define GST_IS_RTP_ASF_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ASF_DEPAY)) +#define GST_IS_RTP_ASF_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ASF_DEPAY)) + +typedef struct _GstRtpAsfDepay GstRtpAsfDepay; +typedef struct _GstRtpAsfDepayClass GstRtpAsfDepayClass; + +struct _GstRtpAsfDepay +{ + GstRTPBaseDepayload depayload; + + guint packet_size; + + GstAdapter *adapter; + gboolean discont; +}; + +struct _GstRtpAsfDepayClass +{ + GstRTPBaseDepayloadClass depayload_class; +}; + +GType gst_rtp_asf_depay_get_type (void); + +G_END_DECLS + +#endif /* __GST_RTP_ASF_DEPAY_H__ */ diff --git a/gst/asfdemux/gstrtspwms.c b/gst/asfdemux/gstrtspwms.c new file mode 100644 index 0000000000..ff58e1bc48 --- /dev/null +++ b/gst/asfdemux/gstrtspwms.c @@ -0,0 +1,240 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-rtspwms + * @title: rtspwms + * + * A WMS RTSP extension + */ + +#include + +#include + +#include "gstasfelements.h" +#include "gstrtspwms.h" + +GST_DEBUG_CATEGORY_STATIC (rtspwms_debug); +#define GST_CAT_DEFAULT (rtspwms_debug) + +#define SERVER_PREFIX "WMServer/" +#define HEADER_PREFIX "data:application/vnd.ms.wms-hdr.asfv1;base64," +#define EXTENSION_CMD "application/x-wms-extension-cmd" + +static GstRTSPResult +gst_rtsp_wms_before_send (GstRTSPExtension * ext, GstRTSPMessage * request) +{ + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + GST_DEBUG_OBJECT (ext, "before send"); + + switch (request->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + /* activate ourselves with the first request */ + ctx->active = TRUE; + break; + } + default: + break; + } + return GST_RTSP_OK; +} + +static GstRTSPResult +gst_rtsp_wms_after_send (GstRTSPExtension * ext, GstRTSPMessage * req, + GstRTSPMessage * resp) +{ + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + GST_DEBUG_OBJECT (ext, "after send"); + + switch (req->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + gchar *server = NULL; + + gst_rtsp_message_get_header (resp, GST_RTSP_HDR_SERVER, &server, 0); + if (server && g_str_has_prefix (server, SERVER_PREFIX)) + ctx->active = TRUE; + else + ctx->active = FALSE; + break; + } + default: + break; + } + return GST_RTSP_OK; +} + + +static GstRTSPResult +gst_rtsp_wms_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, + GstStructure * props) +{ + const gchar *config, *maxps; + gint i; + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + if (!ctx->active) + return GST_RTSP_OK; + + for (i = 0; (config = gst_sdp_message_get_attribute_val_n (sdp, "pgmpu", i)); + i++) { + if (g_str_has_prefix (config, HEADER_PREFIX)) { + config += strlen (HEADER_PREFIX); + gst_structure_set (props, "config", G_TYPE_STRING, config, NULL); + break; + } + } + if (config == NULL) + goto no_config; + + gst_structure_set (props, "config", G_TYPE_STRING, config, NULL); + + maxps = gst_sdp_message_get_attribute_val (sdp, "maxps"); + if (maxps) + gst_structure_set (props, "maxps", G_TYPE_STRING, maxps, NULL); + + gst_structure_set (props, "encoding-name", G_TYPE_STRING, "X-ASF-PF", NULL); + gst_structure_set (props, "media", G_TYPE_STRING, "application", NULL); + + return GST_RTSP_OK; + + /* ERRORS */ +no_config: + { + GST_DEBUG_OBJECT (ctx, "Could not find config SDP field, deactivating."); + ctx->active = FALSE; + return GST_RTSP_OK; + } +} + +static gboolean +gst_rtsp_wms_configure_stream (GstRTSPExtension * ext, GstCaps * caps) +{ + GstRTSPWMS *ctx; + GstStructure *s; + const gchar *encoding; + + ctx = (GstRTSPWMS *) ext; + s = gst_caps_get_structure (caps, 0); + encoding = gst_structure_get_string (s, "encoding-name"); + + if (!encoding) + return TRUE; + + GST_DEBUG_OBJECT (ctx, "%" GST_PTR_FORMAT " encoding-name: %s", caps, + encoding); + + /* rtx streams do not need to be configured */ + if (!strcmp (encoding, "X-WMS-RTX")) + return FALSE; + + return TRUE; +} + +static GstRTSPResult +gst_rtsp_wms_receive_request (GstRTSPExtension * ext, GstRTSPMessage * request) +{ + GstRTSPWMS *ctx; + GstRTSPResult res = GST_RTSP_ENOTIMPL; + GstRTSPMessage response = { 0 }; + + ctx = (GstRTSPWMS *) ext; + + GST_DEBUG_OBJECT (ext, "before send"); + + switch (request->type_data.request.method) { + case GST_RTSP_SET_PARAMETER: + { + gchar *content_type = NULL; + + gst_rtsp_message_get_header (request, GST_RTSP_HDR_CONTENT_TYPE, + &content_type, 0); + + if (content_type && !g_ascii_strcasecmp (content_type, EXTENSION_CMD)) { + /* parse the command */ + + /* default implementation, send OK */ + res = gst_rtsp_message_init_response (&response, GST_RTSP_STS_OK, "OK", + request); + if (res < 0) + goto send_error; + + GST_DEBUG_OBJECT (ctx, "replying with OK"); + + /* send reply */ + if ((res = gst_rtsp_extension_send (ext, request, &response)) < 0) + goto send_error; + + res = GST_RTSP_EEOF; + } + break; + } + default: + break; + } + return res; + +send_error: + { + return res; + } +} + +static void gst_rtsp_wms_extension_init (gpointer g_iface, gpointer iface_data); + +G_DEFINE_TYPE_WITH_CODE (GstRTSPWMS, gst_rtsp_wms, GST_TYPE_ELEMENT, + G_IMPLEMENT_INTERFACE (GST_TYPE_RTSP_EXTENSION, + gst_rtsp_wms_extension_init)); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (rtspwms, "rtspwms", GST_RANK_SECONDARY, + GST_TYPE_RTSP_WMS, asf_element_init (plugin)); + +static void +gst_rtsp_wms_class_init (GstRTSPWMSClass * g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + GST_DEBUG_CATEGORY_INIT (rtspwms_debug, "rtspwms", 0, "WMS RTSP extension"); + + gst_element_class_set_static_metadata (element_class, "WMS RTSP Extension", + "Network/Extension/Protocol", + "Extends RTSP so that it can handle WMS setup", + "Wim Taymans "); +} + +static void +gst_rtsp_wms_init (GstRTSPWMS * rtspwms) +{ +} + +static void +gst_rtsp_wms_extension_init (gpointer g_iface, gpointer iface_data) +{ + GstRTSPExtensionInterface *iface = (GstRTSPExtensionInterface *) g_iface; + + iface->parse_sdp = gst_rtsp_wms_parse_sdp; + iface->before_send = gst_rtsp_wms_before_send; + iface->after_send = gst_rtsp_wms_after_send; + iface->configure_stream = gst_rtsp_wms_configure_stream; + iface->receive_request = gst_rtsp_wms_receive_request; +} diff --git a/gst/asfdemux/gstrtspwms.h b/gst/asfdemux/gstrtspwms.h new file mode 100644 index 0000000000..feb8c43fea --- /dev/null +++ b/gst/asfdemux/gstrtspwms.h @@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RTSP_WMS_H__ +#define __GST_RTSP_WMS_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTSP_WMS (gst_rtsp_wms_get_type()) +#define GST_IS_RTSP_WMS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSP_WMS)) +#define GST_IS_RTSP_WMS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSP_WMS)) +#define GST_RTSP_WMS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSP_WMS, GstRTSPWMS)) +#define GST_RTSP_WMS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSP_WMS, GstRTSPWMSClass)) + +typedef struct _GstRTSPWMS GstRTSPWMS; +typedef struct _GstRTSPWMSClass GstRTSPWMSClass; + +struct _GstRTSPWMS { + GstElement element; + + gboolean active; +}; + +struct _GstRTSPWMSClass { + GstElementClass parent_class; +}; + +GType gst_rtsp_wms_get_type(void); + +G_END_DECLS + +#endif /* __GST_RTSP_WMS_H__ */ diff --git a/gst/asfdemux/meson.build b/gst/asfdemux/meson.build new file mode 100644 index 0000000000..a86188be24 --- /dev/null +++ b/gst/asfdemux/meson.build @@ -0,0 +1,22 @@ +asf_sources = [ + 'gstasfdemux.c', + 'gstasf.c', + 'gstasfelement.c', + 'asfheaders.c', + 'asfpacket.c', + 'gstrtpasfdepay.c', + 'gstrtspwms.c', +] + +gstasf = library('gstasf', + asf_sources, + c_args : ugly_args, + include_directories : [configinc, libsinc], + dependencies : [gstbase_dep, gstrtp_dep, gstvideo_dep, + gstaudio_dep, gsttag_dep, gstriff_dep, + gstrtsp_dep, gstsdp_dep], + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstasf, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstasf] diff --git a/gst/dvdlpcmdec/gstdvdlpcmdec.c b/gst/dvdlpcmdec/gstdvdlpcmdec.c new file mode 100644 index 0000000000..9a32d48110 --- /dev/null +++ b/gst/dvdlpcmdec/gstdvdlpcmdec.c @@ -0,0 +1,1018 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Jan Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* Element-Checklist-Version: TODO */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include + +#include "gstdvdlpcmdec.h" +#include + +GST_DEBUG_CATEGORY_STATIC (dvdlpcm_debug); +#define GST_CAT_DEFAULT dvdlpcm_debug + +static GstStaticPadTemplate gst_dvdlpcmdec_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-private1-lpcm; " + "audio/x-private2-lpcm; " + "audio/x-private-ts-lpcm; " + "audio/x-lpcm, " + "width = (int) { 16, 20, 24 }, " + "rate = (int) { 32000, 44100, 48000, 96000 }, " + "channels = (int) [ 1, 8 ], " + "dynamic_range = (int) [ 0, 255 ], " + "emphasis = (boolean) { TRUE, FALSE }, " + "mute = (boolean) { TRUE, FALSE } ") + ); + +static GstStaticPadTemplate gst_dvdlpcmdec_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) { S16BE, S24BE }, " + "layout = (string) interleaved, " + "rate = (int) { 32000, 44100, 48000, 96000 }, " + "channels = (int) [ 1, 8 ]") + ); + +#define gst_dvdlpcmdec_parent_class parent_class +G_DEFINE_TYPE (GstDvdLpcmDec, gst_dvdlpcmdec, GST_TYPE_AUDIO_DECODER); +GST_ELEMENT_REGISTER_DEFINE (dvdlpcmdec, "dvdlpcmdec", GST_RANK_PRIMARY, + GST_TYPE_DVDLPCMDEC); + +static gboolean gst_dvdlpcmdec_set_format (GstAudioDecoder * bdec, + GstCaps * caps); +static GstFlowReturn gst_dvdlpcmdec_parse (GstAudioDecoder * bdec, + GstAdapter * adapter, gint * offset, gint * len); +static GstFlowReturn gst_dvdlpcmdec_handle_frame (GstAudioDecoder * bdec, + GstBuffer * buffer); +static GstFlowReturn gst_dvdlpcmdec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); + + +static void +gst_dvdlpcmdec_class_init (GstDvdLpcmDecClass * klass) +{ + GstElementClass *element_class; + GstAudioDecoderClass *gstbase_class; + + element_class = (GstElementClass *) klass; + gstbase_class = (GstAudioDecoderClass *) klass; + + gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_dvdlpcmdec_set_format); + gstbase_class->parse = GST_DEBUG_FUNCPTR (gst_dvdlpcmdec_parse); + gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_dvdlpcmdec_handle_frame); + + gst_element_class_add_static_pad_template (element_class, + &gst_dvdlpcmdec_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_dvdlpcmdec_src_template); + gst_element_class_set_static_metadata (element_class, + "DVD LPCM Audio decoder", "Codec/Decoder/Audio", + "Decode DVD LPCM frames into standard PCM audio", + "Jan Schmidt , Michael Smith "); + + GST_DEBUG_CATEGORY_INIT (dvdlpcm_debug, "dvdlpcmdec", 0, "DVD LPCM Decoder"); +} + +static void +gst_dvdlpcm_reset (GstDvdLpcmDec * dvdlpcmdec) +{ + gst_audio_info_init (&dvdlpcmdec->info); + dvdlpcmdec->dynamic_range = 0; + dvdlpcmdec->emphasis = FALSE; + dvdlpcmdec->mute = FALSE; + + dvdlpcmdec->header = 0; + + dvdlpcmdec->mode = GST_LPCM_UNKNOWN; +} + +static void +gst_dvdlpcmdec_init (GstDvdLpcmDec * dvdlpcmdec) +{ + gst_dvdlpcm_reset (dvdlpcmdec); + + gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST + (dvdlpcmdec), TRUE); + GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (dvdlpcmdec)); + + /* retrieve and intercept base class chain. + * Quite HACKish, but that's dvd specs/caps for you, + * since one buffer needs to be split into 2 frames */ + dvdlpcmdec->base_chain = + GST_PAD_CHAINFUNC (GST_AUDIO_DECODER_SINK_PAD (dvdlpcmdec)); + gst_pad_set_chain_function (GST_AUDIO_DECODER_SINK_PAD (dvdlpcmdec), + GST_DEBUG_FUNCPTR (gst_dvdlpcmdec_chain)); +} + +static const GstAudioChannelPosition channel_positions[][8] = { + {GST_AUDIO_CHANNEL_POSITION_MONO}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE1, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE1, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, + {GST_AUDIO_CHANNEL_POSITION_INVALID} +}; + +static const GstAudioChannelPosition bluray_channel_positions[][8] = { + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + /* mono */ + {GST_AUDIO_CHANNEL_POSITION_MONO}, + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + /* stereo */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, + /* surround */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, + /* 2.1 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, + /* 4.0 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, + /* 2.2 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, + /* 5.0 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, + /* 5.1 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_LFE1}, + /* 7.0 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + /* 7.1 */ + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_LFE1}, + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID}, + /* invalid */ + {GST_AUDIO_CHANNEL_POSITION_INVALID} +}; + +static void +gst_dvdlpcmdec_send_tags (GstDvdLpcmDec * dvdlpcmdec) +{ + GstTagList *taglist; + guint bitrate; + gint bpf, rate; + + bpf = GST_AUDIO_INFO_BPF (&dvdlpcmdec->info); + rate = GST_AUDIO_INFO_RATE (&dvdlpcmdec->info); + + bitrate = bpf * 8 * rate; + + taglist = gst_tag_list_new (GST_TAG_AUDIO_CODEC, "LPCM Audio", + GST_TAG_BITRATE, bitrate, NULL); + + gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (dvdlpcmdec), taglist, + GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (taglist); +} + +static gboolean +gst_dvdlpcmdec_set_output_format (GstDvdLpcmDec * dvdlpcmdec) +{ + gboolean res = TRUE; + + res = gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (dvdlpcmdec), + &dvdlpcmdec->info); + if (res) { + GST_DEBUG_OBJECT (dvdlpcmdec, "Successfully set output format"); + + gst_dvdlpcmdec_send_tags (dvdlpcmdec); + } else { + GST_DEBUG_OBJECT (dvdlpcmdec, "Failed to set output format"); + } + + return res; +} + +static void +gst_dvdlpcmdec_update_audio_formats (GstDvdLpcmDec * dec, gint channels, + gint rate, GstAudioFormat format, guint8 channel_indicator, + const GstAudioChannelPosition positions[][8]) +{ + GST_DEBUG_OBJECT (dec, "got channels = %d, rate = %d, format = %d", channels, + rate, format); + + /* Reorder the channel positions and set the default into for the audio */ + if (channels < 9 + && positions[channel_indicator][0] != + GST_AUDIO_CHANNEL_POSITION_INVALID) { + const GstAudioChannelPosition *position; + GstAudioChannelPosition sorted_position[8]; + guint c; + + position = positions[channel_indicator]; + for (c = 0; c < channels; ++c) + sorted_position[c] = position[c]; + gst_audio_channel_positions_to_valid_order (sorted_position, channels); + gst_audio_info_set_format (&dec->info, format, rate, channels, + sorted_position); + if (memcmp (position, sorted_position, + channels * sizeof (position[0])) != 0) + dec->lpcm_layout = position; + else + dec->lpcm_layout = NULL; + } else { + gst_audio_info_set_format (&dec->info, format, rate, channels, NULL); + } +} + +static gboolean +gst_dvdlpcmdec_set_format (GstAudioDecoder * bdec, GstCaps * caps) +{ + GstDvdLpcmDec *dvdlpcmdec = GST_DVDLPCMDEC (bdec); + GstStructure *structure; + gboolean res = TRUE; + GstAudioFormat format; + gint rate, channels, width; + + gst_dvdlpcm_reset (dvdlpcmdec); + + structure = gst_caps_get_structure (caps, 0); + + /* If we have the DVD structured LPCM (including header) then we wait + * for incoming data before creating the output pad caps */ + if (gst_structure_has_name (structure, "audio/x-private1-lpcm")) { + dvdlpcmdec->mode = GST_LPCM_DVD; + goto done; + } + if (gst_structure_has_name (structure, "audio/x-private2-lpcm")) { + dvdlpcmdec->mode = GST_LPCM_1394; + goto done; + } + if (gst_structure_has_name (structure, "audio/x-private-ts-lpcm")) { + dvdlpcmdec->mode = GST_LPCM_BLURAY; + goto done; + } + + dvdlpcmdec->mode = GST_LPCM_RAW; + + res &= gst_structure_get_int (structure, "rate", &rate); + res &= gst_structure_get_int (structure, "channels", &channels); + res &= gst_structure_get_int (structure, "width", &width); + res &= gst_structure_get_int (structure, "dynamic_range", + &dvdlpcmdec->dynamic_range); + res &= gst_structure_get_boolean (structure, "emphasis", + &dvdlpcmdec->emphasis); + res &= gst_structure_get_boolean (structure, "mute", &dvdlpcmdec->mute); + + if (!res) + goto caps_parse_error; + + switch (width) { + case 24: + case 20: + format = GST_AUDIO_FORMAT_S24BE; + break; + case 16: + format = GST_AUDIO_FORMAT_S16BE; + break; + default: + format = GST_AUDIO_FORMAT_UNKNOWN; + break; + } + + gst_dvdlpcmdec_update_audio_formats (dvdlpcmdec, channels, rate, format, + channels - 1, channel_positions); + + dvdlpcmdec->width = width; + + res = gst_dvdlpcmdec_set_output_format (dvdlpcmdec); + +done: + return res; + + /* ERRORS */ +caps_parse_error: + { + GST_DEBUG_OBJECT (dvdlpcmdec, "Couldn't get parameters; missing caps?"); + return FALSE; + } +} + +static void +parse_header (GstDvdLpcmDec * dec, guint32 header) +{ + GstAudioFormat format; + gint rate, channels, width; + + /* We don't actually use 'dynamic range', 'mute', or 'emphasis' currently, + * but parse them out */ + dec->dynamic_range = header & 0xff; + + dec->mute = (header & 0x400000) != 0; + dec->emphasis = (header & 0x800000) != 0; + + /* These two bits tell us the bit depth */ + switch (header & 0xC000) { + case 0x8000: + /* 24 bits in 3 bytes */ + format = GST_AUDIO_FORMAT_S24BE; + width = 24; + break; + case 0x4000: + /* 20 bits in 3 bytes */ + format = GST_AUDIO_FORMAT_S24BE; + width = 20; + break; + default: + format = GST_AUDIO_FORMAT_S16BE; + width = 16; + break; + } + + dec->width = width; + + /* Only four sample rates supported */ + switch (header & 0x3000) { + case 0x0000: + rate = 48000; + break; + case 0x1000: + rate = 96000; + break; + case 0x2000: + rate = 44100; + break; + case 0x3000: + rate = 32000; + break; + default: + rate = 0; + break; + } + + /* And, of course, the number of channels (up to 8) */ + channels = ((header >> 8) & 0x7) + 1; + + gst_dvdlpcmdec_update_audio_formats (dec, channels, rate, format, + channels - 1, channel_positions); +} + +static GstFlowReturn +gst_dvdlpcmdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstDvdLpcmDec *dvdlpcmdec = GST_DVDLPCMDEC (parent); + guint8 data[2]; + gsize size; + guint first_access; + GstBuffer *subbuf; + GstFlowReturn ret = GST_FLOW_OK; + gint off, len; + + if (dvdlpcmdec->mode != GST_LPCM_DVD) + return dvdlpcmdec->base_chain (pad, parent, buf); + + size = gst_buffer_get_size (buf); + if (size < 5) + goto too_small; + + gst_buffer_extract (buf, 0, data, 2); + first_access = (data[0] << 8) | data[1]; + if (first_access > size) + goto invalid_data; + + /* After first_access, we have an additional 3 bytes of header data; this + * is included within the value of first_access. + * So a first_access value of between 1 and 3 is just broken, we treat that + * the same as zero. first_access == 4 means we only need to create a single + * sub-buffer, greater than that we need to create two. */ + + /* skip access unit bytes */ + off = 2; + + if (first_access > 4) { + /* length of first buffer */ + len = first_access - 1; + + GST_LOG_OBJECT (dvdlpcmdec, "Creating first sub-buffer off %d, len %d", + off, len); + + /* see if we need a subbuffer without timestamp */ + if (off + len > size) + goto bad_first_access; + + subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, off, len); + GST_BUFFER_TIMESTAMP (subbuf) = GST_CLOCK_TIME_NONE; + ret = dvdlpcmdec->base_chain (pad, parent, subbuf); + if (ret != GST_FLOW_OK) + goto done; + + /* then the buffer with new timestamp */ + off += len; + len = size - off; + + GST_LOG_OBJECT (dvdlpcmdec, "Creating next sub-buffer off %d, len %d", off, + len); + + if (len > 0) { + GstMemory *header, *tmp; + subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, off, len); + tmp = gst_buffer_peek_memory (buf, 0); + header = gst_memory_copy (tmp, 2, 3); + gst_buffer_prepend_memory (subbuf, header); + GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf); + + ret = dvdlpcmdec->base_chain (pad, parent, subbuf); + } + } else { + GST_LOG_OBJECT (dvdlpcmdec, + "Creating single sub-buffer off %d, len %" G_GSIZE_FORMAT, off, + size - off); + subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, off, size - off); + GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf); + ret = dvdlpcmdec->base_chain (pad, parent, subbuf); + } + +done: + gst_buffer_unref (buf); + + return ret; + + /* ERRORS */ +too_small: + { + /* Buffer is too small */ + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet was too small. Dropping")); + ret = GST_FLOW_OK; + goto done; + } +invalid_data: + { + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet contained invalid first access. Dropping")); + ret = GST_FLOW_OK; + goto done; + } +bad_first_access: + { + GST_WARNING_OBJECT (pad, "Bad first_access parameter in buffer"); + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, DECODE, + (NULL), + ("first_access parameter out of range: bad buffer from demuxer")); + ret = GST_FLOW_ERROR; + goto done; + } +} + +static GstFlowReturn +gst_dvdlpcmdec_parse_dvd (GstDvdLpcmDec * dvdlpcmdec, GstAdapter * adapter, + gint * offset, gint * len) +{ + guint32 header; + const guint8 *data; + + data = (const guint8 *) gst_adapter_map (adapter, 3); + if (!data) + goto too_small; + + /* Don't keep the 'frame number' low 5 bits of the first byte */ + header = ((data[0] & 0xC0) << 16) | (data[1] << 8) | data[2]; + + gst_adapter_unmap (adapter); + + /* see if we have a new header */ + if (header != dvdlpcmdec->header) { + parse_header (dvdlpcmdec, header); + + if (!gst_dvdlpcmdec_set_output_format (dvdlpcmdec)) + goto negotiation_failed; + + dvdlpcmdec->header = header; + } + + *offset = 3; + *len = gst_adapter_available (adapter) - 3; + + return GST_FLOW_OK; + + /* ERRORS */ +too_small: + { + /* Buffer is too small */ + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet was too small. Dropping")); + *offset = gst_adapter_available (adapter); + return GST_FLOW_EOS; + } +negotiation_failed: + { + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, FORMAT, (NULL), + ("Failed to configure output format")); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_dvdlpcmdec_parse_bluray (GstDvdLpcmDec * dvdlpcmdec, GstAdapter * adapter, + gint * offset, gint * len) +{ + guint32 header; + const guint8 *data; + guint8 channel_indicator; + + data = (const guint8 *) gst_adapter_map (adapter, 4); + if (!data) + goto too_small; + + header = GST_READ_UINT32_BE (data); + + gst_adapter_unmap (adapter); + + /* see if we have a new header */ + if (header != dvdlpcmdec->header) { + GstAudioFormat format; + gint rate, channels; + + switch ((header >> 6) & 0x3) { + case 0x1: + format = GST_AUDIO_FORMAT_S16BE; + dvdlpcmdec->width = 16; + break; + case 0x2: + format = GST_AUDIO_FORMAT_S24BE; + dvdlpcmdec->width = 20; + break; + case 0x3: + format = GST_AUDIO_FORMAT_S24BE; + dvdlpcmdec->width = 24; + break; + default: + format = GST_AUDIO_FORMAT_UNKNOWN; + dvdlpcmdec->width = 0; + GST_WARNING ("Invalid sample depth!"); + break; + } + + switch ((header >> 8) & 0xf) { + case 0x1: + rate = 48000; + break; + case 0x4: + rate = 96000; + break; + case 0x5: + rate = 192000; + break; + default: + rate = 0; + GST_WARNING ("Invalid audio sampling frequency!"); + break; + } + channel_indicator = (header >> 12) & 0xf; + switch (channel_indicator) { + case 0x1: + channels = 1; + break; + case 0x3: + channels = 2; + break; + case 0x4: + case 0x5: + channels = 3; + break; + case 0x6: + case 0x7: + channels = 4; + break; + case 0x8: + channels = 5; + break; + case 0x9: + channels = 6; + break; + case 0xa: + channels = 7; + break; + case 0xb: + channels = 8; + break; + default: + channels = 0; + GST_WARNING ("Invalid number of audio channels!"); + goto negotiation_failed; + } + GST_DEBUG_OBJECT (dvdlpcmdec, "got channels %d rate %d format %s", + channels, rate, gst_audio_format_to_string (format)); + + gst_dvdlpcmdec_update_audio_formats (dvdlpcmdec, channels, rate, format, + channel_indicator, bluray_channel_positions); + + if (!gst_dvdlpcmdec_set_output_format (dvdlpcmdec)) + goto negotiation_failed; + + dvdlpcmdec->header = header; + } + + *offset = 4; + *len = gst_adapter_available (adapter) - 4; + + return GST_FLOW_OK; + + /* ERRORS */ +too_small: + { + /* Buffer is too small */ + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet was too small. Dropping")); + *offset = gst_adapter_available (adapter); + return GST_FLOW_EOS; + } +negotiation_failed: + { + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, FORMAT, (NULL), + ("Failed to configure output format")); + return GST_FLOW_NOT_NEGOTIATED; + } + +} + +static GstFlowReturn +gst_dvdlpcmdec_parse_1394 (GstDvdLpcmDec * dvdlpcmdec, GstAdapter * adapter, + gint * offset, gint * len) +{ + guint32 header; + const guint8 *data; + + data = (const guint8 *) gst_adapter_map (adapter, 4); + if (!data) + goto too_small; + + header = GST_READ_UINT32_BE (data); + + gst_adapter_unmap (adapter); + + /* see if we have a new header */ + if (header != dvdlpcmdec->header) { + GstAudioFormat format; + gint rate, channels; + + if (header >> 24 != 0xa0) + goto invalid_data; + + switch ((header >> 6) & 0x3) { + case 0x0: + format = GST_AUDIO_FORMAT_S16BE; + dvdlpcmdec->width = 16; + break; + default: + format = GST_AUDIO_FORMAT_UNKNOWN; + dvdlpcmdec->width = 0; + GST_WARNING ("Invalid quantization word length!"); + break; + } + + switch ((header >> 3) & 0x7) { + case 0x1: + rate = 44100; + break; + case 0x2: + rate = 48000; + break; + default: + rate = 0; + GST_WARNING ("Invalid audio sampling frequency!"); + break; + } + switch (header & 0x7) { + case 0x0: /* 2 channels dual-mono */ + case 0x1: /* 2 channels stereo */ + channels = 2; + break; + default: + channels = 0; + GST_WARNING ("Invalid number of audio channels!"); + goto negotiation_failed; + } + + gst_dvdlpcmdec_update_audio_formats (dvdlpcmdec, channels, rate, format, + channels - 1, channel_positions); + + if (!gst_dvdlpcmdec_set_output_format (dvdlpcmdec)) + goto negotiation_failed; + + dvdlpcmdec->header = header; + } + + *offset = 4; + *len = gst_adapter_available (adapter) - 4; + + return GST_FLOW_OK; + + /* ERRORS */ +too_small: + { + /* Buffer is too small */ + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet was too small. Dropping")); + *offset = gst_adapter_available (adapter); + return GST_FLOW_EOS; + } +invalid_data: + { + GST_ELEMENT_WARNING (dvdlpcmdec, STREAM, DECODE, + ("Invalid data found parsing LPCM packet"), + ("LPCM packet contains invalid sub_stream_id.")); + return GST_FLOW_ERROR; + } +negotiation_failed: + { + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, FORMAT, (NULL), + ("Failed to configure output format")); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_dvdlpcmdec_parse (GstAudioDecoder * bdec, GstAdapter * adapter, + gint * offset, gint * len) +{ + GstDvdLpcmDec *dvdlpcmdec = GST_DVDLPCMDEC (bdec); + + switch (dvdlpcmdec->mode) { + case GST_LPCM_UNKNOWN: + return GST_FLOW_NOT_NEGOTIATED; + + case GST_LPCM_RAW: + *offset = 0; + *len = gst_adapter_available (adapter); + return GST_FLOW_OK; + + case GST_LPCM_DVD: + return gst_dvdlpcmdec_parse_dvd (dvdlpcmdec, adapter, offset, len); + + case GST_LPCM_1394: + return gst_dvdlpcmdec_parse_1394 (dvdlpcmdec, adapter, offset, len); + + case GST_LPCM_BLURAY: + return gst_dvdlpcmdec_parse_bluray (dvdlpcmdec, adapter, offset, len); + } + return GST_FLOW_ERROR; +} + +static GstFlowReturn +gst_dvdlpcmdec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buf) +{ + GstDvdLpcmDec *dvdlpcmdec = GST_DVDLPCMDEC (bdec); + gsize size; + GstFlowReturn ret; + guint samples = 0; + gint rate, channels; + + /* no fancy draining */ + if (G_UNLIKELY (!buf)) + return GST_FLOW_OK; + + size = gst_buffer_get_size (buf); + + GST_LOG_OBJECT (dvdlpcmdec, + "got buffer %p of size %" G_GSIZE_FORMAT " with ts %" GST_TIME_FORMAT, + buf, size, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + rate = GST_AUDIO_INFO_RATE (&dvdlpcmdec->info); + channels = GST_AUDIO_INFO_CHANNELS (&dvdlpcmdec->info); + + if (rate == 0) + goto not_negotiated; + + /* We don't currently do anything at all regarding emphasis, mute or + * dynamic_range - I'm not sure what they're for */ + switch (dvdlpcmdec->width) { + case 16: + { + /* We can just pass 16-bits straight through intact, once we set + * appropriate things on the buffer */ + samples = size / channels / 2; + if (samples < 1) + goto drop; + + gst_buffer_ref (buf); + break; + } + case 20: + { + /* Allocate a new buffer and copy 20-bit width to 24-bit */ + gint64 samples = size * 8 / 20; + gint64 count = size / 10; + gint64 i; + GstMapInfo srcmap, destmap; + guint8 *src; + guint8 *dest; + GstBuffer *outbuf; + + if (samples < 1) + goto drop; + + outbuf = gst_buffer_new_allocate (NULL, samples * 3, NULL); + gst_buffer_copy_into (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1); + + /* adjust samples so we can calc the new timestamp */ + samples = samples / channels; + + gst_buffer_map (buf, &srcmap, GST_MAP_READ); + gst_buffer_map (outbuf, &destmap, GST_MAP_WRITE); + src = srcmap.data; + dest = destmap.data; + + /* Copy 20-bit LPCM format to 24-bit buffers, with 0x00 in the lowest + * nibble. Note that the first 2 bytes are already correct */ + for (i = 0; i < count; i++) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[8] & 0xf0; + dest[3] = src[2]; + dest[4] = src[3]; + dest[5] = (src[8] & 0x0f) << 4; + dest[6] = src[4]; + dest[7] = src[5]; + dest[8] = src[9] & 0x0f; + dest[9] = src[6]; + dest[10] = src[7]; + dest[11] = (src[9] & 0x0f) << 4; + + src += 10; + dest += 12; + } + gst_buffer_unmap (outbuf, &destmap); + gst_buffer_unmap (buf, &srcmap); + buf = outbuf; + break; + } + case 24: + { + /* Rearrange 24-bit LPCM format in-place. Note that the first 2 + * and last byte are already correct */ + guint count = size / 12; + gint i; + GstMapInfo srcmap, destmap; + guint8 *src, *dest; + GstBuffer *outbuf; + + samples = size / channels / 3; + + if (samples < 1) + goto drop; + + outbuf = gst_buffer_new_allocate (NULL, size, NULL); + gst_buffer_copy_into (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1); + + gst_buffer_map (buf, &srcmap, GST_MAP_READ); + gst_buffer_map (outbuf, &destmap, GST_MAP_READWRITE); + src = srcmap.data; + dest = destmap.data; + + for (i = 0; i < count; i++) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[11] = src[11]; + dest[10] = src[7]; + dest[7] = src[5]; + dest[5] = src[9]; + dest[9] = src[6]; + dest[6] = src[4]; + dest[4] = src[3]; + dest[3] = src[2]; + dest[2] = src[8]; + dest[8] = src[10]; + + src += 12; + dest += 12; + } + gst_buffer_unmap (outbuf, &destmap); + gst_buffer_unmap (buf, &srcmap); + buf = outbuf; + break; + } + default: + goto invalid_width; + } + + if (dvdlpcmdec->lpcm_layout) { + buf = gst_buffer_make_writable (buf); + gst_audio_buffer_reorder_channels (buf, dvdlpcmdec->info.finfo->format, + dvdlpcmdec->info.channels, dvdlpcmdec->lpcm_layout, + dvdlpcmdec->info.position); + } + + ret = gst_audio_decoder_finish_frame (bdec, buf, 1); + +done: + return ret; + + /* ERRORS */ +drop: + { + GST_DEBUG_OBJECT (dvdlpcmdec, + "Buffer of size %" G_GSIZE_FORMAT " is too small. Dropping", size); + ret = GST_FLOW_OK; + goto done; + } +not_negotiated: + { + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, FORMAT, (NULL), + ("Buffer pushed before negotiation")); + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } +invalid_width: + { + GST_ELEMENT_ERROR (dvdlpcmdec, STREAM, WRONG_TYPE, (NULL), + ("Invalid sample width configured")); + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (dvdlpcmdec, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + dvdlpcmdec, + "Decode DVD LPCM frames into standard PCM", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/dvdlpcmdec/gstdvdlpcmdec.h b/gst/dvdlpcmdec/gstdvdlpcmdec.h new file mode 100644 index 0000000000..76d4d1e040 --- /dev/null +++ b/gst/dvdlpcmdec/gstdvdlpcmdec.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Jan Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_DVDLPCMDEC_H__ +#define __GST_DVDLPCMDEC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DVDLPCMDEC \ + (gst_dvdlpcmdec_get_type()) +#define GST_DVDLPCMDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVDLPCMDEC,GstDvdLpcmDec)) +#define GST_DVDLPCMDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVDLPCMDEC,GstDvdLpcmDecClass)) +#define GST_IS_DVDLPCMDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVDLPCMDEC)) +#define GST_IS_DVDLPCMDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVDLPCMDEC)) + +typedef struct _GstDvdLpcmDec GstDvdLpcmDec; +typedef struct _GstDvdLpcmDecClass GstDvdLpcmDecClass; + +typedef enum { + GST_LPCM_UNKNOWN, + GST_LPCM_RAW, + GST_LPCM_DVD, + GST_LPCM_1394, + GST_LPCM_BLURAY +} GstDvdLpcmMode; + +struct _GstDvdLpcmDec { + GstAudioDecoder element; + + GstPadChainFunction base_chain; + + GstDvdLpcmMode mode; + guint32 header; + + GstAudioInfo info; + const GstAudioChannelPosition *lpcm_layout; + gint width; + gint dynamic_range; + gint emphasis; + gint mute; + + GstClockTime timestamp; +}; + +struct _GstDvdLpcmDecClass { + GstAudioDecoderClass parent_class; +}; + +GType gst_dvdlpcmdec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (dvdlpcmdec); + +G_END_DECLS + +#endif /* __GST_DVDLPCMDEC_H__ */ diff --git a/gst/dvdlpcmdec/meson.build b/gst/dvdlpcmdec/meson.build new file mode 100644 index 0000000000..b5a77ef4a9 --- /dev/null +++ b/gst/dvdlpcmdec/meson.build @@ -0,0 +1,14 @@ +dvdpl_sources = [ + 'gstdvdlpcmdec.c' +] + +gstdvdlpcmdec = library('gstdvdlpcmdec', + dvdpl_sources, + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstbase_dep, gstaudio_dep], + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstdvdlpcmdec, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstdvdlpcmdec] diff --git a/gst/dvdsub/gstdvdsubdec.c b/gst/dvdsub/gstdvdsubdec.c new file mode 100644 index 0000000000..1884880840 --- /dev/null +++ b/gst/dvdsub/gstdvdsubdec.c @@ -0,0 +1,1164 @@ +/* GStreamer + * Copyright (C) <2005> Jan Schmidt + * Copyright (C) <2002> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstdvdsubdec.h" +#include "gstdvdsubparse.h" +#include + +GST_DEBUG_CATEGORY_STATIC (gst_dvd_sub_dec_debug); +#define GST_CAT_DEFAULT (gst_dvd_sub_dec_debug) + +#define gst_dvd_sub_dec_parent_class parent_class +G_DEFINE_TYPE (GstDvdSubDec, gst_dvd_sub_dec, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (dvdsubdec, "dvdsubdec", GST_RANK_NONE, + GST_TYPE_DVD_SUB_DEC, GST_DEBUG_CATEGORY_INIT (gst_dvd_sub_dec_debug, + "dvdsubdec", 0, "DVD subtitle decoder")); + +static gboolean gst_dvd_sub_dec_src_event (GstPad * srcpad, GstObject * parent, + GstEvent * event); +static GstFlowReturn gst_dvd_sub_dec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); + +static gboolean gst_dvd_sub_dec_handle_dvd_event (GstDvdSubDec * dec, + GstEvent * event); +static void gst_dvd_sub_dec_finalize (GObject * gobject); +static void gst_setup_palette (GstDvdSubDec * dec); +static void gst_dvd_sub_dec_merge_title (GstDvdSubDec * dec, + GstVideoFrame * frame); +static GstClockTime gst_dvd_sub_dec_get_event_delay (GstDvdSubDec * dec); +static gboolean gst_dvd_sub_dec_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_dvd_sub_dec_sink_setcaps (GstPad * pad, GstCaps * caps); + +static GstFlowReturn gst_send_subtitle_frame (GstDvdSubDec * dec, + GstClockTime end_ts); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw, format = (string) { AYUV, ARGB }," + "width = (int) 720, height = (int) 576, framerate = (fraction) 0/1") + ); + +static GstStaticPadTemplate subtitle_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("subpicture/x-dvd") + ); + + +enum +{ + SPU_FORCE_DISPLAY = 0x00, + SPU_SHOW = 0x01, + SPU_HIDE = 0x02, + SPU_SET_PALETTE = 0x03, + SPU_SET_ALPHA = 0x04, + SPU_SET_SIZE = 0x05, + SPU_SET_OFFSETS = 0x06, + SPU_WIPE = 0x07, + SPU_END = 0xff +}; + +static const guint32 default_clut[16] = { + 0xb48080, 0x248080, 0x628080, 0xd78080, + 0x808080, 0x808080, 0x808080, 0x808080, + 0x808080, 0x808080, 0x808080, 0x808080, + 0x808080, 0x808080, 0x808080, 0x808080 +}; + +typedef struct RLE_state +{ + gint id; + gint aligned; + gint offset[2]; + gint hl_left; + gint hl_right; + + guchar *target; + + guchar next; +} +RLE_state; + +static void +gst_dvd_sub_dec_class_init (GstDvdSubDecClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_dvd_sub_dec_finalize; + + gst_element_class_add_static_pad_template (gstelement_class, &src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &subtitle_template); + + gst_element_class_set_static_metadata (gstelement_class, + "DVD subtitle decoder", "Codec/Decoder/Video", + "Decodes DVD subtitles into AYUV video frames", + "Wim Taymans , " + "Jan Schmidt "); +} + +static void +gst_dvd_sub_dec_init (GstDvdSubDec * dec) +{ + GstPadTemplate *tmpl; + + dec->sinkpad = gst_pad_new_from_static_template (&subtitle_template, "sink"); + gst_pad_set_chain_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvd_sub_dec_chain)); + gst_pad_set_event_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvd_sub_dec_sink_event)); + gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); + + tmpl = gst_static_pad_template_get (&src_template); + dec->srcpad = gst_pad_new_from_template (tmpl, "src"); + gst_pad_set_event_function (dec->srcpad, + GST_DEBUG_FUNCPTR (gst_dvd_sub_dec_src_event)); + gst_pad_use_fixed_caps (dec->srcpad); + gst_object_unref (tmpl); + gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); + + /* FIXME: aren't there more possible sizes? (tpm) */ + dec->in_width = 720; + dec->in_height = 576; + + dec->partialbuf = NULL; + dec->have_title = FALSE; + dec->parse_pos = NULL; + dec->forced_display = FALSE; + dec->visible = FALSE; + + memcpy (dec->current_clut, default_clut, sizeof (guint32) * 16); + + gst_setup_palette (dec); + + dec->next_ts = 0; + dec->next_event_ts = GST_CLOCK_TIME_NONE; + + dec->buf_dirty = TRUE; + dec->use_ARGB = FALSE; +} + +static void +gst_dvd_sub_dec_finalize (GObject * gobject) +{ + GstDvdSubDec *dec = GST_DVD_SUB_DEC (gobject); + + if (dec->partialbuf) { + gst_buffer_unmap (dec->partialbuf, &dec->partialmap); + gst_buffer_unref (dec->partialbuf); + dec->partialbuf = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (gobject); +} + +static gboolean +gst_dvd_sub_dec_src_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + gboolean res = FALSE; + + switch (GST_EVENT_TYPE (event)) { + default: + res = gst_pad_event_default (pad, parent, event); + break; + } + + return res; +} + +static GstClockTime +gst_dvd_sub_dec_get_event_delay (GstDvdSubDec * dec) +{ + guchar *buf; + guint16 ticks; + GstClockTime event_delay; + + /* If starting a new buffer, follow the first DCSQ ptr */ + if (dec->parse_pos == dec->partialmap.data) { + buf = dec->parse_pos + dec->data_size; + } else { + buf = dec->parse_pos; + } + + ticks = GST_READ_UINT16_BE (buf); + event_delay = gst_util_uint64_scale (ticks, 1024 * GST_SECOND, 90000); + + GST_DEBUG_OBJECT (dec, "returning delay %" GST_TIME_FORMAT " from offset %u", + GST_TIME_ARGS (event_delay), (guint) (buf - dec->parse_pos)); + + return event_delay; +} + +/* + * Parse the next event time in the current subpicture buffer, stopping + * when time advances to the next state. + */ +static void +gst_dvd_sub_dec_parse_subpic (GstDvdSubDec * dec) +{ +#define PARSE_BYTES_NEEDED(x) if ((buf+(x)) >= end) \ + { GST_WARNING("Subtitle stream broken parsing %c", *buf); \ + broken = TRUE; break; } + + guchar *start = dec->partialmap.data; + guchar *buf; + guchar *end; + gboolean broken = FALSE; + gboolean last_seq = FALSE; + guchar *next_seq = NULL; + GstClockTime event_time; + + /* nothing to do if we finished this buffer already */ + if (dec->parse_pos == NULL) + return; + + g_return_if_fail (dec->packet_size >= 4); + + end = start + dec->packet_size; + if (dec->parse_pos == start) { + buf = dec->parse_pos + dec->data_size; + } else { + buf = dec->parse_pos; + } + + g_assert (buf >= start && buf < end); + + /* If the next control sequence is at the current offset, this is + * the last one */ + next_seq = start + GST_READ_UINT16_BE (buf + 2); + last_seq = (next_seq == buf); + buf += 4; + + while ((buf < end) && (!broken)) { + switch (*buf) { + case SPU_FORCE_DISPLAY: /* Forced display menu subtitle */ + dec->forced_display = TRUE; + dec->buf_dirty = TRUE; + GST_DEBUG_OBJECT (dec, "SPU FORCE_DISPLAY"); + buf++; + break; + case SPU_SHOW: /* Show the subtitle in this packet */ + dec->visible = TRUE; + dec->buf_dirty = TRUE; + GST_DEBUG_OBJECT (dec, "SPU SHOW at %" GST_TIME_FORMAT, + GST_TIME_ARGS (dec->next_event_ts)); + buf++; + break; + case SPU_HIDE: + /* 02 ff (ff) is the end of the packet, hide the subpicture */ + dec->visible = FALSE; + dec->buf_dirty = TRUE; + + GST_DEBUG_OBJECT (dec, "SPU HIDE at %" GST_TIME_FORMAT, + GST_TIME_ARGS (dec->next_event_ts)); + buf++; + break; + case SPU_SET_PALETTE: /* palette */ + PARSE_BYTES_NEEDED (3); + + GST_DEBUG_OBJECT (dec, "SPU SET_PALETTE"); + + dec->subtitle_index[3] = buf[1] >> 4; + dec->subtitle_index[2] = buf[1] & 0xf; + dec->subtitle_index[1] = buf[2] >> 4; + dec->subtitle_index[0] = buf[2] & 0xf; + gst_setup_palette (dec); + + dec->buf_dirty = TRUE; + buf += 3; + break; + case SPU_SET_ALPHA: /* transparency palette */ + PARSE_BYTES_NEEDED (3); + + GST_DEBUG_OBJECT (dec, "SPU SET_ALPHA"); + + dec->subtitle_alpha[3] = buf[1] >> 4; + dec->subtitle_alpha[2] = buf[1] & 0xf; + dec->subtitle_alpha[1] = buf[2] >> 4; + dec->subtitle_alpha[0] = buf[2] & 0xf; + gst_setup_palette (dec); + + dec->buf_dirty = TRUE; + buf += 3; + break; + case SPU_SET_SIZE: /* image coordinates */ + PARSE_BYTES_NEEDED (7); + + dec->top = ((buf[4] & 0x3f) << 4) | ((buf[5] & 0xe0) >> 4); + dec->left = ((buf[1] & 0x3f) << 4) | ((buf[2] & 0xf0) >> 4); + dec->right = ((buf[2] & 0x03) << 8) | buf[3]; + dec->bottom = ((buf[5] & 0x03) << 8) | buf[6]; + + GST_DEBUG_OBJECT (dec, "SPU SET_SIZE left %d, top %d, right %d, " + "bottom %d", dec->left, dec->top, dec->right, dec->bottom); + + dec->buf_dirty = TRUE; + buf += 7; + break; + case SPU_SET_OFFSETS: /* image 1 / image 2 offsets */ + PARSE_BYTES_NEEDED (5); + + dec->offset[0] = (((guint) buf[1]) << 8) | buf[2]; + dec->offset[1] = (((guint) buf[3]) << 8) | buf[4]; + GST_DEBUG_OBJECT (dec, "Offset1 %d, Offset2 %d", + dec->offset[0], dec->offset[1]); + + dec->buf_dirty = TRUE; + buf += 5; + break; + case SPU_WIPE: + { + guint length; + + PARSE_BYTES_NEEDED (3); + + GST_WARNING_OBJECT (dec, "SPU_WIPE not yet implemented"); + + length = (buf[1] << 8) | (buf[2]); + buf += 1 + length; + + dec->buf_dirty = TRUE; + break; + } + case SPU_END: + buf = (last_seq) ? end : next_seq; + + /* Start a new control sequence */ + if (buf + 4 < end) { + guint16 ticks = GST_READ_UINT16_BE (buf); + + event_time = gst_util_uint64_scale (ticks, 1024 * GST_SECOND, 90000); + + GST_DEBUG_OBJECT (dec, + "Next DCSQ at offset %u, delay %g secs (%d ticks)", + (guint) (buf - start), + gst_util_guint64_to_gdouble (event_time / GST_SECOND), ticks); + + dec->parse_pos = buf; + if (event_time > 0) { + dec->next_event_ts += event_time; + + GST_LOG_OBJECT (dec, "Exiting parse loop with time %g", + gst_guint64_to_gdouble (dec->next_event_ts) / + gst_guint64_to_gdouble (GST_SECOND)); + return; + } + break; + } else { + dec->parse_pos = NULL; + dec->next_event_ts = GST_CLOCK_TIME_NONE; + GST_LOG_OBJECT (dec, "Finished all cmds. Exiting parse loop"); + return; + } + default: + GST_ERROR + ("Invalid sequence in subtitle packet header (%.2x). Skipping", + *buf); + broken = TRUE; + dec->parse_pos = NULL; + break; + } + } +} + +static inline int +gst_get_nibble (guchar * buffer, RLE_state * state) +{ + if (state->aligned) { + state->next = buffer[state->offset[state->id]++]; + state->aligned = 0; + return state->next >> 4; + } else { + state->aligned = 1; + return state->next & 0xf; + } +} + +/* Premultiply the current lookup table into the "target" cache */ +static void +gst_setup_palette (GstDvdSubDec * dec) +{ + gint i; + guint32 col; + Color_val *target_yuv = dec->palette_cache_yuv; + Color_val *target2_yuv = dec->hl_palette_cache_yuv; + Color_val *target_rgb = dec->palette_cache_rgb; + Color_val *target2_rgb = dec->hl_palette_cache_rgb; + + for (i = 0; i < 4; i++, target2_yuv++, target_yuv++) { + col = dec->current_clut[dec->subtitle_index[i]]; + target_yuv->Y_R = (col >> 16) & 0xff; + target_yuv->V_B = (col >> 8) & 0xff; + target_yuv->U_G = col & 0xff; + target_yuv->A = dec->subtitle_alpha[i] * 0xff / 0xf; + + col = dec->current_clut[dec->menu_index[i]]; + target2_yuv->Y_R = (col >> 16) & 0xff; + target2_yuv->V_B = (col >> 8) & 0xff; + target2_yuv->U_G = col & 0xff; + target2_yuv->A = dec->menu_alpha[i] * 0xff / 0xf; + + /* If ARGB flag set, then convert YUV palette to RGB */ + /* Using integer arithmetic */ + if (dec->use_ARGB) { + guchar C = target_yuv->Y_R - 16; + guchar D = target_yuv->U_G - 128; + guchar E = target_yuv->V_B - 128; + + target_rgb->Y_R = CLAMP (((298 * C + 409 * E + 128) >> 8), 0, 255); + target_rgb->U_G = + CLAMP (((298 * C - 100 * D - 128 * E + 128) >> 8), 0, 255); + target_rgb->V_B = CLAMP (((298 * C + 516 * D + 128) >> 8), 0, 255); + target_rgb->A = target_yuv->A; + + C = target2_yuv->Y_R - 16; + D = target2_yuv->U_G - 128; + E = target2_yuv->V_B - 128; + + target2_rgb->Y_R = CLAMP (((298 * C + 409 * E + 128) >> 8), 0, 255); + target2_rgb->U_G = + CLAMP (((298 * C - 100 * D - 128 * E + 128) >> 8), 0, 255); + target2_rgb->V_B = CLAMP (((298 * C + 516 * D + 128) >> 8), 0, 255); + target2_rgb->A = target2_yuv->A; + } + target_rgb++; + target2_rgb++; + } +} + +static inline guint +gst_get_rle_code (guchar * buffer, RLE_state * state) +{ + gint code; + + code = gst_get_nibble (buffer, state); + if (code < 0x4) { /* 4 .. f */ + code = (code << 4) | gst_get_nibble (buffer, state); + if (code < 0x10) { /* 1x .. 3x */ + code = (code << 4) | gst_get_nibble (buffer, state); + if (code < 0x40) { /* 04x .. 0fx */ + code = (code << 4) | gst_get_nibble (buffer, state); + } + } + } + return code; +} + +#define DRAW_RUN(target,len,c) \ +G_STMT_START { \ + gint i = 0; \ + if ((c)->A) { \ + for (i = 0; i < (len); i++) { \ + *(target)++ = (c)->A; \ + *(target)++ = (c)->Y_R; \ + *(target)++ = (c)->U_G; \ + *(target)++ = (c)->V_B; \ + } \ + } else { \ + (target) += 4 * (len); \ + } \ +} G_STMT_END + +/* + * This function steps over each run-length segment, drawing + * into the YUVA/ARGB buffers as it goes. UV are composited and then output + * at half width/height + */ +static void +gst_draw_rle_line (GstDvdSubDec * dec, guchar * buffer, RLE_state * state) +{ + gint length, colourid; + guint code; + gint x, right; + guchar *target; + + target = state->target; + + x = dec->left; + right = dec->right + 1; + + while (x < right) { + gboolean in_hl; + const Color_val *colour_entry; + + code = gst_get_rle_code (buffer, state); + length = code >> 2; + colourid = code & 3; + if (dec->use_ARGB) + colour_entry = dec->palette_cache_rgb + colourid; + else + colour_entry = dec->palette_cache_yuv + colourid; + + /* Length = 0 implies fill to the end of the line */ + /* Restrict the colour run to the end of the line */ + if (length == 0 || x + length > right) + length = right - x; + + /* Check if this run of colour touches the highlight region */ + in_hl = ((x <= state->hl_right) && (x + length) >= state->hl_left); + if (in_hl) { + gint run; + + /* Draw to the left of the highlight */ + if (x <= state->hl_left) { + run = MIN (length, state->hl_left - x + 1); + + DRAW_RUN (target, run, colour_entry); + length -= run; + x += run; + } + + /* Draw across the highlight region */ + if (x <= state->hl_right) { + const Color_val *hl_colour; + if (dec->use_ARGB) + hl_colour = dec->hl_palette_cache_rgb + colourid; + else + hl_colour = dec->hl_palette_cache_yuv + colourid; + + run = MIN (length, state->hl_right - x + 1); + + DRAW_RUN (target, run, hl_colour); + length -= run; + x += run; + } + } + + /* Draw the rest of the run */ + if (length > 0) { + DRAW_RUN (target, length, colour_entry); + x += length; + } + } +} + +/* + * Decode the RLE subtitle image and blend with the current + * frame buffer. + */ +static void +gst_dvd_sub_dec_merge_title (GstDvdSubDec * dec, GstVideoFrame * frame) +{ + gint y; + gint Y_stride; + guchar *buffer = dec->partialmap.data; + gint hl_top, hl_bottom; + gint last_y; + RLE_state state; + guint8 *Y_data; + + GST_DEBUG_OBJECT (dec, "Merging subtitle on frame"); + + Y_data = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + Y_stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + + state.id = 0; + state.aligned = 1; + state.next = 0; + state.offset[0] = dec->offset[0]; + state.offset[1] = dec->offset[1]; + + /* center the image when display rectangle exceeds the video width */ + if (dec->in_width <= dec->right) { + gint left, disp_width; + + disp_width = dec->right - dec->left + 1; + left = (dec->in_width - disp_width) / 2; + dec->left = left; + dec->right = left + disp_width - 1; + + /* if it clips to the right, shift it left, but only till zero */ + if (dec->right >= dec->in_width) { + gint shift = dec->right - dec->in_width - 1; + if (shift > dec->left) + shift = dec->left; + dec->left -= shift; + dec->right -= shift; + } + + GST_DEBUG_OBJECT (dec, "clipping width to %d,%d", + dec->left, dec->in_width - 1); + } + + /* for the height, bring it up till it fits as well as it can. We + * assume the picture is in the lower part. We should better check where it + * is and do something more clever. */ + if (dec->in_height <= dec->bottom) { + + /* shift it up, but only till zero */ + gint shift = dec->bottom - dec->in_height - 1; + if (shift > dec->top) + shift = dec->top; + dec->top -= shift; + dec->bottom -= shift; + + /* start on even line */ + if (dec->top & 1) { + dec->top--; + dec->bottom--; + } + + GST_DEBUG_OBJECT (dec, "clipping height to %d,%d", + dec->top, dec->in_height - 1); + } + + if (dec->current_button) { + hl_top = dec->hl_top; + hl_bottom = dec->hl_bottom; + } else { + hl_top = -1; + hl_bottom = -1; + } + last_y = MIN (dec->bottom, dec->in_height); + + y = dec->top; + state.target = Y_data + 4 * dec->left + (y * Y_stride); + + /* Now draw scanlines until we hit last_y or end of RLE data */ + for (; ((state.offset[1] < dec->data_size + 2) && (y <= last_y)); y++) { + /* Set up to draw the highlight if we're in the right scanlines */ + if (y > hl_bottom || y < hl_top) { + state.hl_left = -1; + state.hl_right = -1; + } else { + state.hl_left = dec->hl_left; + state.hl_right = dec->hl_right; + } + gst_draw_rle_line (dec, buffer, &state); + + state.target += Y_stride; + + /* Realign the RLE state for the next line */ + if (!state.aligned) + gst_get_nibble (buffer, &state); + state.id = !state.id; + } +} + +static void +gst_send_empty_fill (GstDvdSubDec * dec, GstClockTime ts) +{ + if (dec->next_ts < ts) { + GST_LOG_OBJECT (dec, "Sending GAP event update to advance time to %" + GST_TIME_FORMAT, GST_TIME_ARGS (ts)); + + gst_pad_push_event (dec->srcpad, + gst_event_new_gap (dec->next_ts, ts - dec->next_ts)); + } + dec->next_ts = ts; +} + +static GstFlowReturn +gst_send_subtitle_frame (GstDvdSubDec * dec, GstClockTime end_ts) +{ + GstFlowReturn flow; + GstBuffer *out_buf; + GstVideoFrame frame; + guint8 *data; + gint x, y; + static GstAllocationParams params = { 0, 3, 0, 0, }; + + g_assert (dec->have_title); + g_assert (dec->next_ts <= end_ts); + + /* Check if we need to redraw the output buffer */ + if (!dec->buf_dirty) { + flow = GST_FLOW_OK; + goto out; + } + + out_buf = + gst_buffer_new_allocate (NULL, GST_VIDEO_INFO_SIZE (&dec->info), ¶ms); + gst_video_frame_map (&frame, &dec->info, out_buf, GST_MAP_READWRITE); + + data = GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + + /* Clear the buffer */ + /* FIXME - move this into the buffer rendering code */ + for (y = 0; y < dec->in_height; y++) { + guchar *line = data + 4 * dec->in_width * y; + + for (x = 0; x < dec->in_width; x++) { + line[0] = 0; /* A */ + if (!dec->use_ARGB) { + line[1] = 16; /* Y */ + line[2] = 128; /* U */ + line[3] = 128; /* V */ + } else { + line[1] = 0; /* R */ + line[2] = 0; /* G */ + line[3] = 0; /* B */ + } + + line += 4; + } + } + + /* FIXME: do we really want to honour the forced_display flag + * for subtitles streans? */ + if (dec->visible || dec->forced_display) { + gst_dvd_sub_dec_merge_title (dec, &frame); + } + + gst_video_frame_unmap (&frame); + + dec->buf_dirty = FALSE; + + GST_BUFFER_TIMESTAMP (out_buf) = dec->next_ts; + if (GST_CLOCK_TIME_IS_VALID (dec->next_event_ts)) { + GST_BUFFER_DURATION (out_buf) = GST_CLOCK_DIFF (dec->next_ts, + dec->next_event_ts); + } else { + GST_BUFFER_DURATION (out_buf) = GST_CLOCK_TIME_NONE; + } + + GST_DEBUG_OBJECT (dec, "Sending subtitle buffer with ts %" + GST_TIME_FORMAT ", dur %" G_GINT64_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf)), + GST_BUFFER_DURATION (out_buf)); + + flow = gst_pad_push (dec->srcpad, out_buf); + +out: + dec->next_ts = end_ts; + return flow; +} + +/* Walk time forward, processing any subtitle events as needed. */ +static GstFlowReturn +gst_dvd_sub_dec_advance_time (GstDvdSubDec * dec, GstClockTime new_ts) +{ + GstFlowReturn ret = GST_FLOW_OK; + + GST_LOG_OBJECT (dec, "Advancing time to %" GST_TIME_FORMAT, + GST_TIME_ARGS (new_ts)); + + if (!dec->have_title) { + gst_send_empty_fill (dec, new_ts); + return ret; + } + + while (dec->next_ts < new_ts) { + GstClockTime next_ts = new_ts; + + if (GST_CLOCK_TIME_IS_VALID (dec->next_event_ts) && + dec->next_event_ts < next_ts) { + /* We might need to process the subtitle cmd queue */ + next_ts = dec->next_event_ts; + } + + /* + * Now, either output a filler or a frame spanning + * dec->next_ts to next_ts + */ + if (dec->visible || dec->forced_display) { + ret = gst_send_subtitle_frame (dec, next_ts); + } else { + gst_send_empty_fill (dec, next_ts); + } + + /* + * and then process some subtitle cmds if we need + */ + if (next_ts == dec->next_event_ts) + gst_dvd_sub_dec_parse_subpic (dec); + } + + return ret; +} + +static GstFlowReturn +gst_dvd_sub_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstDvdSubDec *dec; + guint8 *data; + glong size = 0; + + dec = GST_DVD_SUB_DEC (parent); + + GST_DEBUG_OBJECT (dec, "Have buffer of size %" G_GSIZE_FORMAT ", ts %" + GST_TIME_FORMAT ", dur %" G_GINT64_FORMAT, gst_buffer_get_size (buf), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_BUFFER_DURATION (buf)); + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + if (!GST_CLOCK_TIME_IS_VALID (dec->next_ts)) { + dec->next_ts = GST_BUFFER_TIMESTAMP (buf); + } + + /* Move time forward to the start of the new buffer */ + ret = gst_dvd_sub_dec_advance_time (dec, GST_BUFFER_TIMESTAMP (buf)); + } + + if (dec->have_title) { + gst_buffer_unmap (dec->partialbuf, &dec->partialmap); + gst_buffer_unref (dec->partialbuf); + dec->partialbuf = NULL; + dec->have_title = FALSE; + } + + GST_DEBUG_OBJECT (dec, "Got subtitle buffer, pts %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + /* deal with partial frame from previous buffer */ + if (dec->partialbuf) { + gst_buffer_unmap (dec->partialbuf, &dec->partialmap); + dec->partialbuf = gst_buffer_append (dec->partialbuf, buf); + } else { + dec->partialbuf = buf; + } + + gst_buffer_map (dec->partialbuf, &dec->partialmap, GST_MAP_READ); + + data = dec->partialmap.data; + size = dec->partialmap.size; + + if (size > 4) { + dec->packet_size = GST_READ_UINT16_BE (data); + + if (dec->packet_size == size) { + GST_LOG_OBJECT (dec, "Subtitle packet size %d, current size %ld", + dec->packet_size, size); + + dec->data_size = GST_READ_UINT16_BE (data + 2); + + /* Reset parameters for a new subtitle buffer */ + dec->parse_pos = data; + dec->forced_display = FALSE; + dec->visible = FALSE; + + dec->have_title = TRUE; + dec->next_event_ts = GST_BUFFER_TIMESTAMP (dec->partialbuf); + + if (!GST_CLOCK_TIME_IS_VALID (dec->next_event_ts)) + dec->next_event_ts = dec->next_ts; + + dec->next_event_ts += gst_dvd_sub_dec_get_event_delay (dec); + } + } + + return ret; +} + +static gboolean +gst_dvd_sub_dec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstDvdSubDec *dec = GST_DVD_SUB_DEC (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + GstCaps *out_caps = NULL, *peer_caps = NULL; + + GST_DEBUG_OBJECT (dec, "setcaps called with %" GST_PTR_FORMAT, caps); + + out_caps = gst_caps_new_simple ("video/x-raw", + "format", G_TYPE_STRING, "AYUV", + "width", G_TYPE_INT, dec->in_width, + "height", G_TYPE_INT, dec->in_height, + "framerate", GST_TYPE_FRACTION, 0, 1, NULL); + + peer_caps = gst_pad_get_allowed_caps (dec->srcpad); + if (G_LIKELY (peer_caps)) { + guint i = 0, n = 0; + + n = gst_caps_get_size (peer_caps); + GST_DEBUG_OBJECT (dec, "peer allowed caps (%u structure(s)) are %" + GST_PTR_FORMAT, n, peer_caps); + + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peer_caps, i); + /* Check if the peer pad support ARGB format, if yes change caps */ + if (gst_structure_has_name (s, "video/x-raw")) { + GstCaps *downstream_caps; + gst_caps_unref (out_caps); + GST_DEBUG_OBJECT (dec, "trying with ARGB"); + + out_caps = gst_caps_new_simple ("video/x-raw", + "format", G_TYPE_STRING, "ARGB", + "width", G_TYPE_INT, dec->in_width, + "height", G_TYPE_INT, dec->in_height, + "framerate", GST_TYPE_FRACTION, 0, 1, NULL); + + downstream_caps = gst_pad_peer_query_caps (dec->srcpad, NULL); + if (gst_caps_can_intersect (downstream_caps, out_caps)) { + gst_caps_unref (downstream_caps); + GST_DEBUG_OBJECT (dec, "peer accepted ARGB"); + /* If ARGB format then set the flag */ + dec->use_ARGB = TRUE; + break; + } + gst_caps_unref (downstream_caps); + } + } + gst_caps_unref (peer_caps); + } + GST_DEBUG_OBJECT (dec, "setting caps downstream to %" GST_PTR_FORMAT, + out_caps); + if (gst_pad_set_caps (dec->srcpad, out_caps)) { + gst_video_info_from_caps (&dec->info, out_caps); + } else { + GST_WARNING_OBJECT (dec, "failed setting downstream caps"); + gst_caps_unref (out_caps); + goto beach; + } + + gst_caps_unref (out_caps); + ret = TRUE; + +beach: + gst_object_unref (dec); + return ret; +} + +static gboolean +gst_dvd_sub_dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstDvdSubDec *dec = GST_DVD_SUB_DEC (parent); + gboolean ret = FALSE; + + GST_LOG_OBJECT (dec, "%s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_dvd_sub_dec_sink_setcaps (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_CUSTOM_DOWNSTREAM:{ + + if (gst_event_has_name (event, "application/x-gst-dvd")) { + const GstStructure *s = gst_event_get_structure (event); + GstClockTime ts = GST_CLOCK_TIME_NONE; + + if (gst_structure_get_clock_time (s, "ts", &ts) + && GST_CLOCK_TIME_IS_VALID (ts)) + gst_dvd_sub_dec_advance_time (dec, ts); + + if (gst_dvd_sub_dec_handle_dvd_event (dec, event)) { + /* gst_dvd_sub_dec_advance_time (dec, dec->next_ts + GST_SECOND / 30.0); */ + gst_event_unref (event); + ret = TRUE; + break; + } + } + + ret = gst_pad_event_default (pad, parent, event); + break; + } + case GST_EVENT_GAP: + { + GstClockTime start, duration; + + gst_event_parse_gap (event, &start, &duration); + if (GST_CLOCK_TIME_IS_VALID (start)) { + if (GST_CLOCK_TIME_IS_VALID (duration)) + start += duration; + /* we do not expect another buffer until after gap, + * so that is our position now */ + GST_DEBUG_OBJECT (dec, "Got GAP event, advancing time from %" + GST_TIME_FORMAT " to %" GST_TIME_FORMAT, + GST_TIME_ARGS (dec->next_ts), GST_TIME_ARGS (start)); + + gst_dvd_sub_dec_advance_time (dec, start); + } else { + GST_WARNING_OBJECT (dec, "Got GAP event with invalid position"); + } + + gst_event_unref (event); + ret = TRUE; + break; + } + case GST_EVENT_SEGMENT: + { + GstSegment seg; + + gst_event_copy_segment (event, &seg); + + { +#if 0 + /* Turn off forced highlight display */ + dec->forced_display = 0; + dec->current_button = 0; +#endif + if (dec->partialbuf) { + gst_buffer_unmap (dec->partialbuf, &dec->partialmap); + gst_buffer_unref (dec->partialbuf); + dec->partialbuf = NULL; + dec->have_title = FALSE; + } + + if (GST_CLOCK_TIME_IS_VALID (seg.time)) + dec->next_ts = seg.time; + else + dec->next_ts = GST_CLOCK_TIME_NONE; + + GST_DEBUG_OBJECT (dec, "Got newsegment, new time = %" + GST_TIME_FORMAT, GST_TIME_ARGS (dec->next_ts)); + + ret = gst_pad_event_default (pad, parent, event); + } + break; + } + case GST_EVENT_FLUSH_STOP:{ + /* Turn off forced highlight display */ + dec->forced_display = 0; + dec->current_button = 0; + + if (dec->partialbuf) { + gst_buffer_unmap (dec->partialbuf, &dec->partialmap); + gst_buffer_unref (dec->partialbuf); + dec->partialbuf = NULL; + dec->have_title = FALSE; + } + + ret = gst_pad_event_default (pad, parent, event); + break; + } + default:{ + ret = gst_pad_event_default (pad, parent, event); + break; + } + } + return ret; +} + +static gboolean +gst_dvd_sub_dec_handle_dvd_event (GstDvdSubDec * dec, GstEvent * event) +{ + GstStructure *structure; + const gchar *event_name; + + structure = (GstStructure *) gst_event_get_structure (event); + + if (structure == NULL) + goto not_handled; + + event_name = gst_structure_get_string (structure, "event"); + + GST_LOG_OBJECT (dec, + "DVD event %s with timestamp %" G_GINT64_FORMAT " on sub pad", + GST_STR_NULL (event_name), GST_EVENT_TIMESTAMP (event)); + + if (event_name == NULL) + goto not_handled; + + if (strcmp (event_name, "dvd-spu-highlight") == 0) { + gint button; + gint palette, sx, sy, ex, ey; + gint i; + + /* Details for the highlight region to display */ + if (!gst_structure_get_int (structure, "button", &button) || + !gst_structure_get_int (structure, "palette", &palette) || + !gst_structure_get_int (structure, "sx", &sx) || + !gst_structure_get_int (structure, "sy", &sy) || + !gst_structure_get_int (structure, "ex", &ex) || + !gst_structure_get_int (structure, "ey", &ey)) { + GST_ERROR_OBJECT (dec, "Invalid dvd-spu-highlight event received"); + return TRUE; + } + dec->current_button = button; + dec->hl_left = sx; + dec->hl_top = sy; + dec->hl_right = ex; + dec->hl_bottom = ey; + for (i = 0; i < 4; i++) { + dec->menu_alpha[i] = ((guint32) (palette) >> (i * 4)) & 0x0f; + dec->menu_index[i] = ((guint32) (palette) >> (16 + (i * 4))) & 0x0f; + } + + GST_DEBUG_OBJECT (dec, "New button activated highlight=(%d,%d) to (%d,%d) " + "palette 0x%x", sx, sy, ex, ey, palette); + gst_setup_palette (dec); + + dec->buf_dirty = TRUE; + } else if (strcmp (event_name, "dvd-spu-clut-change") == 0) { + /* Take a copy of the colour table */ + gchar name[16]; + int i; + gint value; + + GST_LOG_OBJECT (dec, "New colour table received"); + for (i = 0; i < 16; i++) { + g_snprintf (name, sizeof (name), "clut%02d", i); + if (!gst_structure_get_int (structure, name, &value)) { + GST_ERROR_OBJECT (dec, "dvd-spu-clut-change event did not " + "contain %s field", name); + break; + } + dec->current_clut[i] = (guint32) (value); + } + + gst_setup_palette (dec); + + dec->buf_dirty = TRUE; + } else if (strcmp (event_name, "dvd-spu-stream-change") == 0 + || strcmp (event_name, "dvd-spu-reset-highlight") == 0) { + /* Turn off forced highlight display */ + dec->current_button = 0; + + GST_LOG_OBJECT (dec, "Clearing button state"); + dec->buf_dirty = TRUE; + } else if (strcmp (event_name, "dvd-spu-still-frame") == 0) { + /* Handle a still frame */ + GST_LOG_OBJECT (dec, "Received still frame notification"); + } else { + goto not_handled; + } + + return TRUE; + +not_handled: + { + /* Ignore all other unknown events */ + GST_LOG_OBJECT (dec, "Ignoring other custom event %" GST_PTR_FORMAT, + structure); + return FALSE; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (dvdsubdec, plugin); + ret |= GST_ELEMENT_REGISTER (dvdsubparse, plugin); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + dvdsub, + "DVD subtitle parser and decoder", plugin_init, + VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/dvdsub/gstdvdsubdec.h b/gst/dvdsub/gstdvdsubdec.h new file mode 100644 index 0000000000..0c69677004 --- /dev/null +++ b/gst/dvdsub/gstdvdsubdec.h @@ -0,0 +1,111 @@ +/* GStreamer + * Copyright (C) <2005> Jan Schmidt + * Copyright (C) <2002> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifndef __GST_DVDSUBDEC_H__ +#define __GST_DVDSUBDEC_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DVD_SUB_DEC (gst_dvd_sub_dec_get_type()) +#define GST_DVD_SUB_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVD_SUB_DEC,GstDvdSubDec)) +#define GST_DVD_SUB_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVD_SUB_DEC,GstDvdSubDecClass)) +#define GST_IS_DVD_SUB_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVD_SUB_DEC)) +#define GST_IS_DVD_SUB_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVD_SUB_DEC)) + +typedef struct _GstDvdSubDec GstDvdSubDec; +typedef struct _GstDvdSubDecClass GstDvdSubDecClass; + +/* Hold premultimplied colour values */ +typedef struct Color_val +{ + guchar Y_R; + guchar U_G; + guchar V_B; + guchar A; + +} Color_val; + +struct _GstDvdSubDec +{ + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + gint in_width, in_height; + + /* Collect together subtitle buffers until we have a full control sequence */ + GstBuffer *partialbuf; + GstMapInfo partialmap; + gboolean have_title; + + guchar subtitle_index[4]; + guchar menu_index[4]; + guchar subtitle_alpha[4]; + guchar menu_alpha[4]; + + guint32 current_clut[16]; + Color_val palette_cache_yuv[4]; + Color_val hl_palette_cache_yuv[4]; + + Color_val palette_cache_rgb[4]; + Color_val hl_palette_cache_rgb[4]; + + GstVideoInfo info; + gboolean use_ARGB; + GstClockTime next_ts; + + /* + * State info for the current subpicture + * buffer + */ + guchar *parse_pos; + + guint16 packet_size; + guint16 data_size; + + gint offset[2]; + + gboolean forced_display; + gboolean visible; + + gint left, top, right, bottom; + gint hl_left, hl_top, hl_right, hl_bottom; + + gint current_button; + + GstClockTime next_event_ts; + + gboolean buf_dirty; +}; + +struct _GstDvdSubDecClass +{ + GstElementClass parent_class; +}; + +GType gst_dvd_sub_dec_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (dvdsubdec); + +G_END_DECLS + +#endif /* __GST_DVDSUBDEC_H__ */ diff --git a/gst/dvdsub/gstdvdsubparse.c b/gst/dvdsub/gstdvdsubparse.c new file mode 100644 index 0000000000..9d0e1d03f6 --- /dev/null +++ b/gst/dvdsub/gstdvdsubparse.c @@ -0,0 +1,241 @@ +/* GStreamer DVD subtitle parser + * Copyright (C) 2007 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstdvdsubparse.h" + +GST_DEBUG_CATEGORY_STATIC (dvdsubparse_debug); +#define GST_CAT_DEFAULT dvdsubparse_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("subpicture/x-dvd, parsed=(boolean)true") + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("subpicture/x-dvd") + ); + +static void gst_dvd_sub_parse_finalize (GObject * object); + +static void gst_dvd_sub_parse_reset (GstDvdSubParse * parse); + +static gboolean gst_dvd_sub_parse_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static GstFlowReturn gst_dvd_sub_parse_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); + +static GstStateChangeReturn gst_dvd_sub_parse_change_state (GstElement * + element, GstStateChange transition); + +#define gst_dvd_sub_parse_parent_class parent_class +G_DEFINE_TYPE (GstDvdSubParse, gst_dvd_sub_parse, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (dvdsubparse, "dvdsubparse", GST_RANK_NONE, + GST_TYPE_DVD_SUB_PARSE); + +static void +gst_dvd_sub_parse_class_init (GstDvdSubParseClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_dvd_sub_parse_finalize; + + GST_DEBUG_CATEGORY_INIT (dvdsubparse_debug, "dvdsubparse", 0, + "DVD subtitle parser"); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_dvd_sub_parse_change_state); + + gst_element_class_add_static_pad_template (gstelement_class, &src_template); + gst_element_class_add_static_pad_template (gstelement_class, &sink_template); + + gst_element_class_set_static_metadata (gstelement_class, + "DVD subtitle parser", "Codec/Parser/Subtitle", + "Parses and packetizes DVD subtitle streams", + "Mark Nauwelaerts "); +} + +static void +gst_dvd_sub_parse_finalize (GObject * object) +{ + GstDvdSubParse *parse = GST_DVD_SUB_PARSE (object); + + g_object_unref (parse->adapter); + parse->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_dvd_sub_parse_init (GstDvdSubParse * parse) +{ + parse->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvd_sub_parse_chain)); + gst_pad_set_event_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvd_sub_parse_event)); + gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad); + + parse->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_pad_use_fixed_caps (parse->srcpad); + gst_pad_set_caps (parse->srcpad, + gst_static_pad_template_get_caps (&src_template)); + gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad); + + /* remainder */ + parse->adapter = gst_adapter_new (); + gst_dvd_sub_parse_reset (parse); +} + +static void +gst_dvd_sub_parse_reset (GstDvdSubParse * parse) +{ + parse->needed = 0; + parse->stamp = GST_CLOCK_TIME_NONE; + gst_adapter_clear (parse->adapter); +} + +static gboolean +gst_dvd_sub_parse_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstDvdSubParse *parse; + gboolean ret; + + parse = GST_DVD_SUB_PARSE (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_unref (event); + caps = gst_static_pad_template_get_caps (&src_template); + gst_pad_push_event (parse->srcpad, gst_event_new_caps (caps)); + gst_caps_unref (caps); + ret = TRUE; + break; + } + case GST_EVENT_FLUSH_STOP: + gst_dvd_sub_parse_reset (parse); + /* fall-through */ + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; +} + + +static GstFlowReturn +gst_dvd_sub_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstDvdSubParse *parse = GST_DVD_SUB_PARSE (parent); + GstAdapter *adapter; + GstBuffer *outbuf = NULL; + GstFlowReturn ret = GST_FLOW_OK; + + adapter = parse->adapter; + + GST_LOG_OBJECT (parse, "%" G_GSIZE_FORMAT " bytes, ts: %" GST_TIME_FORMAT, + gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + gst_adapter_push (adapter, buf); + + if (!parse->needed) { + guint8 data[2]; + + gst_adapter_copy (adapter, data, 0, 2); + parse->needed = GST_READ_UINT16_BE (data); + } + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + if (GST_CLOCK_TIME_IS_VALID (parse->stamp)) + /* normally, we expect only the first fragment to carry a timestamp */ + GST_WARNING_OBJECT (parse, "Received more timestamps than expected."); + else + parse->stamp = GST_BUFFER_TIMESTAMP (buf); + } + + if (parse->needed) { + guint av; + + av = gst_adapter_available (adapter); + if (av >= parse->needed) { + if (av > parse->needed) { + /* normally, we expect several fragment, boundary aligned */ + GST_WARNING_OBJECT (parse, "Unexpected: needed %d, " + "but more (%d) is available.", parse->needed, av); + } + outbuf = gst_adapter_take_buffer (adapter, parse->needed); + /* decorate buffer */ + GST_BUFFER_TIMESTAMP (outbuf) = parse->stamp; + /* reset state */ + parse->stamp = GST_CLOCK_TIME_NONE; + parse->needed = 0; + /* and send along */ + ret = gst_pad_push (parse->srcpad, outbuf); + } + } + + return ret; +} + +static GstStateChangeReturn +gst_dvd_sub_parse_change_state (GstElement * element, GstStateChange transition) +{ + GstDvdSubParse *parse = GST_DVD_SUB_PARSE (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret != GST_STATE_CHANGE_SUCCESS) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_dvd_sub_parse_reset (parse); + break; + default: + break; + } + + return GST_STATE_CHANGE_SUCCESS; +} diff --git a/gst/dvdsub/gstdvdsubparse.h b/gst/dvdsub/gstdvdsubparse.h new file mode 100644 index 0000000000..0df1ad0812 --- /dev/null +++ b/gst/dvdsub/gstdvdsubparse.h @@ -0,0 +1,66 @@ +/* GStreamer DVD subtitle parser + * Copyright (C) 2007 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_DVDSUBPARSE_H__ +#define __GST_DVDSUBPARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DVD_SUB_PARSE \ + (gst_dvd_sub_parse_get_type()) +#define GST_DVD_SUB_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DVD_SUB_PARSE, GstDvdSubParse)) +#define GST_DVD_SUB_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DVD_SUB_PARSE, GstDvdSubParseClass)) +#define GST_DVD_SUB_PARSE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DVD_SUB_PARSE, GstDvdSubParseClass)) +#define GST_IS_DVD_SUB_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DVD_SUB_PARSE)) +#define GST_IS_DVD_SUB_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DVD_SUB_PARSE)) + +typedef struct _GstDvdSubParse GstDvdSubParse; +typedef struct _GstDvdSubParseClass GstDvdSubParseClass; + +struct _GstDvdSubParse { + GstElement element; + + /*< private >*/ + GstPad *srcpad; + GstPad *sinkpad; + + GstAdapter *adapter; /* buffer incoming data */ + GstClockTime stamp; /* timestamp of current packet */ + guint needed; /* size of current packet to be assembled */ +}; + +struct _GstDvdSubParseClass { + GstElementClass parent_class; +}; + +GType gst_dvd_sub_parse_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (dvdsubparse); + +G_END_DECLS + +#endif /* __GST_DVDSUBPARSE_H__ */ + diff --git a/gst/dvdsub/meson.build b/gst/dvdsub/meson.build new file mode 100644 index 0000000000..827fb4ed7a --- /dev/null +++ b/gst/dvdsub/meson.build @@ -0,0 +1,15 @@ +dvdsub_sources = [ + 'gstdvdsubdec.c', + 'gstdvdsubparse.c', +] + +gstdvdsub = library('gstdvdsub', + dvdsub_sources, + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstbase_dep, gstvideo_dep], + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstdvdsub, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstdvdsub] diff --git a/gst/meson.build b/gst/meson.build new file mode 100644 index 0000000000..19e7d2a883 --- /dev/null +++ b/gst/meson.build @@ -0,0 +1,5 @@ +foreach plugin : ['asfdemux', 'dvdlpcmdec', 'dvdsub', 'realmedia', 'xingmux'] + if not get_option(plugin).disabled() + subdir(plugin) + endif +endforeach diff --git a/gst/realmedia/asmrules.c b/gst/realmedia/asmrules.c new file mode 100644 index 0000000000..af2f8a0a3f --- /dev/null +++ b/gst/realmedia/asmrules.c @@ -0,0 +1,712 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#include "asmrules.h" + +#define MAX_RULE_LENGTH 2048 + +/* define to enable some more debug */ +#undef DEBUG + +static GstASMNode * +gst_asm_node_new (void) +{ + GstASMNode *node; + + node = g_new0 (GstASMNode, 1); + node->type = GST_ASM_NODE_UNKNOWN; + + return node; +} + +static void +gst_asm_node_free (GstASMNode * node) +{ + if (node->left) + gst_asm_node_free (node->left); + if (node->right) + gst_asm_node_free (node->right); + if (node->type == GST_ASM_NODE_VARIABLE && node->data.varname) + g_free (node->data.varname); + g_free (node); +} + +static gfloat +gst_asm_operator_eval (GstASMOp optype, gfloat left, gfloat right) +{ + gfloat result = 0.0; + + switch (optype) { + case GST_ASM_OP_GREATER: + result = (gfloat) (left > right); + break; + case GST_ASM_OP_LESS: + result = (gfloat) (left < right); + break; + case GST_ASM_OP_GREATEREQUAL: + result = (gfloat) (left >= right); + break; + case GST_ASM_OP_LESSEQUAL: + result = (gfloat) (left <= right); + break; + case GST_ASM_OP_EQUAL: + result = (gfloat) (left == right); + break; + case GST_ASM_OP_NOTEQUAL: + result = (gfloat) (left != right); + break; + case GST_ASM_OP_AND: + result = (gfloat) (left && right); + break; + case GST_ASM_OP_OR: + result = (gfloat) (left || right); + break; + default: + break; + } + return result; +} + +static gfloat +gst_asm_node_evaluate (GstASMNode * node, GHashTable * vars) +{ + gfloat result = 0.0; + + if (node == NULL) + return 0.0; + + switch (node->type) { + case GST_ASM_NODE_VARIABLE: + { + gchar *val; + + val = g_hash_table_lookup (vars, node->data.varname); + if (val) + result = (gfloat) atof (val); + break; + } + case GST_ASM_NODE_INTEGER: + result = (gfloat) node->data.intval; + break; + case GST_ASM_NODE_FLOAT: + result = node->data.floatval; + break; + case GST_ASM_NODE_OPERATOR: + { + gfloat left, right; + + left = gst_asm_node_evaluate (node->left, vars); + right = gst_asm_node_evaluate (node->right, vars); + + result = gst_asm_operator_eval (node->data.optype, left, right); + break; + } + default: + break; + } + return result; +} + +#define IS_SPACE(p) (((p) == ' ') || ((p) == '\n') || \ + ((p) == '\r') || ((p) == '\t')) +#define IS_RULE_DELIM(p) (((p) == ',') || ((p) == ';') || ((p) == ')')) +#define IS_OPERATOR(p) (((p) == '>') || ((p) == '<') || \ + ((p) == '=') || ((p) == '!') || \ + ((p) == '&') || ((p) == '|')) +#define IS_NUMBER(p) ((((p) >= '0') && ((p) <= '9')) || ((p) == '.')) +#define IS_CHAR(p) (!IS_OPERATOR(ch) && !IS_RULE_DELIM(ch) && (ch != '\0')) + +#define IS_OP_TOKEN(t) (((t) == GST_ASM_TOKEN_AND) || ((t) == GST_ASM_TOKEN_OR)) +#define IS_COND_TOKEN(t) (((t) == GST_ASM_TOKEN_LESS) || ((t) == GST_ASM_TOKEN_LESSEQUAL) || \ + ((t) == GST_ASM_TOKEN_GREATER) || ((t) == GST_ASM_TOKEN_GREATEREQUAL) || \ + ((t) == GST_ASM_TOKEN_EQUAL) || ((t) == GST_ASM_TOKEN_NOTEQUAL)) + +typedef struct +{ + const gchar *buffer; + gint pos; + gchar ch; + + GstASMToken token; + gchar val[MAX_RULE_LENGTH]; +} GstASMScan; + +#define NEXT_CHAR(scan) ((scan)->ch = (scan)->buffer[(scan)->pos++]) +#define THIS_CHAR(scan) ((scan)->ch) + +static GstASMScan * +gst_asm_scan_new (const gchar * buffer) +{ + GstASMScan *scan; + + scan = g_new0 (GstASMScan, 1); + scan->buffer = buffer; + NEXT_CHAR (scan); + + return scan; +} + +static void +gst_asm_scan_free (GstASMScan * scan) +{ + g_free (scan); +} + +static void +gst_asm_scan_string (GstASMScan * scan, gchar delim) +{ + gchar ch; + gint i = 0; + + ch = THIS_CHAR (scan); + while ((ch != delim) && (ch != '\0')) { + if (i < MAX_RULE_LENGTH - 1) + scan->val[i++] = ch; + ch = NEXT_CHAR (scan); + if (ch == '\\') + ch = NEXT_CHAR (scan); + } + scan->val[i] = '\0'; + + if (ch == delim) + NEXT_CHAR (scan); + + scan->token = GST_ASM_TOKEN_STRING; +} + +static void +gst_asm_scan_number (GstASMScan * scan) +{ + gchar ch; + gint i = 0; + gboolean have_float = FALSE; + + ch = THIS_CHAR (scan); + /* real strips all spaces that are not inside quotes for numbers */ + while ((IS_NUMBER (ch) || IS_SPACE (ch))) { + if (i < (MAX_RULE_LENGTH - 1) && !IS_SPACE (ch)) + scan->val[i++] = ch; + if (ch == '.') + have_float = TRUE; + ch = NEXT_CHAR (scan); + } + scan->val[i] = '\0'; + + if (have_float) + scan->token = GST_ASM_TOKEN_FLOAT; + else + scan->token = GST_ASM_TOKEN_INT; +} + +static void +gst_asm_scan_identifier (GstASMScan * scan) +{ + gchar ch; + gint i = 0; + + ch = THIS_CHAR (scan); + /* real strips all spaces that are not inside quotes for identifiers */ + while ((IS_CHAR (ch) || IS_SPACE (ch))) { + if (i < (MAX_RULE_LENGTH - 1) && !IS_SPACE (ch)) + scan->val[i++] = ch; + ch = NEXT_CHAR (scan); + } + scan->val[i] = '\0'; + + scan->token = GST_ASM_TOKEN_IDENTIFIER; +} + +static void +gst_asm_scan_print_token (GstASMScan * scan) +{ +#ifdef DEBUG + switch (scan->token) { + case GST_ASM_TOKEN_NONE: + g_print ("none\n"); + break; + case GST_ASM_TOKEN_EOF: + g_print ("EOF\n"); + break; + + case GST_ASM_TOKEN_INT: + g_print ("INT %d\n", atoi (scan->val)); + break; + case GST_ASM_TOKEN_FLOAT: + g_print ("FLOAT %f\n", atof (scan->val)); + break; + case GST_ASM_TOKEN_IDENTIFIER: + g_print ("ID %s\n", scan->val); + break; + case GST_ASM_TOKEN_STRING: + g_print ("STRING %s\n", scan->val); + break; + + case GST_ASM_TOKEN_HASH: + g_print ("HASH\n"); + break; + case GST_ASM_TOKEN_SEMICOLON: + g_print ("SEMICOLON\n"); + break; + case GST_ASM_TOKEN_COMMA: + g_print ("COMMA\n"); + break; + case GST_ASM_TOKEN_EQUAL: + g_print ("==\n"); + break; + case GST_ASM_TOKEN_NOTEQUAL: + g_print ("!=\n"); + break; + case GST_ASM_TOKEN_AND: + g_print ("&&\n"); + break; + case GST_ASM_TOKEN_OR: + g_print ("||\n"); + break; + case GST_ASM_TOKEN_LESS: + g_print ("<\n"); + break; + case GST_ASM_TOKEN_LESSEQUAL: + g_print ("<=\n"); + break; + case GST_ASM_TOKEN_GREATER: + g_print (">\n"); + break; + case GST_ASM_TOKEN_GREATEREQUAL: + g_print (">=\n"); + break; + case GST_ASM_TOKEN_DOLLAR: + g_print ("$\n"); + break; + case GST_ASM_TOKEN_LPAREN: + g_print ("(\n"); + break; + case GST_ASM_TOKEN_RPAREN: + g_print (")\n"); + break; + default: + break; + } +#endif +} + +static GstASMToken +gst_asm_scan_next_token (GstASMScan * scan) +{ + gchar ch; + + ch = THIS_CHAR (scan); + + /* skip spaces */ + while (IS_SPACE (ch)) + ch = NEXT_CHAR (scan); + + /* remove \ which is common in front of " */ + while (ch == '\\') + ch = NEXT_CHAR (scan); + + switch (ch) { + case '#': + scan->token = GST_ASM_TOKEN_HASH; + NEXT_CHAR (scan); + break; + case ';': + scan->token = GST_ASM_TOKEN_SEMICOLON; + NEXT_CHAR (scan); + break; + case ',': + scan->token = GST_ASM_TOKEN_COMMA; + NEXT_CHAR (scan); + break; + case '=': + scan->token = GST_ASM_TOKEN_EQUAL; + if (NEXT_CHAR (scan) == '=') + NEXT_CHAR (scan); + break; + case '!': + if (NEXT_CHAR (scan) == '=') { + scan->token = GST_ASM_TOKEN_NOTEQUAL; + NEXT_CHAR (scan); + } + break; + case '&': + scan->token = GST_ASM_TOKEN_AND; + if (NEXT_CHAR (scan) == '&') + NEXT_CHAR (scan); + break; + case '|': + scan->token = GST_ASM_TOKEN_OR; + if (NEXT_CHAR (scan) == '|') + NEXT_CHAR (scan); + break; + case '<': + scan->token = GST_ASM_TOKEN_LESS; + if (NEXT_CHAR (scan) == '=') { + scan->token = GST_ASM_TOKEN_LESSEQUAL; + NEXT_CHAR (scan); + } + break; + case '>': + scan->token = GST_ASM_TOKEN_GREATER; + if (NEXT_CHAR (scan) == '=') { + scan->token = GST_ASM_TOKEN_GREATEREQUAL; + NEXT_CHAR (scan); + } + break; + case '$': + scan->token = GST_ASM_TOKEN_DOLLAR; + NEXT_CHAR (scan); + break; + case '(': + scan->token = GST_ASM_TOKEN_LPAREN; + NEXT_CHAR (scan); + break; + case ')': + scan->token = GST_ASM_TOKEN_RPAREN; + NEXT_CHAR (scan); + break; + case '"': + NEXT_CHAR (scan); + gst_asm_scan_string (scan, '"'); + break; + case '\'': + NEXT_CHAR (scan); + gst_asm_scan_string (scan, '\''); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + gst_asm_scan_number (scan); + break; + case '\0': + scan->token = GST_ASM_TOKEN_EOF; + break; + default: + gst_asm_scan_identifier (scan); + break; + } + gst_asm_scan_print_token (scan); + return scan->token; +} + +static GstASMRule * +gst_asm_rule_new (void) +{ + GstASMRule *rule; + + rule = g_new (GstASMRule, 1); + rule->root = NULL; + rule->props = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return rule; +} + +static void +gst_asm_rule_free (GstASMRule * rule) +{ + g_hash_table_destroy (rule->props); + if (rule->root) + gst_asm_node_free (rule->root); + g_free (rule); +} + +static void +gst_asm_rule_add_property (GstASMRule * rule, gchar * key, gchar * val) +{ + g_hash_table_insert (rule->props, key, val); +} + +static GstASMNode *gst_asm_scan_parse_condition (GstASMScan * scan); + +static GstASMNode * +gst_asm_scan_parse_operand (GstASMScan * scan) +{ + GstASMNode *node; + + switch (scan->token) { + case GST_ASM_TOKEN_DOLLAR: + gst_asm_scan_next_token (scan); + + if (scan->token != GST_ASM_TOKEN_IDENTIFIER) + g_warning ("identifier expected"); + + node = gst_asm_node_new (); + node->type = GST_ASM_NODE_VARIABLE; + node->data.varname = g_strdup (scan->val); + break; + case GST_ASM_TOKEN_INT: + node = gst_asm_node_new (); + node->type = GST_ASM_NODE_INTEGER; + node->data.intval = (gfloat) atof (scan->val); + break; + case GST_ASM_TOKEN_FLOAT: + node = gst_asm_node_new (); + node->type = GST_ASM_NODE_FLOAT; + node->data.floatval = atoi (scan->val); + break; + case GST_ASM_TOKEN_LPAREN: + gst_asm_scan_next_token (scan); + node = gst_asm_scan_parse_condition (scan); + if (scan->token != GST_ASM_TOKEN_RPAREN) + g_warning (") expected"); + break; + default: + g_warning ("$ or ) expected"); + node = NULL; + break; + } + gst_asm_scan_next_token (scan); + + return node; +} + +static GstASMNode * +gst_asm_scan_parse_expression (GstASMScan * scan) +{ + GstASMNode *node, *left; + + node = gst_asm_scan_parse_operand (scan); + + while (IS_COND_TOKEN (scan->token)) { + left = node; + + node = gst_asm_node_new (); + node->type = GST_ASM_NODE_OPERATOR; + node->data.optype = (GstASMOp) scan->token; + + gst_asm_scan_next_token (scan); + + node->right = gst_asm_scan_parse_operand (scan); + node->left = left; + } + return node; +} + +static GstASMNode * +gst_asm_scan_parse_condition (GstASMScan * scan) +{ + GstASMNode *node, *left; + + node = gst_asm_scan_parse_expression (scan); + + while (IS_OP_TOKEN (scan->token)) { + left = node; + + node = gst_asm_node_new (); + node->type = GST_ASM_NODE_OPERATOR; + node->data.optype = (GstASMOp) scan->token; + + gst_asm_scan_next_token (scan); + + node->right = gst_asm_scan_parse_expression (scan); + node->left = left; + } + return node; +} + +static void +gst_asm_scan_parse_property (GstASMRule * rule, GstASMScan * scan) +{ + gchar *key, *val; + + if (scan->token != GST_ASM_TOKEN_IDENTIFIER) { + g_warning ("identifier expected"); + return; + } + key = g_strdup (scan->val); + + gst_asm_scan_next_token (scan); + if (scan->token != GST_ASM_TOKEN_EQUAL) { + g_warning ("= expected"); + g_free (key); + return; + } + gst_asm_scan_next_token (scan); + val = g_strdup (scan->val); + + gst_asm_rule_add_property (rule, key, val); + gst_asm_scan_next_token (scan); +} + +static GstASMRule * +gst_asm_scan_parse_rule (GstASMScan * scan) +{ + GstASMRule *rule; + + rule = gst_asm_rule_new (); + + if (scan->token == GST_ASM_TOKEN_HASH) { + gst_asm_scan_next_token (scan); + rule->root = gst_asm_scan_parse_condition (scan); + if (scan->token == GST_ASM_TOKEN_COMMA) + gst_asm_scan_next_token (scan); + } + + if (scan->token != GST_ASM_TOKEN_SEMICOLON) { + gst_asm_scan_parse_property (rule, scan); + while (scan->token == GST_ASM_TOKEN_COMMA) { + gst_asm_scan_next_token (scan); + gst_asm_scan_parse_property (rule, scan); + } + gst_asm_scan_next_token (scan); + } + return rule; +} + +static gboolean +gst_asm_rule_evaluate (GstASMRule * rule, GHashTable * vars) +{ + gboolean res; + + if (rule->root) { + res = (gboolean) gst_asm_node_evaluate (rule->root, vars); + } else + res = TRUE; + + return res; +} + +GstASMRuleBook * +gst_asm_rule_book_new (const gchar * rulebook) +{ + GstASMRuleBook *book; + GstASMRule *rule = NULL; + GstASMScan *scan; + GstASMToken token; + + book = g_new0 (GstASMRuleBook, 1); + book->rulebook = rulebook; + + scan = gst_asm_scan_new (book->rulebook); + gst_asm_scan_next_token (scan); + + do { + rule = gst_asm_scan_parse_rule (scan); + if (rule) { + book->rules = g_list_append (book->rules, rule); + book->n_rules++; + } + token = scan->token; + } while (token != GST_ASM_TOKEN_EOF); + + gst_asm_scan_free (scan); + + return book; +} + +void +gst_asm_rule_book_free (GstASMRuleBook * book) +{ + GList *walk; + + for (walk = book->rules; walk; walk = g_list_next (walk)) { + GstASMRule *rule = (GstASMRule *) walk->data; + + gst_asm_rule_free (rule); + } + g_list_free (book->rules); + g_free (book); +} + +gint +gst_asm_rule_book_match (GstASMRuleBook * book, GHashTable * vars, + gint * rulematches) +{ + GList *walk; + gint i, n = 0; + + for (walk = book->rules, i = 0; walk; walk = g_list_next (walk), i++) { + GstASMRule *rule = (GstASMRule *) walk->data; + + if (gst_asm_rule_evaluate (rule, vars)) { + rulematches[n++] = i; + } + } + return n; +} + +#ifdef TEST +gint +main (gint argc, gchar * argv[]) +{ + GstASMRuleBook *book; + gint rulematch[MAX_RULEMATCHES]; + GHashTable *vars; + gint i, n; + + static const gchar rules1[] = + "#($Bandwidth < 67959),TimestampDelivery=T,DropByN=T," + "priority=9;#($Bandwidth >= 67959) && ($Bandwidth < 167959)," + "AverageBandwidth=67959,Priority=9;#($Bandwidth >= 67959) && ($Bandwidth" + " < 167959),AverageBandwidth=0,Priority=5,OnDepend=\\\"1\\\";#($Bandwidth >= 167959)" + " && ($Bandwidth < 267959),AverageBandwidth=167959,Priority=9;#($Bandwidth >= 167959)" + " && ($Bandwidth < 267959),AverageBandwidth=0,Priority=5,OnDepend=\\\"3\\\";" + "#($Bandwidth >= 267959),AverageBandwidth=267959,Priority=9;#($Bandwidth >= 267959)" + ",AverageBandwidth=0,Priority=5,OnDepend=\\\"5\\\";"; + static const gchar rules2[] = + "AverageBandwidth=32041,Priority=5;AverageBandwidth=0," + "Priority=5,OnDepend=\\\"0\\\", OffDepend=\\\"0\\\";"; + static const gchar rules3[] = + "#(($Bandwidth >= 27500) && ($OldPNMPlayer)),AverageBandwidth=27500,priority=9,PNMKeyframeRule=T;#(($Bandwidth >= 27500) && ($OldPNMPlayer)),AverageBandwidth=0,priority=5,PNMNonKeyframeRule=T;#(($Bandwidth < 27500) && ($OldPNMPlayer)),TimestampDelivery=T,DropByN=T,priority=9,PNMThinningRule=T;#($Bandwidth < 13899),TimestampDelivery=T,DropByN=T,priority=9;#($Bandwidth >= 13899) && ($Bandwidth < 19000),AverageBandwidth=13899,Priority=9;#($Bandwidth >= 13899) && ($Bandwidth < 19000),AverageBandwidth=0,Priority=5,OnDepend=\\\"4\\\";#($Bandwidth >= 19000) && ($Bandwidth < 27500),AverageBandwidth=19000,Priority=9;#($Bandwidth >= 19000) && ($Bandwidth < 27500),AverageBandwidth=0,Priority=5,OnDepend=\\\"6\\\";#($Bandwidth >= 27500) && ($Bandwidth < 132958),AverageBandwidth=27500,Priority=9;#($Bandwidth >= 27500) && ($Bandwidth < 132958),AverageBandwidth=0,Priority=5,OnDepend=\\\"8\\\";#($Bandwidth >= 132958) && ($Bandwidth < 187958),AverageBandwidth=132958,Priority=9;#($Bandwidth >= 132958) && ($Bandwidth < 187958),AverageBandwidth=0,Priority=5,OnDepend=\\\"10\\\";#($Bandwidth >= 187958),AverageBandwidth=187958,Priority=9;#($Bandwidth >= 187958),AverageBandwidth=0,Priority=5,OnDepend=\\\"12\\\";"; + + vars = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_insert (vars, (gchar *) "Bandwidth", (gchar *) "300000"); + + book = gst_asm_rule_book_new (rules1); + n = gst_asm_rule_book_match (book, vars, rulematch); + gst_asm_rule_book_free (book); + + g_print ("%d rules matched\n", n); + for (i = 0; i < n; i++) { + g_print ("rule %d matched\n", rulematch[i]); + } + + book = gst_asm_rule_book_new (rules2); + n = gst_asm_rule_book_match (book, vars, rulematch); + gst_asm_rule_book_free (book); + + g_print ("%d rules matched\n", n); + for (i = 0; i < n; i++) { + g_print ("rule %d matched\n", rulematch[i]); + } + + book = gst_asm_rule_book_new (rules3); + n = gst_asm_rule_book_match (book, vars, rulematch); + gst_asm_rule_book_free (book); + + + g_print ("%d rules matched\n", n); + for (i = 0; i < n; i++) { + g_print ("rule %d matched\n", rulematch[i]); + } + + g_hash_table_destroy (vars); + + return 0; +} +#endif diff --git a/gst/realmedia/asmrules.h b/gst/realmedia/asmrules.h new file mode 100644 index 0000000000..1f84f680f1 --- /dev/null +++ b/gst/realmedia/asmrules.h @@ -0,0 +1,115 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_ASM_RULES_H__ +#define __GST_ASM_RULES_H__ + +#include + +G_BEGIN_DECLS + +#define MAX_RULEMATCHES 16 + +typedef struct _GstASMNode GstASMNode; +typedef struct _GstASMRule GstASMRule; +typedef struct _GstASMRuleBook GstASMRuleBook; + +typedef enum { + GST_ASM_TOKEN_NONE, + GST_ASM_TOKEN_EOF, + + GST_ASM_TOKEN_INT, + GST_ASM_TOKEN_FLOAT, + GST_ASM_TOKEN_IDENTIFIER, + GST_ASM_TOKEN_STRING, + + GST_ASM_TOKEN_HASH, + GST_ASM_TOKEN_SEMICOLON, + GST_ASM_TOKEN_COMMA, + GST_ASM_TOKEN_DOLLAR, + + GST_ASM_TOKEN_LPAREN, + GST_ASM_TOKEN_RPAREN, + + GST_ASM_TOKEN_GREATER, + GST_ASM_TOKEN_LESS, + GST_ASM_TOKEN_GREATEREQUAL, + GST_ASM_TOKEN_LESSEQUAL, + GST_ASM_TOKEN_EQUAL, + GST_ASM_TOKEN_NOTEQUAL, + + GST_ASM_TOKEN_AND, + GST_ASM_TOKEN_OR +} GstASMToken; + +typedef enum { + GST_ASM_NODE_UNKNOWN, + GST_ASM_NODE_VARIABLE, + GST_ASM_NODE_INTEGER, + GST_ASM_NODE_FLOAT, + GST_ASM_NODE_OPERATOR +} GstASMNodeType; + +typedef enum { + GST_ASM_OP_GREATER = GST_ASM_TOKEN_GREATER, + GST_ASM_OP_LESS = GST_ASM_TOKEN_LESS, + GST_ASM_OP_GREATEREQUAL = GST_ASM_TOKEN_GREATEREQUAL, + GST_ASM_OP_LESSEQUAL = GST_ASM_TOKEN_LESSEQUAL, + GST_ASM_OP_EQUAL = GST_ASM_TOKEN_EQUAL, + GST_ASM_OP_NOTEQUAL = GST_ASM_TOKEN_NOTEQUAL, + + GST_ASM_OP_AND = GST_ASM_TOKEN_AND, + GST_ASM_OP_OR = GST_ASM_TOKEN_OR +} GstASMOp; + +struct _GstASMNode { + GstASMNodeType type; + + union { + gchar *varname; + gint intval; + gfloat floatval; + GstASMOp optype; + } data; + + GstASMNode *left; + GstASMNode *right; +}; + +struct _GstASMRule { + GstASMNode *root; + GHashTable *props; +}; + +struct _GstASMRuleBook { + const gchar *rulebook; + + guint n_rules; + GList *rules; +}; + +G_END_DECLS + +GstASMRuleBook* gst_asm_rule_book_new (const gchar *rulebook); +void gst_asm_rule_book_free (GstASMRuleBook *book); + +gint gst_asm_rule_book_match (GstASMRuleBook *book, GHashTable *vars, + gint *rulematches); + +#endif /* __GST_ASM_RULES_H__ */ diff --git a/gst/realmedia/gstrdtbuffer.c b/gst/realmedia/gstrdtbuffer.c new file mode 100644 index 0000000000..50bc7f438a --- /dev/null +++ b/gst/realmedia/gstrdtbuffer.c @@ -0,0 +1,477 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#include + +#include "gstrdtbuffer.h" + +gboolean +gst_rdt_buffer_validate_data (guint8 * data, guint len) +{ + return TRUE; +} + +gboolean +gst_rdt_buffer_validate (GstBuffer * buffer) +{ + return TRUE; +} + +guint +gst_rdt_buffer_get_packet_count (GstBuffer * buffer) +{ + GstRDTPacket packet; + guint count; + + g_return_val_if_fail (GST_IS_BUFFER (buffer), 0); + + count = 0; + if (gst_rdt_buffer_get_first_packet (buffer, &packet)) { + do { + count++; + } while (gst_rdt_packet_move_to_next (&packet)); + } + return count; +} + +static gboolean +read_packet_header (GstRDTPacket * packet) +{ + GstMapInfo map; + guint8 *data; + gsize size; + guint offset; + guint length; + guint length_offset; + + g_return_val_if_fail (packet != NULL, FALSE); + g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), FALSE); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + data = map.data; + size = map.size; + + offset = packet->offset; + + /* check if we are at the end of the buffer, we add 3 because we also want to + * ensure we can read the type, which is always at offset 1 and 2 bytes long. */ + if (offset + 3 > size) + goto packet_end; + + /* read type */ + packet->type = GST_READ_UINT16_BE (&data[offset + 1]); + + length = -1; + length_offset = -1; + + /* figure out the length of the packet, this depends on the type */ + if (GST_RDT_IS_DATA_TYPE (packet->type)) { + if (data[offset] & 0x80) + /* length is present */ + length_offset = 3; + } else { + switch (packet->type) { + case GST_RDT_TYPE_ASMACTION: + if (data[offset] & 0x80) + length_offset = 5; + break; + case GST_RDT_TYPE_BWREPORT: + if (data[offset] & 0x80) + length_offset = 3; + break; + case GST_RDT_TYPE_ACK: + if (data[offset] & 0x80) + length_offset = 3; + break; + case GST_RDT_TYPE_RTTREQ: + length = 3; + break; + case GST_RDT_TYPE_RTTRESP: + length = 11; + break; + case GST_RDT_TYPE_CONGESTION: + length = 11; + break; + case GST_RDT_TYPE_STREAMEND: + length = 9; + /* total_reliable */ + if (data[offset] & 0x80) + length += 2; + /* stream_id_expansion */ + if ((data[offset] & 0x7c) == 0x7c) + length += 2; + /* ext_flag, FIXME, get string length */ + if ((data[offset] & 0x1) == 0x1) + length += 7; + break; + case GST_RDT_TYPE_REPORT: + if (data[offset] & 0x80) + length_offset = 3; + break; + case GST_RDT_TYPE_LATENCY: + if (data[offset] & 0x80) + length_offset = 3; + break; + case GST_RDT_TYPE_INFOREQ: + length = 3; + /* request_time_ms */ + if (data[offset] & 0x2) + length += 2; + break; + case GST_RDT_TYPE_INFORESP: + length = 3; + /* has_rtt_info */ + if (data[offset] & 0x4) { + length += 4; + /* is_delayed */ + if (data[offset] & 0x2) { + length += 4; + } + } + if (data[offset] & 0x1) { + /* buffer_info_count, FIXME read and skip */ + length += 2; + } + break; + case GST_RDT_TYPE_AUTOBW: + if (data[offset] & 0x80) + length_offset = 3; + break; + case GST_RDT_TYPE_INVALID: + default: + goto unknown_packet; + } + } + + if (length != -1) { + /* we have a fixed length */ + packet->length = length; + } else if (length_offset != -1) { + /* we can read the length from an offset */ + packet->length = GST_READ_UINT16_BE (&data[length_offset]); + } else { + /* length is remainder of packet */ + packet->length = size - offset; + } + gst_buffer_unmap (packet->buffer, &map); + + /* the length should be smaller than the remaining size */ + if (packet->length + offset > size) + goto invalid_length; + + return TRUE; + + /* ERRORS */ +packet_end: + { + gst_buffer_unmap (packet->buffer, &map); + return FALSE; + } +unknown_packet: + { + packet->type = GST_RDT_TYPE_INVALID; + gst_buffer_unmap (packet->buffer, &map); + return FALSE; + } +invalid_length: + { + packet->type = GST_RDT_TYPE_INVALID; + packet->length = 0; + return FALSE; + } +} + +gboolean +gst_rdt_buffer_get_first_packet (GstBuffer * buffer, GstRDTPacket * packet) +{ + g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); + g_return_val_if_fail (packet != NULL, FALSE); + + /* init to 0 */ + packet->buffer = buffer; + packet->offset = 0; + packet->type = GST_RDT_TYPE_INVALID; + memset (&packet->map, 0, sizeof (GstMapInfo)); + + if (!read_packet_header (packet)) + return FALSE; + + return TRUE; +} + +gboolean +gst_rdt_packet_move_to_next (GstRDTPacket * packet) +{ + g_return_val_if_fail (packet != NULL, FALSE); + g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, FALSE); + g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), FALSE); + + /* if we have an invalid packet, it must be the last, + * return FALSE */ + if (packet->type == GST_RDT_TYPE_INVALID) + goto end; + + /* move to next packet */ + packet->offset += packet->length; + + /* try to read new header */ + if (!read_packet_header (packet)) + goto end; + + return TRUE; + + /* ERRORS */ +end: + { + packet->type = GST_RDT_TYPE_INVALID; + return FALSE; + } +} + +GstRDTType +gst_rdt_packet_get_type (GstRDTPacket * packet) +{ + g_return_val_if_fail (packet != NULL, GST_RDT_TYPE_INVALID); + g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, + GST_RDT_TYPE_INVALID); + + return packet->type; +} + +guint16 +gst_rdt_packet_get_length (GstRDTPacket * packet) +{ + g_return_val_if_fail (packet != NULL, 0); + g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, 0); + + return packet->length; +} + +GstBuffer * +gst_rdt_packet_to_buffer (GstRDTPacket * packet) +{ + GstBuffer *result; + + g_return_val_if_fail (packet != NULL, NULL); + g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, NULL); + + result = + gst_buffer_copy_region (packet->buffer, GST_BUFFER_COPY_ALL, + packet->offset, packet->length); + /* timestamp applies to all packets in this buffer */ + GST_BUFFER_TIMESTAMP (result) = GST_BUFFER_TIMESTAMP (packet->buffer); + + return result; +} + +gint +gst_rdt_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2) +{ + return (gint16) (seqnum2 - seqnum1); +} + +guint16 +gst_rdt_packet_data_get_seq (GstRDTPacket * packet) +{ + GstMapInfo map; + guint header; + guint16 result; + + g_return_val_if_fail (packet != NULL, FALSE); + g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), FALSE); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + + /* skip header bits */ + header = packet->offset + 1; + + /* read seq_no */ + result = GST_READ_UINT16_BE (&map.data[header]); + + gst_buffer_unmap (packet->buffer, &map); + + return result; +} + +guint8 * +gst_rdt_packet_data_map (GstRDTPacket * packet, guint * size) +{ + GstMapInfo map; + guint header; + gboolean length_included_flag; + gboolean need_reliable_flag; + guint8 stream_id; + guint8 asm_rule_number; + + g_return_val_if_fail (packet != NULL, NULL); + g_return_val_if_fail (packet->map.data == NULL, NULL); + g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), NULL); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + + header = packet->offset; + + length_included_flag = (map.data[header] & 0x80) == 0x80; + need_reliable_flag = (map.data[header] & 0x40) == 0x40; + stream_id = (map.data[header] & 0x3e) >> 1; + + /* skip seq_no and header bits */ + header += 3; + + if (length_included_flag) { + /* skip length */ + header += 2; + } + asm_rule_number = (map.data[header] & 0x3f); + + /* skip timestamp and asm_rule_number */ + header += 5; + + if (stream_id == 0x1f) { + /* skip stream_id_expansion */ + header += 2; + } + if (need_reliable_flag) { + /* skip total_reliable */ + header += 2; + } + if (asm_rule_number == 63) { + /* skip asm_rule_number_expansion */ + header += 2; + } + + if (size) + *size = packet->length - (header - packet->offset); + + packet->map = map; + + return &map.data[header]; +} + +gboolean +gst_rdt_packet_data_unmap (GstRDTPacket * packet) +{ + g_return_val_if_fail (packet != NULL, FALSE); + g_return_val_if_fail (packet->map.data != NULL, FALSE); + + gst_buffer_unmap (packet->buffer, &packet->map); + packet->map.data = NULL; + + return TRUE; +} + +guint16 +gst_rdt_packet_data_get_stream_id (GstRDTPacket * packet) +{ + GstMapInfo map; + guint16 result; + guint header; + gboolean length_included_flag; + + g_return_val_if_fail (packet != NULL, 0); + g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + + header = packet->offset; + + length_included_flag = (map.data[header] & 0x80) == 0x80; + result = (map.data[header] & 0x3e) >> 1; + if (result == 31) { + /* skip seq_no and header bits */ + header += 3; + + if (length_included_flag) { + /* skip length */ + header += 2; + } + /* skip asm_rule_number and timestamp */ + header += 5; + + /* stream_id_expansion */ + result = GST_READ_UINT16_BE (&map.data[header]); + } + gst_buffer_unmap (packet->buffer, &map); + + return result; +} + +guint32 +gst_rdt_packet_data_get_timestamp (GstRDTPacket * packet) +{ + GstMapInfo map; + guint header; + gboolean length_included_flag; + guint32 result; + + g_return_val_if_fail (packet != NULL, 0); + g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + + header = packet->offset; + + length_included_flag = (map.data[header] & 0x80) == 0x80; + + /* skip seq_no and header bits */ + header += 3; + + if (length_included_flag) { + /* skip length */ + header += 2; + } + /* skip asm_rule_number */ + header += 1; + + /* get timestamp */ + result = GST_READ_UINT32_BE (&map.data[header]); + gst_buffer_unmap (packet->buffer, &map); + + return result; +} + +guint8 +gst_rdt_packet_data_get_flags (GstRDTPacket * packet) +{ + GstMapInfo map; + guint8 result; + guint header; + gboolean length_included_flag; + + g_return_val_if_fail (packet != NULL, 0); + g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); + + gst_buffer_map (packet->buffer, &map, GST_MAP_READ); + + header = packet->offset; + + length_included_flag = (map.data[header] & 0x80) == 0x80; + + /* skip seq_no and header bits */ + header += 3; + + if (length_included_flag) { + /* skip length */ + header += 2; + } + /* get flags */ + result = map.data[header]; + gst_buffer_unmap (packet->buffer, &map); + + return result; +} diff --git a/gst/realmedia/gstrdtbuffer.h b/gst/realmedia/gstrdtbuffer.h new file mode 100644 index 0000000000..fd1e067f83 --- /dev/null +++ b/gst/realmedia/gstrdtbuffer.h @@ -0,0 +1,121 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * gstrdtbuffer.h: various helper functions to manipulate buffers + * with RDT payload. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RDTBUFFER_H__ +#define __GST_RDTBUFFER_H__ + +#include + +G_BEGIN_DECLS +/** + * GstRDTType: + * @GST_RDT_TYPE_INVALID: + * @GST_RDT_TYPE_ASMACTION: + * @GST_RDT_TYPE_ACK: + * @GST_RDT_TYPE_RTTREQ: + * @GST_RDT_TYPE_RTTRESP: + * @GST_RDT_TYPE_CONGESTION: + * @GST_RDT_TYPE_STREAMEND: + * @GST_RDT_TYPE_LATENCY: + * @GST_RDT_TYPE_INFOREQ: + * @GST_RDT_TYPE_INFORESP: + * @GST_RDT_TYPE_AUTOBW: + * + * Different RDT packet types. + */ +typedef enum +{ + GST_RDT_TYPE_INVALID = 0xffff, + GST_RDT_TYPE_ASMACTION = 0xff00, + GST_RDT_TYPE_BWREPORT = 0xff01, + GST_RDT_TYPE_ACK = 0xff02, + GST_RDT_TYPE_RTTREQ = 0xff03, + GST_RDT_TYPE_RTTRESP = 0xff04, + GST_RDT_TYPE_CONGESTION = 0xff05, + GST_RDT_TYPE_STREAMEND = 0xff06, + GST_RDT_TYPE_REPORT = 0xff07, + GST_RDT_TYPE_LATENCY = 0xff08, + GST_RDT_TYPE_INFOREQ = 0xff09, + GST_RDT_TYPE_INFORESP = 0xff0a, + GST_RDT_TYPE_AUTOBW = 0xff0b +} GstRDTType; + +/** + * GST_RDT_IS_DATA_TYPE: + * @t: the #GstRDTType to check + * + * Check if @t is a data packet type. + */ +#define GST_RDT_IS_DATA_TYPE(t) ((t) < 0xff00) + +typedef struct _GstRDTPacket GstRDTPacket; + +/** + * GstRDTPacket: + * @buffer: pointer to RDT buffer + * @offset: offset of packet in buffer data + * + * Data structure that points to a packet at @offset in @buffer. + * The size of the structure is made public to allow stack allocations. + */ +struct _GstRDTPacket +{ + GstBuffer *buffer; + guint offset; + + /*< private >*/ + GstRDTType type; /* type of current packet */ + guint16 length; /* length of current packet in bytes */ + GstMapInfo map; /* last mapped data */ +}; + +/* validate buffers */ +gboolean gst_rdt_buffer_validate_data (guint8 *data, guint len); +gboolean gst_rdt_buffer_validate (GstBuffer *buffer); + +/* retrieving packets */ +guint gst_rdt_buffer_get_packet_count (GstBuffer *buffer); +gboolean gst_rdt_buffer_get_first_packet (GstBuffer *buffer, GstRDTPacket *packet); +gboolean gst_rdt_packet_move_to_next (GstRDTPacket *packet); + +/* working with packets */ +GstRDTType gst_rdt_packet_get_type (GstRDTPacket *packet); +guint16 gst_rdt_packet_get_length (GstRDTPacket *packet); +GstBuffer* gst_rdt_packet_to_buffer (GstRDTPacket *packet); + + +/* data packets */ +guint16 gst_rdt_packet_data_get_seq (GstRDTPacket *packet); +guint8 * gst_rdt_packet_data_map (GstRDTPacket *packet, guint *size); +gboolean gst_rdt_packet_data_unmap (GstRDTPacket *packet); +guint16 gst_rdt_packet_data_get_stream_id (GstRDTPacket *packet); +guint32 gst_rdt_packet_data_get_timestamp (GstRDTPacket *packet); + +guint8 gst_rdt_packet_data_get_flags (GstRDTPacket * packet); + +/* utils */ +gint gst_rdt_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2); + +G_END_DECLS + +#endif /* __GST_RDTBUFFER_H__ */ + diff --git a/gst/realmedia/meson.build b/gst/realmedia/meson.build new file mode 100644 index 0000000000..0ef65d3f13 --- /dev/null +++ b/gst/realmedia/meson.build @@ -0,0 +1,25 @@ +real_sources = [ + 'rademux.c', + 'rmdemux.c', + 'rmutils.c', + 'rdtdepay.c', + 'rdtmanager.c', + 'rtspreal.c', + 'realhash.c', + 'asmrules.c', + 'rdtjitterbuffer.c', + 'gstrdtbuffer.c', + 'pnmsrc.c', + 'realmedia.c' +] + +gstrmdemux = library('gstrealmedia', + real_sources, + c_args : ugly_args, + include_directories : [configinc, libsinc], + dependencies : [gstbase_dep, gstrtsp_dep, gstsdp_dep, gstpbutils_dep], + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstrmdemux, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstrmdemux] diff --git a/gst/realmedia/pnmsrc.c b/gst/realmedia/pnmsrc.c new file mode 100644 index 0000000000..07b25f42b0 --- /dev/null +++ b/gst/realmedia/pnmsrc.c @@ -0,0 +1,234 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "pnmsrc.h" + +GST_DEBUG_CATEGORY_STATIC (pnmsrc_debug); +#define GST_CAT_DEFAULT pnmsrc_debug + +/* PNMSrc signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_LOCATION NULL + +enum +{ + PROP_0, + PROP_LOCATION +}; + +static GstStaticPadTemplate gst_pnm_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/vnd.rn-realmedia") + ); + +static GstFlowReturn gst_pnm_src_create (GstPushSrc * psrc, GstBuffer ** buf); + +static void gst_pnm_src_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +#define gst_pnm_src_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstPNMSrc, gst_pnm_src, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_pnm_src_uri_handler_init)); +GST_ELEMENT_REGISTER_DEFINE (pnmsrc, "pnmsrc", + GST_RANK_MARGINAL, GST_TYPE_PNM_SRC); + +static void gst_pnm_src_finalize (GObject * object); + +static void gst_pnm_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pnm_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_pnm_src_class_init (GstPNMSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_pnm_src_set_property; + gobject_class->get_property = gst_pnm_src_get_property; + + gobject_class->finalize = gst_pnm_src_finalize; + + g_object_class_install_property (gobject_class, PROP_LOCATION, + g_param_spec_string ("location", "PNM Location", + "Location of the PNM url to read", + DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_pnm_src_template); + + gst_element_class_set_static_metadata (gstelement_class, + "PNM packet receiver", "Source/Network", + "Receive data over the network via PNM", + "Wim Taymans "); + + gstpushsrc_class->create = gst_pnm_src_create; + + GST_DEBUG_CATEGORY_INIT (pnmsrc_debug, "pnmsrc", + 0, "Source for the pnm:// uri"); +} + +static void +gst_pnm_src_init (GstPNMSrc * pnmsrc) +{ + pnmsrc->location = g_strdup (DEFAULT_LOCATION); +} + +static void +gst_pnm_src_finalize (GObject * object) +{ + GstPNMSrc *pnmsrc; + + pnmsrc = GST_PNM_SRC (object); + + g_free (pnmsrc->location); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_pnm_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstPNMSrc *src; + + src = GST_PNM_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + g_free (src->location); + src->location = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pnm_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstPNMSrc *src; + + src = GST_PNM_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + g_value_set_string (value, src->location); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstFlowReturn +gst_pnm_src_create (GstPushSrc * psrc, GstBuffer ** buf) +{ + GstPNMSrc *src; + GstMessage *m; + gchar *url; + + src = GST_PNM_SRC (psrc); + + if (src->location == NULL) + return GST_FLOW_ERROR; + url = g_strdup_printf ("rtsp%s", &src->location[3]); + + /* the only thing we do is redirect to an RTSP url */ + m = gst_message_new_element (GST_OBJECT_CAST (src), + gst_structure_new ("redirect", "new-location", G_TYPE_STRING, url, NULL)); + g_free (url); + + gst_element_post_message (GST_ELEMENT_CAST (src), m); + + + return GST_FLOW_EOS; +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_pnm_src_uri_get_type (GType type) +{ + return GST_URI_SRC; +} + +static const gchar *const * +gst_pnm_src_uri_get_protocols (GType type) +{ + static const gchar *protocols[] = { "pnm", NULL }; + + return protocols; +} + +static gchar * +gst_pnm_src_uri_get_uri (GstURIHandler * handler) +{ + GstPNMSrc *src = GST_PNM_SRC (handler); + + /* FIXME: make thread-safe */ + return g_strdup (src->location); +} + +static gboolean +gst_pnm_src_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) +{ + GstPNMSrc *src = GST_PNM_SRC (handler); + + g_free (src->location); + src->location = g_strdup (uri); + + return TRUE; +} + +static void +gst_pnm_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_pnm_src_uri_get_type; + iface->get_protocols = gst_pnm_src_uri_get_protocols; + iface->get_uri = gst_pnm_src_uri_get_uri; + iface->set_uri = gst_pnm_src_uri_set_uri; +} diff --git a/gst/realmedia/pnmsrc.h b/gst/realmedia/pnmsrc.h new file mode 100644 index 0000000000..3077226827 --- /dev/null +++ b/gst/realmedia/pnmsrc.h @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_PNM_SRC_H__ +#define __GST_PNM_SRC_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_PNM_SRC \ + (gst_pnm_src_get_type()) +#define GST_PNM_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PNM_SRC,GstPNMSrc)) +#define GST_PNM_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PNM_SRC,GstPNMSrcClass)) +#define GST_IS_PNM_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNM_SRC)) +#define GST_IS_PNM_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNM_SRC)) + +typedef struct _GstPNMSrc GstPNMSrc; +typedef struct _GstPNMSrcClass GstPNMSrcClass; + +struct _GstPNMSrc +{ + GstPushSrc parent; + + gchar *location; +}; + +struct _GstPNMSrcClass +{ + GstPushSrcClass parent_class; +}; + +GType gst_pnm_src_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (pnmsrc); + +G_END_DECLS + +#endif /* __GST_PNM_SRC_H__ */ diff --git a/gst/realmedia/rademux.c b/gst/realmedia/rademux.c new file mode 100644 index 0000000000..aface5007e --- /dev/null +++ b/gst/realmedia/rademux.c @@ -0,0 +1,1000 @@ +/* GStreamer RealAudio demuxer + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-rademux + * @title: rademux + * + * Demuxes/parses a RealAudio (.ra) file or stream into compressed audio. + * + * ## Example launch line + * |[ + * gst-launch-1.0 filesrc location=interview.ra ! rademux ! avdec_real_288 ! audioconvert ! audioresample ! autoaudiosink + * ]| Read a RealAudio file and decode it and output it to the soundcard using + * the ALSA element. The .ra file is assumed to contain RealAudio version 2. + * |[ + * gst-launch-1.0 souphttpsrc location=http://www.example.org/interview.ra ! rademux ! ac3parse ! a52dec ! audioconvert ! audioresample ! autoaudiosink + * ]| Stream RealAudio data containing AC3 (dnet) compressed audio and decode it + * and output it to the soundcard. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "rademux.h" +#include "rmdemux.h" +#include "rmutils.h" + +#include + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-pn-realaudio") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (real_audio_demux_debug); +#define GST_CAT_DEFAULT real_audio_demux_debug + +#define gst_real_audio_demux_parent_class parent_class +G_DEFINE_TYPE (GstRealAudioDemux, gst_real_audio_demux, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (rademux, "rademux", + GST_RANK_SECONDARY, GST_TYPE_REAL_AUDIO_DEMUX); + +static GstStateChangeReturn gst_real_audio_demux_change_state (GstElement * e, + GstStateChange transition); +static GstFlowReturn gst_real_audio_demux_chain (GstPad * pad, + GstObject * parent, GstBuffer * buf); +static gboolean gst_real_audio_demux_sink_event (GstPad * pad, + GstObject * parent, GstEvent * ev); +static gboolean gst_real_audio_demux_src_event (GstPad * pad, + GstObject * parent, GstEvent * ev); +static gboolean gst_real_audio_demux_src_query (GstPad * pad, + GstObject * parent, GstQuery * query); +static void gst_real_audio_demux_loop (GstRealAudioDemux * demux); +static gboolean gst_real_audio_demux_sink_activate (GstPad * sinkpad, + GstObject * parent); +static gboolean gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad, + GstObject * parent, GstPadMode mode, gboolean active); + +static void +gst_real_audio_demux_finalize (GObject * obj) +{ + GstRealAudioDemux *demux = GST_REAL_AUDIO_DEMUX (obj); + + g_object_unref (demux->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_real_audio_demux_class_init (GstRealAudioDemuxClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_real_audio_demux_finalize; + + gst_element_class_add_static_pad_template (gstelement_class, &sink_template); + gst_element_class_add_static_pad_template (gstelement_class, &src_template); + + gst_element_class_set_static_metadata (gstelement_class, "RealAudio Demuxer", + "Codec/Demuxer", + "Demultiplex a RealAudio file", + "Tim-Philipp Müller "); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_real_audio_demux_change_state); + + GST_DEBUG_CATEGORY_INIT (real_audio_demux_debug, "rademux", + 0, "Demuxer for RealAudio streams"); +} + +static void +gst_real_audio_demux_reset (GstRealAudioDemux * demux) +{ + gst_adapter_clear (demux->adapter); + + if (demux->srcpad) { + GST_DEBUG_OBJECT (demux, "Removing source pad"); + gst_element_remove_pad (GST_ELEMENT (demux), demux->srcpad); + demux->srcpad = NULL; + } + + if (demux->pending_tags) { + gst_tag_list_unref (demux->pending_tags); + demux->pending_tags = NULL; + } + + demux->state = REAL_AUDIO_DEMUX_STATE_MARKER; + demux->ra_version = 0; + demux->data_offset = 0; + demux->packet_size = 0; + + demux->sample_rate = 0; + demux->sample_width = 0; + demux->channels = 0; + demux->fourcc = 0; + + demux->need_newsegment = TRUE; + + demux->segment_running = FALSE; + + demux->byterate_num = 0; + demux->byterate_denom = 0; + + demux->duration = 0; + demux->upstream_size = 0; + + demux->offset = 0; + + demux->have_group_id = FALSE; + demux->group_id = G_MAXUINT; + + gst_adapter_clear (demux->adapter); +} + +static void +gst_real_audio_demux_init (GstRealAudioDemux * demux) +{ + demux->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + + gst_pad_set_chain_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_chain)); + gst_pad_set_event_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_event)); + gst_pad_set_activate_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate)); + gst_pad_set_activatemode_function (demux->sinkpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_sink_activate_mode)); + + gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); + + demux->adapter = gst_adapter_new (); + gst_real_audio_demux_reset (demux); +} + +static gboolean +gst_real_audio_demux_sink_activate (GstPad * sinkpad, GstObject * parent) +{ + GstQuery *query; + gboolean pull_mode; + + query = gst_query_new_scheduling (); + + if (!gst_pad_peer_query (sinkpad, query)) { + gst_query_unref (query); + goto activate_push; + } + + pull_mode = gst_query_has_scheduling_mode_with_flags (query, + GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); + gst_query_unref (query); + + if (!pull_mode) + goto activate_push; + + GST_DEBUG_OBJECT (sinkpad, "activating pull"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); + +activate_push: + { + GST_DEBUG_OBJECT (sinkpad, "activating push"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); + } +} + +static gboolean +gst_real_audio_demux_sink_activate_mode (GstPad * sinkpad, GstObject * parent, + GstPadMode mode, gboolean active) +{ + gboolean res; + GstRealAudioDemux *demux; + + demux = GST_REAL_AUDIO_DEMUX (parent); + + switch (mode) { + case GST_PAD_MODE_PUSH: + demux->seekable = FALSE; + res = TRUE; + break; + case GST_PAD_MODE_PULL: + if (active) { + demux->seekable = TRUE; + + res = gst_pad_start_task (sinkpad, + (GstTaskFunction) gst_real_audio_demux_loop, demux, NULL); + } else { + demux->seekable = FALSE; + res = gst_pad_stop_task (sinkpad); + } + break; + default: + res = FALSE; + break; + } + return res; +} + +static GstFlowReturn +gst_real_audio_demux_parse_marker (GstRealAudioDemux * demux) +{ + guint8 data[6]; + + if (gst_adapter_available (demux->adapter) < 6) { + GST_LOG_OBJECT (demux, "need at least 6 bytes, waiting for more data"); + return GST_FLOW_OK; + } + + gst_adapter_copy (demux->adapter, data, 0, 6); + if (memcmp (data, ".ra\375", 4) != 0) + goto wrong_format; + + demux->ra_version = GST_READ_UINT16_BE (data + 4); + GST_DEBUG_OBJECT (demux, "ra_version = %u", demux->ra_version); + if (demux->ra_version != 4 && demux->ra_version != 3) + goto unsupported_ra_version; + + gst_adapter_flush (demux->adapter, 6); + demux->state = REAL_AUDIO_DEMUX_STATE_HEADER; + return GST_FLOW_OK; + +/* ERRORS */ +wrong_format: + { + GST_ELEMENT_ERROR (GST_ELEMENT (demux), STREAM, WRONG_TYPE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } + +unsupported_ra_version: + { + GST_ELEMENT_ERROR (GST_ELEMENT (demux), STREAM, DECODE, + ("Cannot decode this RealAudio file, please file a bug"), + ("ra_version = %u", demux->ra_version)); + return GST_FLOW_ERROR; + } +} + +static GstClockTime +gst_real_demux_get_timestamp_from_offset (GstRealAudioDemux * demux, + guint64 offset) +{ + if (offset >= demux->data_offset && demux->byterate_num > 0 && + demux->byterate_denom > 0) { + return gst_util_uint64_scale (offset - demux->data_offset, + demux->byterate_denom * GST_SECOND, demux->byterate_num); + } else if (offset == demux->data_offset) { + return (GstClockTime) 0; + } else { + return GST_CLOCK_TIME_NONE; + } +} + +static gboolean +gst_real_audio_demux_get_data_offset_from_header (GstRealAudioDemux * demux) +{ + guint8 data[16]; + + gst_adapter_copy (demux->adapter, data, 0, 16); + + switch (demux->ra_version) { + case 3: + demux->data_offset = GST_READ_UINT16_BE (data) + 8; + break; + case 4: + demux->data_offset = GST_READ_UINT32_BE (data + 12) + 16; + break; + default: + demux->data_offset = 0; + g_return_val_if_reached (FALSE); + } + + return TRUE; +} + +static GstFlowReturn +gst_real_audio_demux_parse_header (GstRealAudioDemux * demux) +{ + const guint8 *data; + gchar *codec_name = NULL; + GstCaps *caps = NULL; + GstEvent *event; + gchar *stream_id; + guint avail; + + g_assert (demux->ra_version == 4 || demux->ra_version == 3); + + avail = gst_adapter_available (demux->adapter); + if (avail < 16) + return GST_FLOW_OK; + + if (!gst_real_audio_demux_get_data_offset_from_header (demux)) + return GST_FLOW_ERROR; /* shouldn't happen */ + + GST_DEBUG_OBJECT (demux, "data_offset = %u", demux->data_offset); + + if (avail + 6 < demux->data_offset) { + GST_DEBUG_OBJECT (demux, "Need %u bytes, but only %u available now", + demux->data_offset - 6, avail); + return GST_FLOW_OK; + } + + data = gst_adapter_map (demux->adapter, demux->data_offset - 6); + g_assert (data); + + switch (demux->ra_version) { + case 3: + demux->fourcc = GST_RM_AUD_14_4; + demux->packet_size = 20; + demux->sample_rate = 8000; + demux->channels = 1; + demux->sample_width = 16; + demux->flavour = 1; + demux->leaf_size = 0; + demux->height = 0; + break; + case 4: + demux->flavour = GST_READ_UINT16_BE (data + 16); + /* demux->frame_size = GST_READ_UINT32_BE (data + 36); */ + demux->leaf_size = GST_READ_UINT16_BE (data + 38); + demux->height = GST_READ_UINT16_BE (data + 34); + demux->packet_size = GST_READ_UINT32_BE (data + 18); + demux->sample_rate = GST_READ_UINT16_BE (data + 42); + demux->sample_width = GST_READ_UINT16_BE (data + 46); + demux->channels = GST_READ_UINT16_BE (data + 48); + demux->fourcc = GST_READ_UINT32_LE (data + 56); + demux->pending_tags = gst_rm_utils_read_tags (data + 63, + demux->data_offset - 63, gst_rm_utils_read_string8); + if (demux->pending_tags) + gst_tag_list_set_scope (demux->pending_tags, GST_TAG_SCOPE_GLOBAL); + break; + default: + g_assert_not_reached (); +#if 0 + case 5: + demux->flavour = GST_READ_UINT16_BE (data + 16); + /* demux->frame_size = GST_READ_UINT32_BE (data + 36); */ + demux->leaf_size = GST_READ_UINT16_BE (data + 38); + demux->height = GST_READ_UINT16_BE (data + 34); + + demux->sample_rate = GST_READ_UINT16_BE (data + 48); + demux->sample_width = GST_READ_UINT16_BE (data + 52); + demux->n_channels = GST_READ_UINT16_BE (data + 54); + demux->fourcc = RMDEMUX_FOURCC_GET (data + 60); + break; +#endif + } + + GST_INFO_OBJECT (demux, "packet_size = %u", demux->packet_size); + GST_INFO_OBJECT (demux, "sample_rate = %u", demux->sample_rate); + GST_INFO_OBJECT (demux, "sample_width = %u", demux->sample_width); + GST_INFO_OBJECT (demux, "channels = %u", demux->channels); + GST_INFO_OBJECT (demux, "fourcc = '%" GST_FOURCC_FORMAT "' (%08X)", + GST_FOURCC_ARGS (demux->fourcc), demux->fourcc); + + switch (demux->fourcc) { + case GST_RM_AUD_14_4: + caps = gst_caps_new_simple ("audio/x-pn-realaudio", "raversion", + G_TYPE_INT, 1, NULL); + demux->byterate_num = 1000; + demux->byterate_denom = 1; + break; + + case GST_RM_AUD_28_8: + /* FIXME: needs descrambling */ + caps = gst_caps_new_simple ("audio/x-pn-realaudio", "raversion", + G_TYPE_INT, 2, NULL); + break; + + case GST_RM_AUD_DNET: + caps = gst_caps_new_simple ("audio/x-ac3", "rate", G_TYPE_INT, + demux->sample_rate, NULL); + if (demux->packet_size == 0 || demux->sample_rate == 0) + goto broken_file; + demux->byterate_num = demux->packet_size * demux->sample_rate; + demux->byterate_denom = 1536; + break; + + /* Sipro/ACELP.NET Voice Codec (MIME unknown) */ + case GST_RM_AUD_SIPR: + caps = gst_caps_new_empty_simple ("audio/x-sipro"); + break; + + default: + GST_WARNING_OBJECT (demux, "unknown fourcc %08X", demux->fourcc); + break; + } + + if (caps == NULL) + goto unknown_fourcc; + + gst_caps_set_simple (caps, + "flavor", G_TYPE_INT, demux->flavour, + "rate", G_TYPE_INT, demux->sample_rate, + "channels", G_TYPE_INT, demux->channels, + "width", G_TYPE_INT, demux->sample_width, + "leaf_size", G_TYPE_INT, demux->leaf_size, + "packet_size", G_TYPE_INT, demux->packet_size, + "height", G_TYPE_INT, demux->height, NULL); + + GST_INFO_OBJECT (demux, "Adding source pad, caps %" GST_PTR_FORMAT, caps); + demux->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_pad_set_event_function (demux->srcpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_src_event)); + gst_pad_set_query_function (demux->srcpad, + GST_DEBUG_FUNCPTR (gst_real_audio_demux_src_query)); + gst_pad_set_active (demux->srcpad, TRUE); + gst_pad_use_fixed_caps (demux->srcpad); + + stream_id = + gst_pad_create_stream_id (demux->srcpad, GST_ELEMENT_CAST (demux), NULL); + + event = gst_pad_get_sticky_event (demux->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &demux->group_id)) + demux->have_group_id = TRUE; + else + demux->have_group_id = FALSE; + gst_event_unref (event); + } else if (!demux->have_group_id) { + demux->have_group_id = TRUE; + demux->group_id = gst_util_group_id_next (); + } + + event = gst_event_new_stream_start (stream_id); + if (demux->have_group_id) + gst_event_set_group_id (event, demux->group_id); + + gst_pad_push_event (demux->srcpad, event); + g_free (stream_id); + + gst_pad_set_caps (demux->srcpad, caps); + codec_name = gst_pb_utils_get_codec_description (caps); + gst_caps_unref (caps); + + gst_element_add_pad (GST_ELEMENT (demux), demux->srcpad); + + if (demux->byterate_num > 0 && demux->byterate_denom > 0) { + GstFormat bformat = GST_FORMAT_BYTES; + gint64 size_bytes = 0; + + GST_INFO_OBJECT (demux, "byte rate = %u/%u = %u bytes/sec", + demux->byterate_num, demux->byterate_denom, + demux->byterate_num / demux->byterate_denom); + + if (gst_pad_peer_query_duration (demux->sinkpad, bformat, &size_bytes)) { + demux->duration = + gst_real_demux_get_timestamp_from_offset (demux, size_bytes); + demux->upstream_size = size_bytes; + GST_INFO_OBJECT (demux, "upstream_size = %" G_GUINT64_FORMAT, + demux->upstream_size); + GST_INFO_OBJECT (demux, "duration = %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->duration)); + } + } + + demux->need_newsegment = TRUE; + + if (codec_name) { + if (demux->pending_tags == NULL) { + demux->pending_tags = gst_tag_list_new_empty (); + gst_tag_list_set_scope (demux->pending_tags, GST_TAG_SCOPE_GLOBAL); + } + + gst_tag_list_add (demux->pending_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec_name, NULL); + g_free (codec_name); + } + + gst_adapter_unmap (demux->adapter); + gst_adapter_flush (demux->adapter, demux->data_offset - 6); + + demux->state = REAL_AUDIO_DEMUX_STATE_DATA; + demux->need_newsegment = TRUE; + + return GST_FLOW_OK; + +/* ERRORS */ +unknown_fourcc: + { + GST_ELEMENT_ERROR (GST_ELEMENT (demux), STREAM, DECODE, (NULL), + ("Unknown fourcc '0x%" G_GINT32_MODIFIER "x'", demux->fourcc)); + return GST_FLOW_ERROR; + } +broken_file: + { + GST_ELEMENT_ERROR (GST_ELEMENT (demux), STREAM, DECODE, (NULL), + ("Broken file - invalid sample_rate or other header value")); + return GST_FLOW_ERROR; + } + +} + +static GstFlowReturn +gst_real_audio_demux_parse_data (GstRealAudioDemux * demux) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint avail, unit_size; + + avail = gst_adapter_available (demux->adapter); + + if (demux->packet_size > 0) + unit_size = demux->packet_size; + else + unit_size = avail & 0xfffffff0; /* round down to next multiple of 16 */ + + GST_LOG_OBJECT (demux, "available = %u, unit_size = %u", avail, unit_size); + + while (ret == GST_FLOW_OK && unit_size > 0 && avail >= unit_size) { + GstClockTime ts; + GstBuffer *buf; + + buf = gst_adapter_take_buffer (demux->adapter, unit_size); + avail -= unit_size; + + if (demux->need_newsegment) { + gst_pad_push_event (demux->srcpad, + gst_event_new_segment (&demux->segment)); + demux->need_newsegment = FALSE; + } + + if (demux->pending_tags) { + gst_pad_push_event (demux->srcpad, + gst_event_new_tag (demux->pending_tags)); + demux->pending_tags = NULL; + } + + if (demux->fourcc == GST_RM_AUD_DNET) { + buf = gst_rm_utils_descramble_dnet_buffer (buf); + } + + ts = gst_real_demux_get_timestamp_from_offset (demux, demux->offset); + GST_BUFFER_TIMESTAMP (buf) = ts; + + demux->segment.position = ts; + + ret = gst_pad_push (demux->srcpad, buf); + } + + return ret; +} + +static GstFlowReturn +gst_real_audio_demux_handle_buffer (GstRealAudioDemux * demux, GstBuffer * buf) +{ + GstFlowReturn ret; + + gst_adapter_push (demux->adapter, buf); + buf = NULL; + + switch (demux->state) { + case REAL_AUDIO_DEMUX_STATE_MARKER:{ + ret = gst_real_audio_demux_parse_marker (demux); + if (ret != GST_FLOW_OK || demux->state != REAL_AUDIO_DEMUX_STATE_HEADER) + break; + /* otherwise fall through */ + } + case REAL_AUDIO_DEMUX_STATE_HEADER:{ + ret = gst_real_audio_demux_parse_header (demux); + if (ret != GST_FLOW_OK || demux->state != REAL_AUDIO_DEMUX_STATE_DATA) + break; + /* otherwise fall through */ + } + case REAL_AUDIO_DEMUX_STATE_DATA:{ + ret = gst_real_audio_demux_parse_data (demux); + break; + } + default: + g_return_val_if_reached (GST_FLOW_ERROR); + } + + return ret; +} + +static GstFlowReturn +gst_real_audio_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstRealAudioDemux *demux; + + demux = GST_REAL_AUDIO_DEMUX (parent); + + return gst_real_audio_demux_handle_buffer (demux, buf); +} + +static void +gst_real_audio_demux_loop (GstRealAudioDemux * demux) +{ + GstFlowReturn ret; + GstBuffer *buf; + guint bytes_needed; + + /* check how much data we need */ + switch (demux->state) { + case REAL_AUDIO_DEMUX_STATE_MARKER: + bytes_needed = 6 + 16; /* 16 are beginning of header */ + break; + case REAL_AUDIO_DEMUX_STATE_HEADER: + if (!gst_real_audio_demux_get_data_offset_from_header (demux)) + goto parse_header_error; + bytes_needed = demux->data_offset - (6 + 16); + break; + case REAL_AUDIO_DEMUX_STATE_DATA: + if (demux->packet_size > 0) { + /* TODO: should probably take into account width/height as well? */ + bytes_needed = demux->packet_size; + } else { + bytes_needed = 1024; + } + break; + default: + g_return_if_reached (); + } + + /* now get the data */ + GST_LOG_OBJECT (demux, "getting data: %5u bytes @ %8" G_GINT64_MODIFIER "u", + bytes_needed, demux->offset); + + if (demux->upstream_size > 0 && demux->offset >= demux->upstream_size) + goto eos; + + buf = NULL; + ret = gst_pad_pull_range (demux->sinkpad, demux->offset, bytes_needed, &buf); + + if (ret != GST_FLOW_OK) + goto pull_range_error; + + if (gst_buffer_get_size (buf) != bytes_needed) + goto pull_range_short_read; + + ret = gst_real_audio_demux_handle_buffer (demux, buf); + if (ret != GST_FLOW_OK) + goto handle_flow_error; + + /* TODO: increase this in chain function too (for timestamps)? */ + demux->offset += bytes_needed; + + /* check for the end of the segment */ + if (demux->segment.stop != -1 && demux->segment.position != -1 && + demux->segment.position > demux->segment.stop) { + GST_DEBUG_OBJECT (demux, "reached end of segment"); + goto eos; + } + + return; + +/* ERRORS */ +parse_header_error: + { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), (NULL)); + goto pause_task; + } +handle_flow_error: + { + GST_WARNING_OBJECT (demux, "handle_buf flow: %s", gst_flow_get_name (ret)); + goto pause_task; + } +pull_range_error: + { + GST_WARNING_OBJECT (demux, "pull range flow: %s", gst_flow_get_name (ret)); + goto pause_task; + } +pull_range_short_read: + { + GST_WARNING_OBJECT (demux, "pull range short read: wanted %u bytes, but " + "got only %" G_GSIZE_FORMAT " bytes", bytes_needed, + gst_buffer_get_size (buf)); + gst_buffer_unref (buf); + goto eos; + } +eos: + { + if (demux->state != REAL_AUDIO_DEMUX_STATE_DATA) { + GST_WARNING_OBJECT (demux, "reached EOS before finished parsing header"); + goto parse_header_error; + } + GST_INFO_OBJECT (demux, "EOS"); + if ((demux->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0) { + gint64 stop; + + /* for segment playback we need to post when (in stream time) + * we stopped, this is either stop (when set) or the duration. */ + if ((stop = demux->segment.stop) == -1) + stop = demux->segment.duration; + + GST_DEBUG_OBJECT (demux, "sending segment done, at end of segment"); + gst_element_post_message (GST_ELEMENT (demux), + gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME, + stop)); + gst_pad_push_event (demux->srcpad, + gst_event_new_segment_done (GST_FORMAT_TIME, stop)); + } else { + /* normal playback, send EOS event downstream */ + GST_DEBUG_OBJECT (demux, "sending EOS event, at end of stream"); + gst_pad_push_event (demux->srcpad, gst_event_new_eos ()); + } + goto pause_task; + } +pause_task: + { + demux->segment_running = FALSE; + gst_pad_pause_task (demux->sinkpad); + GST_DEBUG_OBJECT (demux, "pausing task"); + return; + } +} + +static gboolean +gst_real_audio_demux_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + GstRealAudioDemux *demux; + gboolean ret; + + demux = GST_REAL_AUDIO_DEMUX (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEGMENT:{ + /* FIXME */ + gst_event_unref (event); + demux->need_newsegment = TRUE; + ret = TRUE; + break; + } + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + return ret; +} + +static gboolean +gst_real_audio_demux_handle_seek (GstRealAudioDemux * demux, GstEvent * event) +{ + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gboolean flush, update; + gdouble rate; + guint64 seek_pos; + gint64 cur, stop; + + if (!demux->seekable) + goto not_seekable; + + if (demux->byterate_num == 0 || demux->byterate_denom == 0) + goto no_bitrate; + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + if (format != GST_FORMAT_TIME) + goto only_time_format_supported; + + if (rate <= 0.0) + goto cannot_do_backwards_playback; + + flush = ((flags & GST_SEEK_FLAG_FLUSH) != 0); + + GST_DEBUG_OBJECT (demux, "flush=%d, rate=%g", flush, rate); + + /* unlock streaming thread and make streaming stop */ + if (flush) { + gst_pad_push_event (demux->sinkpad, gst_event_new_flush_start ()); + gst_pad_push_event (demux->srcpad, gst_event_new_flush_start ()); + } else { + gst_pad_pause_task (demux->sinkpad); + } + + GST_PAD_STREAM_LOCK (demux->sinkpad); + + gst_segment_do_seek (&demux->segment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + + GST_DEBUG_OBJECT (demux, "segment: %" GST_SEGMENT_FORMAT, &demux->segment); + + seek_pos = gst_util_uint64_scale (demux->segment.start, + demux->byterate_num, demux->byterate_denom * GST_SECOND); + if (demux->packet_size > 0) { + seek_pos -= seek_pos % demux->packet_size; + } + seek_pos += demux->data_offset; + + GST_DEBUG_OBJECT (demux, "seek_pos = %" G_GUINT64_FORMAT, seek_pos); + + /* stop flushing */ + gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop (TRUE)); + gst_pad_push_event (demux->srcpad, gst_event_new_flush_stop (TRUE)); + + demux->offset = seek_pos; + demux->need_newsegment = TRUE; + + /* notify start of new segment */ + if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT (demux), + gst_message_new_segment_start (GST_OBJECT (demux), + GST_FORMAT_TIME, demux->segment.position)); + } + + demux->segment_running = TRUE; + /* restart our task since it might have been stopped when we did the flush */ + gst_pad_start_task (demux->sinkpad, + (GstTaskFunction) gst_real_audio_demux_loop, demux, NULL); + + /* streaming can continue now */ + GST_PAD_STREAM_UNLOCK (demux->sinkpad); + + return TRUE; + +/* ERRORS */ +not_seekable: + { + GST_DEBUG_OBJECT (demux, "seek failed: cannot seek in streaming mode"); + return FALSE; + } +no_bitrate: + { + GST_DEBUG_OBJECT (demux, "seek failed: bitrate unknown"); + return FALSE; + } +only_time_format_supported: + { + GST_DEBUG_OBJECT (demux, "can only seek in TIME format"); + return FALSE; + } +cannot_do_backwards_playback: + { + GST_DEBUG_OBJECT (demux, "can only seek with positive rate, not %lf", rate); + return FALSE; + } +} + +static gboolean +gst_real_audio_demux_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + GstRealAudioDemux *demux; + gboolean ret = FALSE; + + demux = GST_REAL_AUDIO_DEMUX (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + gst_event_unref (event); + break; + case GST_EVENT_SEEK: + ret = gst_real_audio_demux_handle_seek (demux, event); + gst_event_unref (event); + break; + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; +} + +static gboolean +gst_real_audio_demux_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + GstRealAudioDemux *demux; + gboolean ret = FALSE; + + demux = GST_REAL_AUDIO_DEMUX (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION:{ + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + if (format == GST_FORMAT_TIME && demux->duration > 0) { + gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration); + ret = TRUE; + } else if (format == GST_FORMAT_BYTES && demux->upstream_size > 0) { + gst_query_set_duration (query, GST_FORMAT_BYTES, + demux->upstream_size - demux->data_offset); + ret = TRUE; + } + break; + } + case GST_QUERY_SEEKING:{ + GstFormat format; + gboolean seekable; + + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + seekable = (format == GST_FORMAT_TIME && demux->seekable); + gst_query_set_seeking (query, format, seekable, 0, + (format == GST_FORMAT_TIME) ? demux->duration : -1); + ret = TRUE; + break; + } + case GST_QUERY_SEGMENT: + { + GstFormat format; + gint64 start, stop; + + format = demux->segment.format; + + start = + gst_segment_to_stream_time (&demux->segment, format, + demux->segment.start); + if ((stop = demux->segment.stop) == -1) + stop = demux->segment.duration; + else + stop = gst_segment_to_stream_time (&demux->segment, format, stop); + + gst_query_set_segment (query, demux->segment.rate, format, start, stop); + ret = TRUE; + break; + } + default: + ret = gst_pad_query_default (pad, parent, query); + break; + } + + return ret; +} + +static GstStateChangeReturn +gst_real_audio_demux_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstRealAudioDemux *demux = GST_REAL_AUDIO_DEMUX (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + demux->state = REAL_AUDIO_DEMUX_STATE_MARKER; + demux->segment_running = FALSE; + gst_segment_init (&demux->segment, GST_FORMAT_TIME); + gst_adapter_clear (demux->adapter); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY:{ + gst_real_audio_demux_reset (demux); + gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); + break; + } + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} diff --git a/gst/realmedia/rademux.h b/gst/realmedia/rademux.h new file mode 100644 index 0000000000..666a1e64ac --- /dev/null +++ b/gst/realmedia/rademux.h @@ -0,0 +1,104 @@ +/* GStreamer RealAudio demuxer + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_REAL_AUDIO_DEMUX_H__ +#define __GST_REAL_AUDIO_DEMUX_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_REAL_AUDIO_DEMUX \ + (gst_real_audio_demux_get_type()) +#define GST_REAL_AUDIO_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_REAL_AUDIO_DEMUX,GstRealAudioDemux)) +#define GST_REAL_AUDIO_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_REAL_AUDIO_DEMUX,GstRealAudioDemuxClass)) +#define GST_IS_REAL_AUDIO_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_REAL_AUDIO_DEMUX)) +#define GST_IS_REAL_AUDIO_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_REAL_AUDIO_DEMUX)) + +typedef enum +{ + REAL_AUDIO_DEMUX_STATE_MARKER, + REAL_AUDIO_DEMUX_STATE_HEADER, + REAL_AUDIO_DEMUX_STATE_DATA +} GstRealAudioDemuxState; + +typedef struct _GstRealAudioDemux GstRealAudioDemux; +typedef struct _GstRealAudioDemuxClass GstRealAudioDemuxClass; + +struct _GstRealAudioDemux { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + gboolean have_group_id; + guint group_id; + + GstAdapter *adapter; + GstRealAudioDemuxState state; + + guint ra_version; + guint data_offset; + + guint packet_size; + guint leaf_size; + guint height; + guint flavour; + + guint sample_rate; + guint sample_width; + guint channels; + guint32 fourcc; + + gboolean segment_running; + + gboolean need_newsegment; + GstTagList *pending_tags; + + guint byterate_num; /* bytes per second */ + guint byterate_denom; + + gint64 duration; + gint64 upstream_size; + + guint64 offset; /* current read byte offset for + * pull_range-based mode */ + + /* playback start/stop positions */ + GstSegment segment; + + gboolean seekable; +}; + +struct _GstRealAudioDemuxClass { + GstElementClass element_class; +}; + +GType gst_real_audio_demux_get_type (void); + +GST_ELEMENT_REGISTER_DECLARE (rademux); + +G_END_DECLS + +#endif /* __GST_REAL_AUDIO_DEMUX_H__ */ diff --git a/gst/realmedia/rdtdepay.c b/gst/realmedia/rdtdepay.c new file mode 100644 index 0000000000..f0612e742e --- /dev/null +++ b/gst/realmedia/rdtdepay.c @@ -0,0 +1,496 @@ +/* GStreamer + * Copyright (C) <2006> Lutz Mueller + * <2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "gstrdtbuffer.h" +#include "rdtdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rdtdepay_debug); +#define GST_CAT_DEFAULT rdtdepay_debug + +/* RDTDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, +}; + +static GstStaticPadTemplate gst_rdt_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/vnd.rn-realmedia") + ); + +static GstStaticPadTemplate gst_rdt_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rdt, " + "media = (string) \"application\", " + "clock-rate = (int) [1, MAX ], " + "encoding-name = (string) \"X-REAL-RDT\"" + /* All optional parameters + * + * "config=" + */ + ) + ); + +#define gst_rdt_depay_parent_class parent_class +G_DEFINE_TYPE (GstRDTDepay, gst_rdt_depay, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (rdtdepay, "rdtdepay", + GST_RANK_MARGINAL, GST_TYPE_RDT_DEPAY); + +static void gst_rdt_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rdt_depay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rdt_depay_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static GstFlowReturn gst_rdt_depay_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); + +static void +gst_rdt_depay_class_init (GstRDTDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_rdt_depay_finalize; + + gstelement_class->change_state = gst_rdt_depay_change_state; + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_depay_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_depay_sink_template); + + gst_element_class_set_static_metadata (gstelement_class, "RDT packet parser", + "Codec/Depayloader/Network", + "Extracts RealMedia from RDT packets", + "Lutz Mueller , " + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rdtdepay_debug, "rdtdepay", + 0, "Depayloader for RDT RealMedia packets"); +} + +static void +gst_rdt_depay_init (GstRDTDepay * rdtdepay) +{ + rdtdepay->sinkpad = + gst_pad_new_from_static_template (&gst_rdt_depay_sink_template, "sink"); + gst_pad_set_chain_function (rdtdepay->sinkpad, gst_rdt_depay_chain); + gst_pad_set_event_function (rdtdepay->sinkpad, gst_rdt_depay_sink_event); + gst_element_add_pad (GST_ELEMENT_CAST (rdtdepay), rdtdepay->sinkpad); + + rdtdepay->srcpad = + gst_pad_new_from_static_template (&gst_rdt_depay_src_template, "src"); + gst_element_add_pad (GST_ELEMENT_CAST (rdtdepay), rdtdepay->srcpad); +} + +static void +gst_rdt_depay_finalize (GObject * object) +{ + GstRDTDepay *rdtdepay; + + rdtdepay = GST_RDT_DEPAY (object); + + if (rdtdepay->header) + gst_buffer_unref (rdtdepay->header); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rdt_depay_setcaps (GstPad * pad, GstCaps * caps) +{ + GstStructure *structure; + GstRDTDepay *rdtdepay; + GstCaps *srccaps; + gint clock_rate = 1000; /* default */ + const GValue *value; + GstBuffer *header; + + rdtdepay = GST_RDT_DEPAY (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + if (gst_structure_has_field (structure, "clock-rate")) + gst_structure_get_int (structure, "clock-rate", &clock_rate); + + /* config contains the RealMedia header as a buffer. */ + value = gst_structure_get_value (structure, "config"); + if (!value) + goto no_header; + + header = gst_value_get_buffer (value); + if (!header) + goto no_header; + + /* get other values for newsegment */ + value = gst_structure_get_value (structure, "npt-start"); + if (value && G_VALUE_HOLDS_UINT64 (value)) + rdtdepay->npt_start = g_value_get_uint64 (value); + else + rdtdepay->npt_start = 0; + GST_DEBUG_OBJECT (rdtdepay, "NPT start %" G_GUINT64_FORMAT, + rdtdepay->npt_start); + + value = gst_structure_get_value (structure, "npt-stop"); + if (value && G_VALUE_HOLDS_UINT64 (value)) + rdtdepay->npt_stop = g_value_get_uint64 (value); + else + rdtdepay->npt_stop = -1; + + GST_DEBUG_OBJECT (rdtdepay, "NPT stop %" G_GUINT64_FORMAT, + rdtdepay->npt_stop); + + value = gst_structure_get_value (structure, "play-speed"); + if (value && G_VALUE_HOLDS_DOUBLE (value)) + rdtdepay->play_speed = g_value_get_double (value); + else + rdtdepay->play_speed = 1.0; + + value = gst_structure_get_value (structure, "play-scale"); + if (value && G_VALUE_HOLDS_DOUBLE (value)) + rdtdepay->play_scale = g_value_get_double (value); + else + rdtdepay->play_scale = 1.0; + + /* caps seem good, configure element */ + rdtdepay->clock_rate = clock_rate; + + /* set caps on pad and on header */ + srccaps = gst_caps_new_empty_simple ("application/vnd.rn-realmedia"); + gst_pad_set_caps (rdtdepay->srcpad, srccaps); + gst_caps_unref (srccaps); + + if (rdtdepay->header) + gst_buffer_unref (rdtdepay->header); + rdtdepay->header = gst_buffer_ref (header); + + return TRUE; + + /* ERRORS */ +no_header: + { + GST_ERROR_OBJECT (rdtdepay, "no header found in caps, no 'config' field"); + return FALSE; + } +} + +static gboolean +gst_rdt_depay_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstRDTDepay *depay; + gboolean res = TRUE; + + depay = GST_RDT_DEPAY (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_rdt_depay_setcaps (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_FLUSH_STOP: + res = gst_pad_push_event (depay->srcpad, event); + + gst_segment_init (&depay->segment, GST_FORMAT_UNDEFINED); + depay->need_newsegment = TRUE; + depay->next_seqnum = -1; + break; + case GST_EVENT_SEGMENT: + { + gst_event_copy_segment (event, &depay->segment); + /* don't pass the event downstream, we generate our own segment + * including the NTP time and other things we receive in caps */ + gst_event_unref (event); + break; + } + default: + /* pass other events forward */ + res = gst_pad_push_event (depay->srcpad, event); + break; + } + return res; +} + +static GstEvent * +create_segment_event (GstRDTDepay * depay, gboolean update, + GstClockTime position) +{ + GstSegment segment; + + gst_segment_init (&segment, GST_FORMAT_TIME); + segment.rate = depay->play_speed; + segment.applied_rate = depay->play_scale; + segment.start = position; + + if (depay->npt_stop != -1) + segment.stop = depay->npt_stop - depay->npt_start; + else + segment.stop = -1; + + segment.time = position + depay->npt_start; + + return gst_event_new_segment (&segment); +} + +static GstFlowReturn +gst_rdt_depay_push (GstRDTDepay * rdtdepay, GstBuffer * buffer) +{ + GstFlowReturn ret; + + if (rdtdepay->need_newsegment) { + GstEvent *event; + + event = create_segment_event (rdtdepay, FALSE, 0); + gst_pad_push_event (rdtdepay->srcpad, event); + + rdtdepay->need_newsegment = FALSE; + } + + if (rdtdepay->discont) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + rdtdepay->discont = FALSE; + } + ret = gst_pad_push (rdtdepay->srcpad, buffer); + + return ret; +} + +static GstFlowReturn +gst_rdt_depay_handle_data (GstRDTDepay * rdtdepay, GstClockTime outtime, + GstRDTPacket * packet) +{ + GstFlowReturn ret; + GstBuffer *outbuf; + GstMapInfo outmap; + guint8 *data, *outdata; + guint size; + guint16 stream_id; + guint32 timestamp; + gint gap; + guint16 seqnum; + guint8 flags; + guint16 outflags; + + /* get pointers to the packet data */ + data = gst_rdt_packet_data_map (packet, &size); + + outbuf = gst_buffer_new_and_alloc (12 + size); + GST_BUFFER_TIMESTAMP (outbuf) = outtime; + + GST_DEBUG_OBJECT (rdtdepay, "have size %u", size); + + /* copy over some things */ + stream_id = gst_rdt_packet_data_get_stream_id (packet); + timestamp = gst_rdt_packet_data_get_timestamp (packet); + flags = gst_rdt_packet_data_get_flags (packet); + + seqnum = gst_rdt_packet_data_get_seq (packet); + + GST_DEBUG_OBJECT (rdtdepay, "stream_id %u, timestamp %u, seqnum %d, flags %d", + stream_id, timestamp, seqnum, flags); + + if (rdtdepay->next_seqnum != -1) { + gap = gst_rdt_buffer_compare_seqnum (seqnum, rdtdepay->next_seqnum); + + /* if we have no gap, all is fine */ + if (G_UNLIKELY (gap != 0)) { + GST_LOG_OBJECT (rdtdepay, "got packet %u, expected %u, gap %d", seqnum, + rdtdepay->next_seqnum, gap); + if (gap < 0) { + /* seqnum > next_seqnum, we are missing some packets, this is always a + * DISCONT. */ + GST_LOG_OBJECT (rdtdepay, "%d missing packets", gap); + rdtdepay->discont = TRUE; + } else { + /* seqnum < next_seqnum, we have seen this packet before or the sender + * could be restarted. If the packet is not too old, we throw it away as + * a duplicate, otherwise we mark discont and continue. 100 misordered + * packets is a good threshold. See also RFC 4737. */ + if (gap < 100) + goto dropping; + + GST_LOG_OBJECT (rdtdepay, + "%d > 100, packet too old, sender likely restarted", gap); + rdtdepay->discont = TRUE; + } + } + } + rdtdepay->next_seqnum = (seqnum + 1); + if (rdtdepay->next_seqnum == 0xff00) + rdtdepay->next_seqnum = 0; + + if ((flags & 1) == 0) + outflags = 2; + else + outflags = 0; + + gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); + outdata = outmap.data; + GST_WRITE_UINT16_BE (outdata + 0, 0); /* version */ + GST_WRITE_UINT16_BE (outdata + 2, size + 12); /* length */ + GST_WRITE_UINT16_BE (outdata + 4, stream_id); /* stream */ + GST_WRITE_UINT32_BE (outdata + 6, timestamp); /* timestamp */ + GST_WRITE_UINT16_BE (outdata + 10, outflags); /* flags */ + memcpy (outdata + 12, data, size); + gst_buffer_unmap (outbuf, &outmap); + gst_buffer_resize (outbuf, 0, 12 + size); + + gst_rdt_packet_data_unmap (packet); + + GST_DEBUG_OBJECT (rdtdepay, "Pushing packet, outtime %" GST_TIME_FORMAT, + GST_TIME_ARGS (outtime)); + + ret = gst_rdt_depay_push (rdtdepay, outbuf); + + return ret; + + /* ERRORS */ +dropping: + { + GST_WARNING_OBJECT (rdtdepay, "%d <= 100, dropping old packet", gap); + return GST_FLOW_OK; + } +} + +static GstFlowReturn +gst_rdt_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) +{ + GstRDTDepay *rdtdepay; + GstFlowReturn ret; + GstClockTime timestamp; + gboolean more; + GstRDTPacket packet; + + rdtdepay = GST_RDT_DEPAY (parent); + + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_LOG_OBJECT (rdtdepay, "received discont"); + rdtdepay->discont = TRUE; + } + + if (rdtdepay->header) { + GstBuffer *out; + + out = rdtdepay->header; + rdtdepay->header = NULL; + + /* push header data first */ + gst_rdt_depay_push (rdtdepay, out); + } + + /* save timestamp */ + timestamp = GST_BUFFER_TIMESTAMP (buf); + + ret = GST_FLOW_OK; + + GST_LOG_OBJECT (rdtdepay, "received buffer timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + /* data is in RDT format. */ + more = gst_rdt_buffer_get_first_packet (buf, &packet); + while (more) { + GstRDTType type; + + type = gst_rdt_packet_get_type (&packet); + GST_DEBUG_OBJECT (rdtdepay, "Have packet of type %04x", type); + + if (GST_RDT_IS_DATA_TYPE (type)) { + GST_DEBUG_OBJECT (rdtdepay, "We have a data packet"); + ret = gst_rdt_depay_handle_data (rdtdepay, timestamp, &packet); + } else { + switch (type) { + default: + GST_DEBUG_OBJECT (rdtdepay, "Ignoring packet"); + break; + } + } + if (ret != GST_FLOW_OK) + break; + + more = gst_rdt_packet_move_to_next (&packet); + } + + gst_buffer_unref (buf); + + return ret; +} + +static GstStateChangeReturn +gst_rdt_depay_change_state (GstElement * element, GstStateChange transition) +{ + GstRDTDepay *rdtdepay; + GstStateChangeReturn ret; + + rdtdepay = GST_RDT_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_segment_init (&rdtdepay->segment, GST_FORMAT_UNDEFINED); + rdtdepay->next_seqnum = -1; + rdtdepay->need_newsegment = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + if (rdtdepay->header) + gst_buffer_unref (rdtdepay->header); + rdtdepay->header = NULL; + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} diff --git a/gst/realmedia/rdtdepay.h b/gst/realmedia/rdtdepay.h new file mode 100644 index 0000000000..8b208fcd9d --- /dev/null +++ b/gst/realmedia/rdtdepay.h @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) <2006> Lutz Mueller + * <2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RDT_DEPAY_H__ +#define __GST_RDT_DEPAY_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RDT_DEPAY \ + (gst_rdt_depay_get_type()) +#define GST_RDT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RDT_DEPAY,GstRDTDepay)) +#define GST_RDT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RDT_DEPAY,GstRDTDepayClass)) +#define GST_IS_RDT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RDT_DEPAY)) +#define GST_IS_RDT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RDT_DEPAY)) + +typedef struct _GstRDTDepay GstRDTDepay; +typedef struct _GstRDTDepayClass GstRDTDepayClass; + +struct _GstRDTDepay +{ + GstElement parent; + + GstPad *sinkpad; + GstPad *srcpad; + + guint clock_rate; + GstClockTime npt_start; + GstClockTime npt_stop; + gdouble play_speed; + gdouble play_scale; + + guint32 next_seqnum; + + gboolean discont; + gboolean need_newsegment; + GstSegment segment; + GstBuffer *header; +}; + +struct _GstRDTDepayClass +{ + GstElementClass parent_class; +}; + +GType gst_rdt_depay_get_type (void); + +GST_ELEMENT_REGISTER_DECLARE (rdtdepay); + +G_END_DECLS + +#endif /* __GST_RDT_DEPAY_H__ */ diff --git a/gst/realmedia/rdtjitterbuffer.c b/gst/realmedia/rdtjitterbuffer.c new file mode 100644 index 0000000000..d0b8de06f6 --- /dev/null +++ b/gst/realmedia/rdtjitterbuffer.c @@ -0,0 +1,531 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#include +#include + +#include "rdtjitterbuffer.h" +#include "gstrdtbuffer.h" + +GST_DEBUG_CATEGORY_STATIC (rdt_jitter_buffer_debug); +#define GST_CAT_DEFAULT rdt_jitter_buffer_debug + +#define MAX_WINDOW RDT_JITTER_BUFFER_MAX_WINDOW +#define MAX_TIME (2 * GST_SECOND) + +/* signals and args */ +enum +{ + LAST_SIGNAL +}; + +enum +{ + PROP_0 +}; + +/* GObject vmethods */ +static void rdt_jitter_buffer_finalize (GObject * object); + +/* static guint rdt_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; */ + +G_DEFINE_TYPE (RDTJitterBuffer, rdt_jitter_buffer, G_TYPE_OBJECT); + +static void +rdt_jitter_buffer_class_init (RDTJitterBufferClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = rdt_jitter_buffer_finalize; + + GST_DEBUG_CATEGORY_INIT (rdt_jitter_buffer_debug, "rdtjitterbuffer", 0, + "RDT Jitter Buffer"); +} + +static void +rdt_jitter_buffer_init (RDTJitterBuffer * jbuf) +{ + jbuf->packets = g_queue_new (); + + rdt_jitter_buffer_reset_skew (jbuf); +} + +static void +rdt_jitter_buffer_finalize (GObject * object) +{ + RDTJitterBuffer *jbuf; + + jbuf = RDT_JITTER_BUFFER_CAST (object); + + rdt_jitter_buffer_flush (jbuf); + g_queue_free (jbuf->packets); + + G_OBJECT_CLASS (rdt_jitter_buffer_parent_class)->finalize (object); +} + +/** + * rdt_jitter_buffer_new: + * + * Create an #RDTJitterBuffer. + * + * Returns: a new #RDTJitterBuffer. Use g_object_unref() after usage. + */ +RDTJitterBuffer * +rdt_jitter_buffer_new (void) +{ + RDTJitterBuffer *jbuf; + + jbuf = g_object_new (RDT_TYPE_JITTER_BUFFER, NULL); + + return jbuf; +} + +void +rdt_jitter_buffer_reset_skew (RDTJitterBuffer * jbuf) +{ + jbuf->base_time = -1; + jbuf->base_rtptime = -1; + jbuf->ext_rtptime = -1; + jbuf->window_pos = 0; + jbuf->window_filling = TRUE; + jbuf->window_min = 0; + jbuf->skew = 0; + jbuf->prev_send_diff = -1; +} + +/* For the clock skew we use a windowed low point averaging algorithm as can be + * found in http://www.grame.fr/pub/TR-050601.pdf. The idea is that the jitter is + * composed of: + * + * J = N + n + * + * N : a constant network delay. + * n : random added noise. The noise is concentrated around 0 + * + * In the receiver we can track the elapsed time at the sender with: + * + * send_diff(i) = (Tsi - Ts0); + * + * Tsi : The time at the sender at packet i + * Ts0 : The time at the sender at the first packet + * + * This is the difference between the RDT timestamp in the first received packet + * and the current packet. + * + * At the receiver we have to deal with the jitter introduced by the network. + * + * recv_diff(i) = (Tri - Tr0) + * + * Tri : The time at the receiver at packet i + * Tr0 : The time at the receiver at the first packet + * + * Both of these values contain a jitter Ji, a jitter for packet i, so we can + * write: + * + * recv_diff(i) = (Cri + D + ni) - (Cr0 + D + n0)) + * + * Cri : The time of the clock at the receiver for packet i + * D + ni : The jitter when receiving packet i + * + * We see that the network delay is irrelevant here as we can eliminate D: + * + * recv_diff(i) = (Cri + ni) - (Cr0 + n0)) + * + * The drift is now expressed as: + * + * Drift(i) = recv_diff(i) - send_diff(i); + * + * We now keep the W latest values of Drift and find the minimum (this is the + * one with the lowest network jitter and thus the one which is least affected + * by it). We average this lowest value to smooth out the resulting network skew. + * + * Both the window and the weighting used for averaging influence the accuracy + * of the drift estimation. Finding the correct parameters turns out to be a + * compromise between accuracy and inertia. + * + * We use a 2 second window or up to 512 data points, which is statistically big + * enough to catch spikes (FIXME, detect spikes). + * We also use a rather large weighting factor (125) to smoothly adapt. During + * startup, when filling the window, we use a parabolic weighting factor, the + * more the window is filled, the faster we move to the detected possible skew. + * + * Returns: @time adjusted with the clock skew. + */ +static GstClockTime +calculate_skew (RDTJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, + guint32 clock_rate) +{ + guint64 ext_rtptime; + guint64 send_diff, recv_diff; + gint64 delta; + gint64 old; + gint pos, i; + GstClockTime gstrtptime, out_time; + + //ext_rtptime = gst_rtp_buffer_ext_timestamp (&jbuf->ext_rtptime, rtptime); + ext_rtptime = rtptime; + + gstrtptime = gst_util_uint64_scale_int (ext_rtptime, GST_SECOND, clock_rate); + +again: + /* first time, lock on to time and gstrtptime */ + if (jbuf->base_time == -1) + jbuf->base_time = time; + if (jbuf->base_rtptime == -1) + jbuf->base_rtptime = gstrtptime; + + if (gstrtptime >= jbuf->base_rtptime) + send_diff = gstrtptime - jbuf->base_rtptime; + else { + /* elapsed time at sender, timestamps can go backwards and thus be smaller + * than our base time, take a new base time in that case. */ + GST_DEBUG ("backward timestamps at server, taking new base time"); + jbuf->base_rtptime = gstrtptime; + jbuf->base_time = time; + send_diff = 0; + } + + GST_DEBUG ("extrtp %" G_GUINT64_FORMAT ", gstrtp %" GST_TIME_FORMAT ", base %" + GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, ext_rtptime, + GST_TIME_ARGS (gstrtptime), GST_TIME_ARGS (jbuf->base_rtptime), + GST_TIME_ARGS (send_diff)); + + if (jbuf->prev_send_diff != -1 && time != -1) { + gint64 delta_diff; + + if (send_diff > jbuf->prev_send_diff) + delta_diff = send_diff - jbuf->prev_send_diff; + else + delta_diff = jbuf->prev_send_diff - send_diff; + + /* server changed rtp timestamps too quickly, reset skew detection and start + * again. This value is sortof arbitrary and can be a bad measurement up if + * there are many packets missing because then we get a big gap that is + * unrelated to a timestamp switch. */ + if (delta_diff > GST_SECOND) { + GST_DEBUG ("delta changed too quickly %" GST_TIME_FORMAT " reset skew", + GST_TIME_ARGS (delta_diff)); + rdt_jitter_buffer_reset_skew (jbuf); + goto again; + } + } + jbuf->prev_send_diff = send_diff; + + /* we don't have an arrival timestamp so we can't do skew detection. we + * should still apply a timestamp based on RDT timestamp and base_time */ + if (time == -1) + goto no_skew; + + /* elapsed time at receiver, includes the jitter */ + recv_diff = time - jbuf->base_time; + + GST_DEBUG ("time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", recv_diff %" + GST_TIME_FORMAT, GST_TIME_ARGS (time), GST_TIME_ARGS (jbuf->base_time), + GST_TIME_ARGS (recv_diff)); + + /* measure the diff */ + delta = ((gint64) recv_diff) - ((gint64) send_diff); + + pos = jbuf->window_pos; + + if (jbuf->window_filling) { + /* we are filling the window */ + GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta); + jbuf->window[pos++] = delta; + /* calc the min delta we observed */ + if (pos == 1 || delta < jbuf->window_min) + jbuf->window_min = delta; + + if (send_diff >= MAX_TIME || pos >= MAX_WINDOW) { + jbuf->window_size = pos; + + /* window filled */ + GST_DEBUG ("min %" G_GINT64_FORMAT, jbuf->window_min); + + /* the skew is now the min */ + jbuf->skew = jbuf->window_min; + jbuf->window_filling = FALSE; + } else { + gint perc_time, perc_window, perc; + + /* figure out how much we filled the window, this depends on the amount of + * time we have or the max number of points we keep. */ + perc_time = send_diff * 100 / MAX_TIME; + perc_window = pos * 100 / MAX_WINDOW; + perc = MAX (perc_time, perc_window); + + /* make a parabolic function, the closer we get to the MAX, the more value + * we give to the scaling factor of the new value */ + perc = perc * perc; + + /* quickly go to the min value when we are filling up, slowly when we are + * just starting because we're not sure it's a good value yet. */ + jbuf->skew = + (perc * jbuf->window_min + ((10000 - perc) * jbuf->skew)) / 10000; + jbuf->window_size = pos + 1; + } + } else { + /* pick old value and store new value. We keep the previous value in order + * to quickly check if the min of the window changed */ + old = jbuf->window[pos]; + jbuf->window[pos++] = delta; + + if (delta <= jbuf->window_min) { + /* if the new value we inserted is smaller or equal to the current min, + * it becomes the new min */ + jbuf->window_min = delta; + } else if (old == jbuf->window_min) { + gint64 min = G_MAXINT64; + + /* if we removed the old min, we have to find a new min */ + for (i = 0; i < jbuf->window_size; i++) { + /* we found another value equal to the old min, we can stop searching now */ + if (jbuf->window[i] == old) { + min = old; + break; + } + if (jbuf->window[i] < min) + min = jbuf->window[i]; + } + jbuf->window_min = min; + } + /* average the min values */ + jbuf->skew = (jbuf->window_min + (124 * jbuf->skew)) / 125; + GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, + delta, jbuf->window_min); + } + /* wrap around in the window */ + if (pos >= jbuf->window_size) + pos = 0; + jbuf->window_pos = pos; + +no_skew: + /* the output time is defined as the base timestamp plus the RDT time + * adjusted for the clock skew .*/ + out_time = jbuf->base_time + send_diff + jbuf->skew; + + GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, + jbuf->skew, GST_TIME_ARGS (out_time)); + + return out_time; +} + +/** + * rdt_jitter_buffer_insert: + * @jbuf: an #RDTJitterBuffer + * @buf: a buffer + * @time: a running_time when this buffer was received in nanoseconds + * @clock_rate: the clock-rate of the payload of @buf + * @tail: TRUE when the tail element changed. + * + * Inserts @buf into the packet queue of @jbuf. The sequence number of the + * packet will be used to sort the packets. This function takes ownerhip of + * @buf when the function returns %TRUE. + * @buf should have writable metadata when calling this function. + * + * Returns: %FALSE if a packet with the same number already existed. + */ +gboolean +rdt_jitter_buffer_insert (RDTJitterBuffer * jbuf, GstBuffer * buf, + GstClockTime time, guint32 clock_rate, gboolean * tail) +{ + GList *list; + guint32 rtptime; + guint16 seqnum; + GstRDTPacket packet; + gboolean more; + + g_return_val_if_fail (jbuf != NULL, FALSE); + g_return_val_if_fail (buf != NULL, FALSE); + + more = gst_rdt_buffer_get_first_packet (buf, &packet); + /* programmer error */ + g_return_val_if_fail (more == TRUE, FALSE); + + seqnum = gst_rdt_packet_data_get_seq (&packet); + /* do skew calculation by measuring the difference between rtptime and the + * receive time, this function will retimestamp @buf with the skew corrected + * running time. */ + rtptime = gst_rdt_packet_data_get_timestamp (&packet); + + /* loop the list to skip strictly smaller seqnum buffers */ + for (list = jbuf->packets->head; list; list = g_list_next (list)) { + guint16 qseq; + gint gap; + + more = + gst_rdt_buffer_get_first_packet (GST_BUFFER_CAST (list->data), &packet); + /* programmer error */ + g_return_val_if_fail (more == TRUE, FALSE); + + qseq = gst_rdt_packet_data_get_seq (&packet); + + /* compare the new seqnum to the one in the buffer */ + gap = gst_rdt_buffer_compare_seqnum (seqnum, qseq); + + /* we hit a packet with the same seqnum, notify a duplicate */ + if (G_UNLIKELY (gap == 0)) + goto duplicate; + + /* seqnum > qseq, we can stop looking */ + if (G_LIKELY (gap < 0)) + break; + } + + + if (clock_rate) { + time = calculate_skew (jbuf, rtptime, time, clock_rate); + GST_BUFFER_TIMESTAMP (buf) = time; + } + + if (list) + g_queue_insert_before (jbuf->packets, list, buf); + else + g_queue_push_tail (jbuf->packets, buf); + + /* tail was changed when we did not find a previous packet, we set the return + * flag when requested. */ + if (tail) + *tail = (list == NULL); + + return TRUE; + + /* ERRORS */ +duplicate: + { + GST_WARNING ("duplicate packet %d found", (gint) seqnum); + return FALSE; + } +} + +/** + * rdt_jitter_buffer_pop: + * @jbuf: an #RDTJitterBuffer + * + * Pops the oldest buffer from the packet queue of @jbuf. The popped buffer will + * have its timestamp adjusted with the incoming running_time and the detected + * clock skew. + * + * Returns: a #GstBuffer or %NULL when there was no packet in the queue. + */ +GstBuffer * +rdt_jitter_buffer_pop (RDTJitterBuffer * jbuf) +{ + GstBuffer *buf; + + g_return_val_if_fail (jbuf != NULL, FALSE); + + buf = g_queue_pop_tail (jbuf->packets); + + return buf; +} + +/** + * rdt_jitter_buffer_peek: + * @jbuf: an #RDTJitterBuffer + * + * Peek the oldest buffer from the packet queue of @jbuf. Register a callback + * with rdt_jitter_buffer_set_tail_changed() to be notified when an older packet + * was inserted in the queue. + * + * Returns: a #GstBuffer or %NULL when there was no packet in the queue. + */ +GstBuffer * +rdt_jitter_buffer_peek (RDTJitterBuffer * jbuf) +{ + GstBuffer *buf; + + g_return_val_if_fail (jbuf != NULL, FALSE); + + buf = g_queue_peek_tail (jbuf->packets); + + return buf; +} + +/** + * rdt_jitter_buffer_flush: + * @jbuf: an #RDTJitterBuffer + * + * Flush all packets from the jitterbuffer. + */ +void +rdt_jitter_buffer_flush (RDTJitterBuffer * jbuf) +{ + GstBuffer *buffer; + + g_return_if_fail (jbuf != NULL); + + while ((buffer = g_queue_pop_head (jbuf->packets))) + gst_buffer_unref (buffer); +} + +/** + * rdt_jitter_buffer_num_packets: + * @jbuf: an #RDTJitterBuffer + * + * Get the number of packets currently in "jbuf. + * + * Returns: The number of packets in @jbuf. + */ +guint +rdt_jitter_buffer_num_packets (RDTJitterBuffer * jbuf) +{ + g_return_val_if_fail (jbuf != NULL, 0); + + return jbuf->packets->length; +} + +/** + * rdt_jitter_buffer_get_ts_diff: + * @jbuf: an #RDTJitterBuffer + * + * Get the difference between the timestamps of first and last packet in the + * jitterbuffer. + * + * Returns: The difference expressed in the timestamp units of the packets. + */ +guint32 +rdt_jitter_buffer_get_ts_diff (RDTJitterBuffer * jbuf) +{ + guint64 high_ts, low_ts; + GstBuffer *high_buf, *low_buf; + guint32 result; + + g_return_val_if_fail (jbuf != NULL, 0); + + high_buf = g_queue_peek_head (jbuf->packets); + low_buf = g_queue_peek_tail (jbuf->packets); + + if (!high_buf || !low_buf || high_buf == low_buf) + return 0; + + //high_ts = gst_rtp_buffer_get_timestamp (high_buf); + //low_ts = gst_rtp_buffer_get_timestamp (low_buf); + high_ts = 0; + low_ts = 0; + + /* it needs to work if ts wraps */ + if (high_ts >= low_ts) { + result = (guint32) (high_ts - low_ts); + } else { + result = (guint32) (high_ts + G_MAXUINT32 + 1 - low_ts); + } + return result; +} diff --git a/gst/realmedia/rdtjitterbuffer.h b/gst/realmedia/rdtjitterbuffer.h new file mode 100644 index 0000000000..7eea5e6390 --- /dev/null +++ b/gst/realmedia/rdtjitterbuffer.h @@ -0,0 +1,91 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __RDT_JITTER_BUFFER_H__ +#define __RDT_JITTER_BUFFER_H__ + +#include + +typedef struct _RDTJitterBuffer RDTJitterBuffer; +typedef struct _RDTJitterBufferClass RDTJitterBufferClass; + +#define RDT_TYPE_JITTER_BUFFER (rdt_jitter_buffer_get_type()) +#define RDT_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RDT_TYPE_JITTER_BUFFER,RDTJitterBuffer)) +#define RDT_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RDT_TYPE_JITTER_BUFFER,RDTJitterBufferClass)) +#define RDT_IS_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RDT_TYPE_JITTER_BUFFER)) +#define RDT_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RDT_TYPE_JITTER_BUFFER)) +#define RDT_JITTER_BUFFER_CAST(src) ((RDTJitterBuffer *)(src)) + +/** + * RTPTailChanged: + * @jbuf: an #RDTJitterBuffer + * @user_data: user data specified when registering + * + * This callback will be called when the tail buffer of @jbuf changed. + */ +typedef void (*RTPTailChanged) (RDTJitterBuffer *jbuf, gpointer user_data); + +#define RDT_JITTER_BUFFER_MAX_WINDOW 512 +/** + * RDTJitterBuffer: + * + * A JitterBuffer in the #RTPSession + */ +struct _RDTJitterBuffer { + GObject object; + + GQueue *packets; + + /* for calculating skew */ + GstClockTime base_time; + GstClockTime base_rtptime; + guint64 ext_rtptime; + gint64 window[RDT_JITTER_BUFFER_MAX_WINDOW]; + guint window_pos; + guint window_size; + gboolean window_filling; + gint64 window_min; + gint64 skew; + gint64 prev_send_diff; +}; + +struct _RDTJitterBufferClass { + GObjectClass parent_class; +}; + +GType rdt_jitter_buffer_get_type (void); + +/* managing lifetime */ +RDTJitterBuffer* rdt_jitter_buffer_new (void); + +void rdt_jitter_buffer_reset_skew (RDTJitterBuffer *jbuf); + +gboolean rdt_jitter_buffer_insert (RDTJitterBuffer *jbuf, GstBuffer *buf, + GstClockTime time, + guint32 clock_rate, + gboolean *tail); +GstBuffer * rdt_jitter_buffer_peek (RDTJitterBuffer *jbuf); +GstBuffer * rdt_jitter_buffer_pop (RDTJitterBuffer *jbuf); + +void rdt_jitter_buffer_flush (RDTJitterBuffer *jbuf); + +guint rdt_jitter_buffer_num_packets (RDTJitterBuffer *jbuf); +guint32 rdt_jitter_buffer_get_ts_diff (RDTJitterBuffer *jbuf); + +#endif /* __RDT_JITTER_BUFFER_H__ */ diff --git a/gst/realmedia/rdtmanager.c b/gst/realmedia/rdtmanager.c new file mode 100644 index 0000000000..978bc9ee92 --- /dev/null +++ b/gst/realmedia/rdtmanager.c @@ -0,0 +1,1371 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * <2013> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-rdtmanager + * @title: rdtmanager + * @see_also: GstRtspSrc + * + * A simple RTP session manager used internally by rtspsrc. + */ + +/* #define HAVE_RTCP */ + +#include "gstrdtbuffer.h" +#include "rdtmanager.h" +#include "rdtjitterbuffer.h" + +#include + +#include + +GST_DEBUG_CATEGORY_STATIC (rdtmanager_debug); +#define GST_CAT_DEFAULT (rdtmanager_debug) + +/* GstRDTManager signals and args */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_CLEAR_PT_MAP, + + SIGNAL_ON_NEW_SSRC, + SIGNAL_ON_SSRC_COLLISION, + SIGNAL_ON_SSRC_VALIDATED, + SIGNAL_ON_SSRC_ACTIVE, + SIGNAL_ON_SSRC_SDES, + SIGNAL_ON_BYE_SSRC, + SIGNAL_ON_BYE_TIMEOUT, + SIGNAL_ON_TIMEOUT, + SIGNAL_ON_NPT_STOP, + LAST_SIGNAL +}; + +#define DEFAULT_LATENCY_MS 200 + +enum +{ + PROP_0, + PROP_LATENCY +}; + +static GstStaticPadTemplate gst_rdt_manager_recv_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%u", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rdt") + ); + +static GstStaticPadTemplate gst_rdt_manager_recv_rtcp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%u", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate gst_rdt_manager_recv_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%u_%u_%u", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rdt") + ); + +static GstStaticPadTemplate gst_rdt_manager_rtcp_src_template = +GST_STATIC_PAD_TEMPLATE ("rtcp_src_%u", + GST_PAD_SRC, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static void gst_rdt_manager_finalize (GObject * object); +static void gst_rdt_manager_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_rdt_manager_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static gboolean gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, + GstQuery * query); +static gboolean gst_rdt_manager_src_activate_mode (GstPad * pad, + GstObject * parent, GstPadMode mode, gboolean active); + +static GstClock *gst_rdt_manager_provide_clock (GstElement * element); +static GstStateChangeReturn gst_rdt_manager_change_state (GstElement * element, + GstStateChange transition); +static GstPad *gst_rdt_manager_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name, const GstCaps * caps); +static void gst_rdt_manager_release_pad (GstElement * element, GstPad * pad); + +static gboolean gst_rdt_manager_parse_caps (GstRDTManager * rdtmanager, + GstRDTManagerSession * session, GstCaps * caps); +static gboolean gst_rdt_manager_event_rdt (GstPad * pad, GstObject * parent, + GstEvent * event); + +static GstFlowReturn gst_rdt_manager_chain_rdt (GstPad * pad, + GstObject * parent, GstBuffer * buffer); +static GstFlowReturn gst_rdt_manager_chain_rtcp (GstPad * pad, + GstObject * parent, GstBuffer * buffer); +static void gst_rdt_manager_loop (GstPad * pad); + +static guint gst_rdt_manager_signals[LAST_SIGNAL] = { 0 }; + +#define JBUF_LOCK(sess) (g_mutex_lock (&(sess)->jbuf_lock)) + +#define JBUF_LOCK_CHECK(sess,label) G_STMT_START { \ + JBUF_LOCK (sess); \ + if (sess->srcresult != GST_FLOW_OK) \ + goto label; \ +} G_STMT_END + +#define JBUF_UNLOCK(sess) (g_mutex_unlock (&(sess)->jbuf_lock)) +#define JBUF_WAIT(sess) (g_cond_wait (&(sess)->jbuf_cond, &(sess)->jbuf_lock)) + +#define JBUF_WAIT_CHECK(sess,label) G_STMT_START { \ + JBUF_WAIT(sess); \ + if (sess->srcresult != GST_FLOW_OK) \ + goto label; \ +} G_STMT_END + +#define JBUF_SIGNAL(sess) (g_cond_signal (&(sess)->jbuf_cond)) + +/* Manages the receiving end of the packets. + * + * There is one such structure for each RTP session (audio/video/...). + * We get the RTP/RTCP packets and stuff them into the session manager. + */ +struct _GstRDTManagerSession +{ + /* session id */ + gint id; + /* the parent bin */ + GstRDTManager *dec; + + gboolean active; + /* we only support one ssrc and one pt */ + guint32 ssrc; + guint8 pt; + gint clock_rate; + GstCaps *caps; + gint64 clock_base; + + GstSegment segment; + + /* the last seqnum we pushed out */ + guint32 last_popped_seqnum; + /* the next expected seqnum */ + guint32 next_seqnum; + /* last output time */ + GstClockTime last_out_time; + + /* the pads of the session */ + GstPad *recv_rtp_sink; + GstPad *recv_rtp_src; + GstPad *recv_rtcp_sink; + GstPad *rtcp_src; + + GstFlowReturn srcresult; + gboolean blocked; + gboolean eos; + gboolean waiting; + gboolean discont; + GstClockID clock_id; + + /* jitterbuffer, lock and cond */ + RDTJitterBuffer *jbuf; + GMutex jbuf_lock; + GCond jbuf_cond; + + /* some accounting */ + guint64 num_late; + guint64 num_duplicates; +}; + +/* find a session with the given id */ +static GstRDTManagerSession * +find_session_by_id (GstRDTManager * rdtmanager, gint id) +{ + GSList *walk; + + for (walk = rdtmanager->sessions; walk; walk = g_slist_next (walk)) { + GstRDTManagerSession *sess = (GstRDTManagerSession *) walk->data; + + if (sess->id == id) + return sess; + } + return NULL; +} + +/* create a session with the given id */ +static GstRDTManagerSession * +create_session (GstRDTManager * rdtmanager, gint id) +{ + GstRDTManagerSession *sess; + + sess = g_new0 (GstRDTManagerSession, 1); + sess->id = id; + sess->dec = rdtmanager; + sess->jbuf = rdt_jitter_buffer_new (); + g_mutex_init (&sess->jbuf_lock); + g_cond_init (&sess->jbuf_cond); + rdtmanager->sessions = g_slist_prepend (rdtmanager->sessions, sess); + + return sess; +} + +static gboolean +forward_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data) +{ + GstPad *srcpad = GST_PAD_CAST (user_data); + + gst_pad_push_event (srcpad, gst_event_ref (*event)); + + return TRUE; +} + +static gboolean +activate_session (GstRDTManager * rdtmanager, GstRDTManagerSession * session, + guint32 ssrc, guint8 pt) +{ + GstPadTemplate *templ; + GstElementClass *klass; + gchar *name; + GstCaps *caps; + GValue ret = { 0 }; + GValue args[3] = { {0} + , {0} + , {0} + }; + + GST_DEBUG_OBJECT (rdtmanager, "creating stream"); + + session->ssrc = ssrc; + session->pt = pt; + + /* get pt map */ + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], rdtmanager); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], session->id); + g_value_init (&args[2], G_TYPE_UINT); + g_value_set_uint (&args[2], pt); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + g_signal_emitv (args, gst_rdt_manager_signals[SIGNAL_REQUEST_PT_MAP], 0, + &ret); + + g_value_unset (&args[0]); + g_value_unset (&args[1]); + g_value_unset (&args[2]); + caps = (GstCaps *) g_value_dup_boxed (&ret); + g_value_unset (&ret); + + if (caps) + gst_rdt_manager_parse_caps (rdtmanager, session, caps); + + name = g_strdup_printf ("recv_rtp_src_%u_%u_%u", session->id, ssrc, pt); + klass = GST_ELEMENT_GET_CLASS (rdtmanager); + templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%u_%u_%u"); + session->recv_rtp_src = gst_pad_new_from_template (templ, name); + g_free (name); + + gst_pad_set_element_private (session->recv_rtp_src, session); + gst_pad_set_query_function (session->recv_rtp_src, gst_rdt_manager_query_src); + gst_pad_set_activatemode_function (session->recv_rtp_src, + gst_rdt_manager_src_activate_mode); + + gst_pad_set_active (session->recv_rtp_src, TRUE); + + gst_pad_sticky_events_foreach (session->recv_rtp_sink, forward_sticky_events, + session->recv_rtp_src); + gst_pad_set_caps (session->recv_rtp_src, caps); + gst_caps_unref (caps); + + gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_src); + + return TRUE; +} + +static void +free_session (GstRDTManagerSession * session) +{ + g_object_unref (session->jbuf); + g_cond_clear (&session->jbuf_cond); + g_mutex_clear (&session->jbuf_lock); + g_free (session); +} + +#define gst_rdt_manager_parent_class parent_class +G_DEFINE_TYPE (GstRDTManager, gst_rdt_manager, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (rdtmanager, "rdtmanager", + GST_RANK_NONE, GST_TYPE_RDT_MANAGER); + +/* BOXED:UINT,UINT */ +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) + +static void +gst_rdt_manager_marshal_BOXED__UINT_UINT (GClosure * closure, + GValue * return_value, + guint n_param_values, + const GValue * param_values, + gpointer invocation_hint, gpointer marshal_data) +{ + typedef gpointer (*GMarshalFunc_BOXED__UINT_UINT) (gpointer data1, + guint arg_1, guint arg_2, gpointer data2); + register GMarshalFunc_BOXED__UINT_UINT callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + gpointer v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_BOXED__UINT_UINT) (marshal_data ? marshal_data : + cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), data2); + + g_value_take_boxed (return_value, v_return); +} + +static void +gst_rdt_manager_marshal_VOID__UINT_UINT (GClosure * closure, + GValue * return_value, + guint n_param_values, + const GValue * param_values, + gpointer invocation_hint, gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, guint arg_2, gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : + cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), data2); +} + +static void +gst_rdt_manager_class_init (GstRDTManagerClass * g_class) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstRDTManagerClass *klass; + + klass = (GstRDTManagerClass *) g_class; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_rdt_manager_finalize; + gobject_class->set_property = gst_rdt_manager_set_property; + gobject_class->get_property = gst_rdt_manager_get_property; + + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint ("latency", "Buffer latency in ms", + "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRDTManager::request-pt-map: + * @rdtmanager: the object which received the signal + * @session: the session + * @pt: the pt + * + * Request the payload type as #GstCaps for @pt in @session. + */ + gst_rdt_manager_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, request_pt_map), + NULL, NULL, gst_rdt_manager_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRDTManager::clear-pt-map: + * @rtpbin: the object which received the signal + * + * Clear all previously cached pt-mapping obtained with + * GstRDTManager::request-pt-map. + */ + gst_rdt_manager_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, clear_pt_map), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + * GstRDTManager::on-bye-ssrc: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that became inactive because of a BYE packet. + */ + gst_rdt_manager_signals[SIGNAL_ON_BYE_SSRC] = + g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_bye_ssrc), + NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRDTManager::on-bye-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out because of BYE + */ + gst_rdt_manager_signals[SIGNAL_ON_BYE_TIMEOUT] = + g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_bye_timeout), + NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRDTManager::on-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out + */ + gst_rdt_manager_signals[SIGNAL_ON_TIMEOUT] = + g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_timeout), + NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRDTManager::on-npt-stop: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify that SSRC sender has sent data up to the configured NPT stop time. + */ + gst_rdt_manager_signals[SIGNAL_ON_NPT_STOP] = + g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_npt_stop), + NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + + gstelement_class->provide_clock = + GST_DEBUG_FUNCPTR (gst_rdt_manager_provide_clock); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rdt_manager_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_rdt_manager_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_rdt_manager_release_pad); + + /* sink pads */ + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_manager_recv_rtp_sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_manager_recv_rtcp_sink_template); + /* src pads */ + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_manager_recv_rtp_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rdt_manager_rtcp_src_template); + + gst_element_class_set_static_metadata (gstelement_class, "RTP Decoder", + "Codec/Parser/Network", + "Accepts raw RTP and RTCP packets and sends them forward", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rdtmanager_debug, "rdtmanager", 0, "RTP decoder"); +} + +static void +gst_rdt_manager_init (GstRDTManager * rdtmanager) +{ + rdtmanager->provided_clock = gst_system_clock_obtain (); + rdtmanager->latency = DEFAULT_LATENCY_MS; + GST_OBJECT_FLAG_SET (rdtmanager, GST_ELEMENT_FLAG_PROVIDE_CLOCK); +} + +static void +gst_rdt_manager_finalize (GObject * object) +{ + GstRDTManager *rdtmanager; + + rdtmanager = GST_RDT_MANAGER (object); + + g_slist_foreach (rdtmanager->sessions, (GFunc) free_session, NULL); + g_slist_free (rdtmanager->sessions); + g_clear_object (&rdtmanager->provided_clock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, GstQuery * query) +{ + GstRDTManager *rdtmanager; + gboolean res; + + rdtmanager = GST_RDT_MANAGER (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + GstClockTime latency; + + latency = rdtmanager->latency * GST_MSECOND; + + /* we pretend to be live with a 3 second latency */ + gst_query_set_latency (query, TRUE, latency, -1); + + GST_DEBUG_OBJECT (rdtmanager, "reporting %" GST_TIME_FORMAT " of latency", + GST_TIME_ARGS (latency)); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + return res; +} + +static gboolean +gst_rdt_manager_src_activate_mode (GstPad * pad, GstObject * parent, + GstPadMode mode, gboolean active) +{ + gboolean result; + GstRDTManager *rdtmanager; + GstRDTManagerSession *session; + + session = gst_pad_get_element_private (pad); + rdtmanager = session->dec; + + switch (mode) { + case GST_PAD_MODE_PUSH: + if (active) { + /* allow data processing */ + JBUF_LOCK (session); + GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue"); + /* Mark as non flushing */ + session->srcresult = GST_FLOW_OK; + gst_segment_init (&session->segment, GST_FORMAT_TIME); + session->last_popped_seqnum = -1; + session->last_out_time = -1; + session->next_seqnum = -1; + session->eos = FALSE; + JBUF_UNLOCK (session); + + /* start pushing out buffers */ + GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad"); + result = + gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop, + pad, NULL); + } else { + /* make sure all data processing stops ASAP */ + JBUF_LOCK (session); + /* mark ourselves as flushing */ + session->srcresult = GST_FLOW_FLUSHING; + GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue"); + /* this unblocks any waiting pops on the src pad task */ + JBUF_SIGNAL (session); + /* unlock clock, we just unschedule, the entry will be released by + * the locking streaming thread. */ + if (session->clock_id) + gst_clock_id_unschedule (session->clock_id); + JBUF_UNLOCK (session); + + /* NOTE this will hardlock if the state change is called from the src pad + * task thread because we will _join() the thread. */ + GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad"); + result = gst_pad_stop_task (pad); + } + break; + default: + result = FALSE; + break; + } + return result; +} + +static GstFlowReturn +gst_rdt_manager_handle_data_packet (GstRDTManagerSession * session, + GstClockTime timestamp, GstRDTPacket * packet) +{ + GstRDTManager *rdtmanager; + guint16 seqnum; + gboolean tail; + GstFlowReturn res; + GstBuffer *buffer; + + rdtmanager = session->dec; + + res = GST_FLOW_OK; + + seqnum = 0; + GST_DEBUG_OBJECT (rdtmanager, + "Received packet #%d at time %" GST_TIME_FORMAT, seqnum, + GST_TIME_ARGS (timestamp)); + + buffer = gst_rdt_packet_to_buffer (packet); + + JBUF_LOCK_CHECK (session, out_flushing); + + /* insert the packet into the queue now, FIXME, use seqnum */ + if (!rdt_jitter_buffer_insert (session->jbuf, buffer, timestamp, + session->clock_rate, &tail)) + goto duplicate; + + /* signal addition of new buffer when the _loop is waiting. */ + if (session->waiting) + JBUF_SIGNAL (session); + +finished: + JBUF_UNLOCK (session); + + return res; + + /* ERRORS */ +out_flushing: + { + res = session->srcresult; + GST_DEBUG_OBJECT (rdtmanager, "flushing %s", gst_flow_get_name (res)); + gst_buffer_unref (buffer); + goto finished; + } +duplicate: + { + GST_WARNING_OBJECT (rdtmanager, "Duplicate packet #%d detected, dropping", + seqnum); + session->num_duplicates++; + gst_buffer_unref (buffer); + goto finished; + } +} + +static gboolean +gst_rdt_manager_parse_caps (GstRDTManager * rdtmanager, + GstRDTManagerSession * session, GstCaps * caps) +{ + GstStructure *caps_struct; + guint val; + + /* first parse the caps */ + caps_struct = gst_caps_get_structure (caps, 0); + + GST_DEBUG_OBJECT (rdtmanager, "got caps"); + + /* we need a clock-rate to convert the rtp timestamps to GStreamer time and to + * measure the amount of data in the buffer */ + if (!gst_structure_get_int (caps_struct, "clock-rate", &session->clock_rate)) + session->clock_rate = 1000; + + if (session->clock_rate <= 0) + goto wrong_rate; + + GST_DEBUG_OBJECT (rdtmanager, "got clock-rate %d", session->clock_rate); + + /* gah, clock-base is uint. If we don't have a base, we will use the first + * buffer timestamp as the base time. This will screw up sync but it's better + * than nothing. */ + if (gst_structure_get_uint (caps_struct, "clock-base", &val)) + session->clock_base = val; + else + session->clock_base = -1; + + GST_DEBUG_OBJECT (rdtmanager, "got clock-base %" G_GINT64_FORMAT, + session->clock_base); + + /* first expected seqnum */ + if (gst_structure_get_uint (caps_struct, "seqnum-base", &val)) + session->next_seqnum = val; + else + session->next_seqnum = -1; + + GST_DEBUG_OBJECT (rdtmanager, "got seqnum-base %d", session->next_seqnum); + + return TRUE; + + /* ERRORS */ +wrong_rate: + { + GST_DEBUG_OBJECT (rdtmanager, "Invalid clock-rate %d", session->clock_rate); + return FALSE; + } +} + +static gboolean +gst_rdt_manager_event_rdt (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstRDTManager *rdtmanager; + GstRDTManagerSession *session; + gboolean res; + + rdtmanager = GST_RDT_MANAGER (parent); + /* find session */ + session = gst_pad_get_element_private (pad); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_rdt_manager_parse_caps (rdtmanager, session, caps); + gst_event_unref (event); + break; + } + default: + res = gst_pad_event_default (pad, parent, event); + break; + } + return res; +} + +static GstFlowReturn +gst_rdt_manager_chain_rdt (GstPad * pad, GstObject * parent, GstBuffer * buffer) +{ + GstFlowReturn res; + GstRDTManager *rdtmanager; + GstRDTManagerSession *session; + GstClockTime timestamp; + GstRDTPacket packet; + guint32 ssrc; + guint8 pt; + gboolean more; + + rdtmanager = GST_RDT_MANAGER (parent); + + GST_DEBUG_OBJECT (rdtmanager, "got RDT packet"); + + ssrc = 0; + pt = 0; + + GST_DEBUG_OBJECT (rdtmanager, "SSRC %08x, PT %d", ssrc, pt); + + /* find session */ + session = gst_pad_get_element_private (pad); + + /* see if we have the pad */ + if (!session->active) { + activate_session (rdtmanager, session, ssrc, pt); + session->active = TRUE; + } + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (rdtmanager, "received discont"); + session->discont = TRUE; + } + + res = GST_FLOW_OK; + + /* take the timestamp of the buffer. This is the time when the packet was + * received and is used to calculate jitter and clock skew. We will adjust + * this timestamp with the smoothed value after processing it in the + * jitterbuffer. */ + timestamp = GST_BUFFER_TIMESTAMP (buffer); + /* bring to running time */ + timestamp = gst_segment_to_running_time (&session->segment, GST_FORMAT_TIME, + timestamp); + + more = gst_rdt_buffer_get_first_packet (buffer, &packet); + while (more) { + GstRDTType type; + + type = gst_rdt_packet_get_type (&packet); + GST_DEBUG_OBJECT (rdtmanager, "Have packet of type %04x", type); + + if (GST_RDT_IS_DATA_TYPE (type)) { + GST_DEBUG_OBJECT (rdtmanager, "We have a data packet"); + res = gst_rdt_manager_handle_data_packet (session, timestamp, &packet); + } else { + switch (type) { + default: + GST_DEBUG_OBJECT (rdtmanager, "Ignoring packet"); + break; + } + } + if (res != GST_FLOW_OK) + break; + + more = gst_rdt_packet_move_to_next (&packet); + } + + gst_buffer_unref (buffer); + + return res; +} + +/* push packets from the queue to the downstream demuxer */ +static void +gst_rdt_manager_loop (GstPad * pad) +{ + GstRDTManager *rdtmanager; + GstRDTManagerSession *session; + GstBuffer *buffer; + GstFlowReturn result; + + rdtmanager = GST_RDT_MANAGER (GST_PAD_PARENT (pad)); + + session = gst_pad_get_element_private (pad); + + JBUF_LOCK_CHECK (session, flushing); + GST_DEBUG_OBJECT (rdtmanager, "Peeking item"); + while (TRUE) { + /* always wait if we are blocked */ + if (!session->blocked) { + /* if we have a packet, we can exit the loop and grab it */ + if (rdt_jitter_buffer_num_packets (session->jbuf) > 0) + break; + /* no packets but we are EOS, do eos logic */ + if (session->eos) + goto do_eos; + } + /* underrun, wait for packets or flushing now */ + session->waiting = TRUE; + JBUF_WAIT_CHECK (session, flushing); + session->waiting = FALSE; + } + + buffer = rdt_jitter_buffer_pop (session->jbuf); + + GST_DEBUG_OBJECT (rdtmanager, "Got item %p", buffer); + + if (session->discont) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + session->discont = FALSE; + } + + JBUF_UNLOCK (session); + + result = gst_pad_push (session->recv_rtp_src, buffer); + if (result != GST_FLOW_OK) + goto pause; + + return; + + /* ERRORS */ +flushing: + { + GST_DEBUG_OBJECT (rdtmanager, "we are flushing"); + gst_pad_pause_task (session->recv_rtp_src); + JBUF_UNLOCK (session); + return; + } +do_eos: + { + /* store result, we are flushing now */ + GST_DEBUG_OBJECT (rdtmanager, "We are EOS, pushing EOS downstream"); + session->srcresult = GST_FLOW_EOS; + gst_pad_pause_task (session->recv_rtp_src); + gst_pad_push_event (session->recv_rtp_src, gst_event_new_eos ()); + JBUF_UNLOCK (session); + return; + } +pause: + { + GST_DEBUG_OBJECT (rdtmanager, "pausing task, reason %s", + gst_flow_get_name (result)); + + JBUF_LOCK (session); + /* store result */ + session->srcresult = result; + /* we don't post errors or anything because upstream will do that for us + * when we pass the return value upstream. */ + gst_pad_pause_task (session->recv_rtp_src); + JBUF_UNLOCK (session); + return; + } +} + +static GstFlowReturn +gst_rdt_manager_chain_rtcp (GstPad * pad, GstObject * parent, + GstBuffer * buffer) +{ + GstRDTManager *src; + +#ifdef HAVE_RTCP + gboolean valid; + GstRTCPPacket packet; + gboolean more; +#endif + + src = GST_RDT_MANAGER (parent); + + GST_DEBUG_OBJECT (src, "got rtcp packet"); + +#ifdef HAVE_RTCP + valid = gst_rtcp_buffer_validate (buffer); + if (!valid) + goto bad_packet; + + /* position on first packet */ + more = gst_rtcp_buffer_get_first_packet (buffer, &packet); + while (more) { + switch (gst_rtcp_packet_get_type (&packet)) { + case GST_RTCP_TYPE_SR: + { + guint32 ssrc, rtptime, packet_count, octet_count; + guint64 ntptime; + guint count, i; + + gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime, + &packet_count, &octet_count); + + GST_DEBUG_OBJECT (src, + "got SR packet: SSRC %08x, NTP %" G_GUINT64_FORMAT + ", RTP %u, PC %u, OC %u", ssrc, ntptime, rtptime, packet_count, + octet_count); + + count = gst_rtcp_packet_get_rb_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc, exthighestseq, jitter, lsr, dlsr; + guint8 fractionlost; + gint32 packetslost; + + gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" + ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, + packetslost, exthighestseq, jitter, lsr, dlsr); + } + break; + } + case GST_RTCP_TYPE_RR: + { + guint32 ssrc; + guint count, i; + + ssrc = gst_rtcp_packet_rr_get_ssrc (&packet); + + GST_DEBUG_OBJECT (src, "got RR packet: SSRC %08x", ssrc); + + count = gst_rtcp_packet_get_rb_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc, exthighestseq, jitter, lsr, dlsr; + guint8 fractionlost; + gint32 packetslost; + + gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" + ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, + packetslost, exthighestseq, jitter, lsr, dlsr); + } + break; + } + case GST_RTCP_TYPE_SDES: + { + guint chunks, i, j; + gboolean more_chunks, more_items; + + chunks = gst_rtcp_packet_sdes_get_chunk_count (&packet); + GST_DEBUG_OBJECT (src, "got SDES packet with %d chunks", chunks); + + more_chunks = gst_rtcp_packet_sdes_first_chunk (&packet); + i = 0; + while (more_chunks) { + guint32 ssrc; + + ssrc = gst_rtcp_packet_sdes_get_ssrc (&packet); + + GST_DEBUG_OBJECT (src, "chunk %d, SSRC %08x", i, ssrc); + + more_items = gst_rtcp_packet_sdes_first_item (&packet); + j = 0; + while (more_items) { + GstRTCPSDESType type; + guint8 len; + gchar *data; + + gst_rtcp_packet_sdes_get_item (&packet, &type, &len, &data); + + GST_DEBUG_OBJECT (src, "item %d, type %d, len %d, data %s", j, + type, len, data); + + more_items = gst_rtcp_packet_sdes_next_item (&packet); + j++; + } + more_chunks = gst_rtcp_packet_sdes_next_chunk (&packet); + i++; + } + break; + } + case GST_RTCP_TYPE_BYE: + { + guint count, i; + gchar *reason; + + reason = gst_rtcp_packet_bye_get_reason (&packet); + GST_DEBUG_OBJECT (src, "got BYE packet (reason: %s)", + GST_STR_NULL (reason)); + g_free (reason); + + count = gst_rtcp_packet_bye_get_ssrc_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc; + + + ssrc = gst_rtcp_packet_bye_get_nth_ssrc (&packet, i); + + GST_DEBUG_OBJECT (src, "SSRC: %08x", ssrc); + } + break; + } + case GST_RTCP_TYPE_APP: + GST_DEBUG_OBJECT (src, "got APP packet"); + break; + default: + GST_WARNING_OBJECT (src, "got unknown RTCP packet"); + break; + } + more = gst_rtcp_packet_move_to_next (&packet); + } + gst_buffer_unref (buffer); + return GST_FLOW_OK; + +bad_packet: + { + GST_WARNING_OBJECT (src, "got invalid RTCP packet"); + return GST_FLOW_OK; + } +#else + return GST_FLOW_OK; +#endif +} + +static void +gst_rdt_manager_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRDTManager *src; + + src = GST_RDT_MANAGER (object); + + switch (prop_id) { + case PROP_LATENCY: + src->latency = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rdt_manager_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstRDTManager *src; + + src = GST_RDT_MANAGER (object); + + switch (prop_id) { + case PROP_LATENCY: + g_value_set_uint (value, src->latency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstClock * +gst_rdt_manager_provide_clock (GstElement * element) +{ + GstRDTManager *rdtmanager; + + rdtmanager = GST_RDT_MANAGER (element); + + return GST_CLOCK_CAST (gst_object_ref (rdtmanager->provided_clock)); +} + +static GstStateChangeReturn +gst_rdt_manager_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* we're NO_PREROLL when going to PAUSED */ + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + default: + break; + } + + return ret; +} + +/* Create a pad for receiving RTP for the session in @name + */ +static GstPad * +create_recv_rtp (GstRDTManager * rdtmanager, GstPadTemplate * templ, + const gchar * name) +{ + guint sessid; + GstRDTManagerSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtp_sink_%u", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rdtmanager, "finding session %d", sessid); + + /* get or create session */ + session = find_session_by_id (rdtmanager, sessid); + if (!session) { + GST_DEBUG_OBJECT (rdtmanager, "creating session %d", sessid); + /* create session now */ + session = create_session (rdtmanager, sessid); + if (session == NULL) + goto create_error; + } + /* check if pad was requested */ + if (session->recv_rtp_sink != NULL) + goto existed; + + GST_DEBUG_OBJECT (rdtmanager, "getting RTP sink pad"); + + session->recv_rtp_sink = gst_pad_new_from_template (templ, name); + gst_pad_set_element_private (session->recv_rtp_sink, session); + gst_pad_set_event_function (session->recv_rtp_sink, + gst_rdt_manager_event_rdt); + gst_pad_set_chain_function (session->recv_rtp_sink, + gst_rdt_manager_chain_rdt); + gst_pad_set_active (session->recv_rtp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_sink); + + return session->recv_rtp_sink; + + /* ERRORS */ +no_name: + { + g_warning ("rdtmanager: invalid name given"); + return NULL; + } +create_error: + { + /* create_session already warned */ + return NULL; + } +existed: + { + g_warning ("rdtmanager: recv_rtp pad already requested for session %d", + sessid); + return NULL; + } +} + +/* Create a pad for receiving RTCP for the session in @name + */ +static GstPad * +create_recv_rtcp (GstRDTManager * rdtmanager, GstPadTemplate * templ, + const gchar * name) +{ + guint sessid; + GstRDTManagerSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtcp_sink_%u", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rdtmanager, "finding session %d", sessid); + + /* get the session, it must exist or we error */ + session = find_session_by_id (rdtmanager, sessid); + if (!session) + goto no_session; + + /* check if pad was requested */ + if (session->recv_rtcp_sink != NULL) + goto existed; + + GST_DEBUG_OBJECT (rdtmanager, "getting RTCP sink pad"); + + session->recv_rtcp_sink = gst_pad_new_from_template (templ, name); + gst_pad_set_element_private (session->recv_rtp_sink, session); + gst_pad_set_chain_function (session->recv_rtcp_sink, + gst_rdt_manager_chain_rtcp); + gst_pad_set_active (session->recv_rtcp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtcp_sink); + + return session->recv_rtcp_sink; + + /* ERRORS */ +no_name: + { + g_warning ("rdtmanager: invalid name given"); + return NULL; + } +no_session: + { + g_warning ("rdtmanager: no session with id %d", sessid); + return NULL; + } +existed: + { + g_warning ("rdtmanager: recv_rtcp pad already requested for session %d", + sessid); + return NULL; + } +} + +/* Create a pad for sending RTCP for the session in @name + */ +static GstPad * +create_rtcp (GstRDTManager * rdtmanager, GstPadTemplate * templ, + const gchar * name) +{ + guint sessid; + GstRDTManagerSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "rtcp_src_%u", &sessid) != 1) + goto no_name; + + /* get or create session */ + session = find_session_by_id (rdtmanager, sessid); + if (!session) + goto no_session; + + /* check if pad was requested */ + if (session->rtcp_src != NULL) + goto existed; + + session->rtcp_src = gst_pad_new_from_template (templ, name); + gst_pad_set_active (session->rtcp_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->rtcp_src); + + return session->rtcp_src; + + /* ERRORS */ +no_name: + { + g_warning ("rdtmanager: invalid name given"); + return NULL; + } +no_session: + { + g_warning ("rdtmanager: session with id %d does not exist", sessid); + return NULL; + } +existed: + { + g_warning ("rdtmanager: rtcp_src pad already requested for session %d", + sessid); + return NULL; + } +} + +/* + */ +static GstPad * +gst_rdt_manager_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name, const GstCaps * caps) +{ + GstRDTManager *rdtmanager; + GstElementClass *klass; + GstPad *result; + + g_return_val_if_fail (templ != NULL, NULL); + g_return_val_if_fail (GST_IS_RDT_MANAGER (element), NULL); + + rdtmanager = GST_RDT_MANAGER (element); + klass = GST_ELEMENT_GET_CLASS (element); + + /* figure out the template */ + if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%u")) { + result = create_recv_rtp (rdtmanager, templ, name); + } else if (templ == gst_element_class_get_pad_template (klass, + "recv_rtcp_sink_%u")) { + result = create_recv_rtcp (rdtmanager, templ, name); + } else if (templ == gst_element_class_get_pad_template (klass, "rtcp_src_%u")) { + result = create_rtcp (rdtmanager, templ, name); + } else + goto wrong_template; + + return result; + + /* ERRORS */ +wrong_template: + { + g_warning ("rdtmanager: this is not our template"); + return NULL; + } +} + +static void +gst_rdt_manager_release_pad (GstElement * element, GstPad * pad) +{ +} diff --git a/gst/realmedia/rdtmanager.h b/gst/realmedia/rdtmanager.h new file mode 100644 index 0000000000..d7a60fd595 --- /dev/null +++ b/gst/realmedia/rdtmanager.h @@ -0,0 +1,93 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_RDT_MANAGER_H__ +#define __GST_RDT_MANAGER_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RDT_MANAGER (gst_rdt_manager_get_type()) +#define GST_IS_RDT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RDT_MANAGER)) +#define GST_IS_RDT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RDT_MANAGER)) +#define GST_RDT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RDT_MANAGER, GstRDTManager)) +#define GST_RDT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RDT_MANAGER, GstRDTManagerClass)) + +typedef struct _GstRDTManager GstRDTManager; +typedef struct _GstRDTManagerClass GstRDTManagerClass; +typedef struct _GstRDTManagerSession GstRDTManagerSession; + +struct _GstRDTManager { + GstElement element; + + guint latency; + GSList *sessions; + GstClock *provided_clock; +}; + +struct _GstRDTManagerClass { + GstElementClass parent_class; + + /* get the caps for pt */ + GstCaps* (*request_pt_map) (GstRDTManager *rtpdec, guint session, guint pt); + + void (*clear_pt_map) (GstRDTManager *rtpdec); + + void (*on_new_ssrc) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_collision) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_validated) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_active) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_sdes) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_bye_ssrc) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_bye_timeout) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_timeout) (GstRDTManager *rtpdec, guint session, guint32 ssrc); + void (*on_npt_stop) (GstRDTManager *rtpdec, guint session, guint32 ssrc); +}; + +GType gst_rdt_manager_get_type(void); + +GST_ELEMENT_REGISTER_DECLARE (rdtmanager); + +G_END_DECLS + +#endif /* __GST_RDT_MANAGER_H__ */ diff --git a/gst/realmedia/realhash.c b/gst/realmedia/realhash.c new file mode 100644 index 0000000000..4a18189cee --- /dev/null +++ b/gst/realmedia/realhash.c @@ -0,0 +1,324 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* Element-Checklist-Version: 5 */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +#include + +#include + +#include "realhash.h" + +void rtsp_ext_real_calc_response_and_checksum (char *response, + char *chksum, char *challenge); + +/* + * The following code has been copied from + * xine-lib-1.1.1/src/input/libreal/real.c. + */ + +static const unsigned char xor_table[] = { + 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53, + 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70, + 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09, + 0x63, 0x11, 0x03, 0x71, 0x08, 0x08, 0x70, 0x02, + 0x10, 0x57, 0x05, 0x18, 0x54, 0x00, 0x00, 0x00 +}; + +#define LE_32(x) GST_READ_UINT32_LE(x) +#define BE_32C(x,y) GST_WRITE_UINT32_BE(x,y) +#define LE_32C(x,y) GST_WRITE_UINT32_LE(x,y) + +static void +hash (char *field, char *param) +{ + uint32_t a, b, c, d; + + /* fill variables */ + a = LE_32 (field); + b = LE_32 (field + 4); + c = LE_32 (field + 8); + d = LE_32 (field + 12); + + a = ((b & c) | (~b & d)) + LE_32 ((param + 0x00)) + a - 0x28955B88; + a = ((a << 0x07) | (a >> 0x19)) + b; + d = ((a & b) | (~a & c)) + LE_32 ((param + 0x04)) + d - 0x173848AA; + d = ((d << 0x0c) | (d >> 0x14)) + a; + c = ((d & a) | (~d & b)) + LE_32 ((param + 0x08)) + c + 0x242070DB; + c = ((c << 0x11) | (c >> 0x0f)) + d; + b = ((c & d) | (~c & a)) + LE_32 ((param + 0x0c)) + b - 0x3E423112; + b = ((b << 0x16) | (b >> 0x0a)) + c; + a = ((b & c) | (~b & d)) + LE_32 ((param + 0x10)) + a - 0x0A83F051; + a = ((a << 0x07) | (a >> 0x19)) + b; + d = ((a & b) | (~a & c)) + LE_32 ((param + 0x14)) + d + 0x4787C62A; + d = ((d << 0x0c) | (d >> 0x14)) + a; + c = ((d & a) | (~d & b)) + LE_32 ((param + 0x18)) + c - 0x57CFB9ED; + c = ((c << 0x11) | (c >> 0x0f)) + d; + b = ((c & d) | (~c & a)) + LE_32 ((param + 0x1c)) + b - 0x02B96AFF; + b = ((b << 0x16) | (b >> 0x0a)) + c; + a = ((b & c) | (~b & d)) + LE_32 ((param + 0x20)) + a + 0x698098D8; + a = ((a << 0x07) | (a >> 0x19)) + b; + d = ((a & b) | (~a & c)) + LE_32 ((param + 0x24)) + d - 0x74BB0851; + d = ((d << 0x0c) | (d >> 0x14)) + a; + c = ((d & a) | (~d & b)) + LE_32 ((param + 0x28)) + c - 0x0000A44F; + c = ((c << 0x11) | (c >> 0x0f)) + d; + b = ((c & d) | (~c & a)) + LE_32 ((param + 0x2C)) + b - 0x76A32842; + b = ((b << 0x16) | (b >> 0x0a)) + c; + a = ((b & c) | (~b & d)) + LE_32 ((param + 0x30)) + a + 0x6B901122; + a = ((a << 0x07) | (a >> 0x19)) + b; + d = ((a & b) | (~a & c)) + LE_32 ((param + 0x34)) + d - 0x02678E6D; + d = ((d << 0x0c) | (d >> 0x14)) + a; + c = ((d & a) | (~d & b)) + LE_32 ((param + 0x38)) + c - 0x5986BC72; + c = ((c << 0x11) | (c >> 0x0f)) + d; + b = ((c & d) | (~c & a)) + LE_32 ((param + 0x3c)) + b + 0x49B40821; + b = ((b << 0x16) | (b >> 0x0a)) + c; + + a = ((b & d) | (~d & c)) + LE_32 ((param + 0x04)) + a - 0x09E1DA9E; + a = ((a << 0x05) | (a >> 0x1b)) + b; + d = ((a & c) | (~c & b)) + LE_32 ((param + 0x18)) + d - 0x3FBF4CC0; + d = ((d << 0x09) | (d >> 0x17)) + a; + c = ((d & b) | (~b & a)) + LE_32 ((param + 0x2c)) + c + 0x265E5A51; + c = ((c << 0x0e) | (c >> 0x12)) + d; + b = ((c & a) | (~a & d)) + LE_32 ((param + 0x00)) + b - 0x16493856; + b = ((b << 0x14) | (b >> 0x0c)) + c; + a = ((b & d) | (~d & c)) + LE_32 ((param + 0x14)) + a - 0x29D0EFA3; + a = ((a << 0x05) | (a >> 0x1b)) + b; + d = ((a & c) | (~c & b)) + LE_32 ((param + 0x28)) + d + 0x02441453; + d = ((d << 0x09) | (d >> 0x17)) + a; + c = ((d & b) | (~b & a)) + LE_32 ((param + 0x3c)) + c - 0x275E197F; + c = ((c << 0x0e) | (c >> 0x12)) + d; + b = ((c & a) | (~a & d)) + LE_32 ((param + 0x10)) + b - 0x182C0438; + b = ((b << 0x14) | (b >> 0x0c)) + c; + a = ((b & d) | (~d & c)) + LE_32 ((param + 0x24)) + a + 0x21E1CDE6; + a = ((a << 0x05) | (a >> 0x1b)) + b; + d = ((a & c) | (~c & b)) + LE_32 ((param + 0x38)) + d - 0x3CC8F82A; + d = ((d << 0x09) | (d >> 0x17)) + a; + c = ((d & b) | (~b & a)) + LE_32 ((param + 0x0c)) + c - 0x0B2AF279; + c = ((c << 0x0e) | (c >> 0x12)) + d; + b = ((c & a) | (~a & d)) + LE_32 ((param + 0x20)) + b + 0x455A14ED; + b = ((b << 0x14) | (b >> 0x0c)) + c; + a = ((b & d) | (~d & c)) + LE_32 ((param + 0x34)) + a - 0x561C16FB; + a = ((a << 0x05) | (a >> 0x1b)) + b; + d = ((a & c) | (~c & b)) + LE_32 ((param + 0x08)) + d - 0x03105C08; + d = ((d << 0x09) | (d >> 0x17)) + a; + c = ((d & b) | (~b & a)) + LE_32 ((param + 0x1c)) + c + 0x676F02D9; + c = ((c << 0x0e) | (c >> 0x12)) + d; + b = ((c & a) | (~a & d)) + LE_32 ((param + 0x30)) + b - 0x72D5B376; + b = ((b << 0x14) | (b >> 0x0c)) + c; + + a = (b ^ c ^ d) + LE_32 ((param + 0x14)) + a - 0x0005C6BE; + a = ((a << 0x04) | (a >> 0x1c)) + b; + d = (a ^ b ^ c) + LE_32 ((param + 0x20)) + d - 0x788E097F; + d = ((d << 0x0b) | (d >> 0x15)) + a; + c = (d ^ a ^ b) + LE_32 ((param + 0x2c)) + c + 0x6D9D6122; + c = ((c << 0x10) | (c >> 0x10)) + d; + b = (c ^ d ^ a) + LE_32 ((param + 0x38)) + b - 0x021AC7F4; + b = ((b << 0x17) | (b >> 0x09)) + c; + a = (b ^ c ^ d) + LE_32 ((param + 0x04)) + a - 0x5B4115BC; + a = ((a << 0x04) | (a >> 0x1c)) + b; + d = (a ^ b ^ c) + LE_32 ((param + 0x10)) + d + 0x4BDECFA9; + d = ((d << 0x0b) | (d >> 0x15)) + a; + c = (d ^ a ^ b) + LE_32 ((param + 0x1c)) + c - 0x0944B4A0; + c = ((c << 0x10) | (c >> 0x10)) + d; + b = (c ^ d ^ a) + LE_32 ((param + 0x28)) + b - 0x41404390; + b = ((b << 0x17) | (b >> 0x09)) + c; + a = (b ^ c ^ d) + LE_32 ((param + 0x34)) + a + 0x289B7EC6; + a = ((a << 0x04) | (a >> 0x1c)) + b; + d = (a ^ b ^ c) + LE_32 ((param + 0x00)) + d - 0x155ED806; + d = ((d << 0x0b) | (d >> 0x15)) + a; + c = (d ^ a ^ b) + LE_32 ((param + 0x0c)) + c - 0x2B10CF7B; + c = ((c << 0x10) | (c >> 0x10)) + d; + b = (c ^ d ^ a) + LE_32 ((param + 0x18)) + b + 0x04881D05; + b = ((b << 0x17) | (b >> 0x09)) + c; + a = (b ^ c ^ d) + LE_32 ((param + 0x24)) + a - 0x262B2FC7; + a = ((a << 0x04) | (a >> 0x1c)) + b; + d = (a ^ b ^ c) + LE_32 ((param + 0x30)) + d - 0x1924661B; + d = ((d << 0x0b) | (d >> 0x15)) + a; + c = (d ^ a ^ b) + LE_32 ((param + 0x3c)) + c + 0x1fa27cf8; + c = ((c << 0x10) | (c >> 0x10)) + d; + b = (c ^ d ^ a) + LE_32 ((param + 0x08)) + b - 0x3B53A99B; + b = ((b << 0x17) | (b >> 0x09)) + c; + + a = ((~d | b) ^ c) + LE_32 ((param + 0x00)) + a - 0x0BD6DDBC; + a = ((a << 0x06) | (a >> 0x1a)) + b; + d = ((~c | a) ^ b) + LE_32 ((param + 0x1c)) + d + 0x432AFF97; + d = ((d << 0x0a) | (d >> 0x16)) + a; + c = ((~b | d) ^ a) + LE_32 ((param + 0x38)) + c - 0x546BDC59; + c = ((c << 0x0f) | (c >> 0x11)) + d; + b = ((~a | c) ^ d) + LE_32 ((param + 0x14)) + b - 0x036C5FC7; + b = ((b << 0x15) | (b >> 0x0b)) + c; + a = ((~d | b) ^ c) + LE_32 ((param + 0x30)) + a + 0x655B59C3; + a = ((a << 0x06) | (a >> 0x1a)) + b; + d = ((~c | a) ^ b) + LE_32 ((param + 0x0C)) + d - 0x70F3336E; + d = ((d << 0x0a) | (d >> 0x16)) + a; + c = ((~b | d) ^ a) + LE_32 ((param + 0x28)) + c - 0x00100B83; + c = ((c << 0x0f) | (c >> 0x11)) + d; + b = ((~a | c) ^ d) + LE_32 ((param + 0x04)) + b - 0x7A7BA22F; + b = ((b << 0x15) | (b >> 0x0b)) + c; + a = ((~d | b) ^ c) + LE_32 ((param + 0x20)) + a + 0x6FA87E4F; + a = ((a << 0x06) | (a >> 0x1a)) + b; + d = ((~c | a) ^ b) + LE_32 ((param + 0x3c)) + d - 0x01D31920; + d = ((d << 0x0a) | (d >> 0x16)) + a; + c = ((~b | d) ^ a) + LE_32 ((param + 0x18)) + c - 0x5CFEBCEC; + c = ((c << 0x0f) | (c >> 0x11)) + d; + b = ((~a | c) ^ d) + LE_32 ((param + 0x34)) + b + 0x4E0811A1; + b = ((b << 0x15) | (b >> 0x0b)) + c; + a = ((~d | b) ^ c) + LE_32 ((param + 0x10)) + a - 0x08AC817E; + a = ((a << 0x06) | (a >> 0x1a)) + b; + d = ((~c | a) ^ b) + LE_32 ((param + 0x2c)) + d - 0x42C50DCB; + d = ((d << 0x0a) | (d >> 0x16)) + a; + c = ((~b | d) ^ a) + LE_32 ((param + 0x08)) + c + 0x2AD7D2BB; + c = ((c << 0x0f) | (c >> 0x11)) + d; + b = ((~a | c) ^ d) + LE_32 ((param + 0x24)) + b - 0x14792C6F; + b = ((b << 0x15) | (b >> 0x0b)) + c; + + a += LE_32 (field); + b += LE_32 (field + 4); + c += LE_32 (field + 8); + d += LE_32 (field + 12); + + LE_32C (field, a); + LE_32C (field + 4, b); + LE_32C (field + 8, c); + LE_32C (field + 12, d); +} + +static void +call_hash (char *key, char *challenge, int len) +{ + uint8_t *ptr1, *ptr2; + uint32_t a, b, c, d, tmp; + + ptr1 = (uint8_t *) (key + 16); + ptr2 = (uint8_t *) (key + 20); + + a = LE_32 (ptr1); + b = (a >> 3) & 0x3f; + a += len * 8; + LE_32C (ptr1, a); + + if (a < (len << 3)) + ptr2 += 4; + + tmp = LE_32 (ptr2) + (len >> 0x1d); + LE_32C (ptr2, tmp); + a = 64 - b; + c = 0; + if (a <= len) { + + memcpy (key + b + 24, challenge, a); + hash (key, key + 24); + c = a; + d = c + 0x3f; + + while (d < len) { + hash (key, challenge + d - 0x3f); + d += 64; + c += 64; + } + b = 0; + } + + memcpy (key + b + 24, challenge + c, len - c); +} + +void +gst_rtsp_ext_real_calc_response_and_checksum (char *response, char *chksum, + char *challenge) +{ + int ch_len, table_len, resp_len; + int i; + char *ptr; + char buf[128]; + char field[128]; + char zres[20]; + char buf1[128]; + char buf2[128]; + + /* initialize return values */ + memset (response, 0, 64); + memset (chksum, 0, 34); + + /* initialize buffer */ + memset (buf, 0, 128); + ptr = buf; + BE_32C (ptr, 0xa1e9149d); + ptr += 4; + BE_32C (ptr, 0x0e6b3b59); + ptr += 4; + + if ((ch_len = MIN (strlen (challenge), 56)) == 40) { + challenge[32] = 0; + ch_len = 32; + } + memcpy (ptr, challenge, ch_len); + + /* xor challenge bytewise with xor_table */ + table_len = MIN (strlen ((char *) xor_table), 56); + for (i = 0; i < table_len; i++) + ptr[i] = ptr[i] ^ xor_table[i]; + + /* initialize our field */ + BE_32C (field, 0x01234567); + BE_32C (field + 4, 0x89ABCDEF); + BE_32C (field + 8, 0xFEDCBA98); + BE_32C (field + 12, 0x76543210); + BE_32C (field + 16, 0x00000000); + BE_32C (field + 20, 0x00000000); + + /* calculate response */ + call_hash (field, buf, 64); + memset (buf1, 0, 64); + *buf1 = (char) 128; + memcpy (buf2, field + 16, 8); + i = (LE_32 ((buf2)) >> 3) & 0x3f; + if (i < 56) + i = 56 - i; + else + i = 120 - i; + call_hash (field, buf1, i); + call_hash (field, buf2, 8); + memcpy (zres, field, 16); + + /* convert zres to ascii string */ + for (i = 0; i < 16; i++) { + char a, b; + + a = (zres[i] >> 4) & 15; + b = zres[i] & 15; + + response[i * 2] = ((a < 10) ? (a + 48) : (a + 87)) & 255; + response[i * 2 + 1] = ((b < 10) ? (b + 48) : (b + 87)) & 255; + } + + /* add tail */ + resp_len = strlen (response); + strcpy (&response[resp_len], "01d0a8e3"); + + /* calculate checksum */ + for (i = 0; i < resp_len / 4; i++) + chksum[i] = response[i * 4]; +} diff --git a/gst/realmedia/realhash.h b/gst/realmedia/realhash.h new file mode 100644 index 0000000000..40b6500087 --- /dev/null +++ b/gst/realmedia/realhash.h @@ -0,0 +1,31 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RTSP_HASH_H__ +#define __GST_RTSP_HASH_H__ + +G_BEGIN_DECLS + +void +gst_rtsp_ext_real_calc_response_and_checksum (char *response, char *chksum, + char *challenge); + +G_END_DECLS + +#endif /* __GST_RTSP_HASH_H__ */ diff --git a/gst/realmedia/realmedia.c b/gst/realmedia/realmedia.c new file mode 100644 index 0000000000..71749f6334 --- /dev/null +++ b/gst/realmedia/realmedia.c @@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "rmdemux.h" +#include "rademux.h" +#include "rdtdepay.h" +#include "rdtmanager.h" +#include "rtspreal.h" +#include "pnmsrc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (rmdemux, plugin); + ret |= GST_ELEMENT_REGISTER (rademux, plugin); + ret |= GST_ELEMENT_REGISTER (rdtdepay, plugin); + ret |= GST_ELEMENT_REGISTER (rdtmanager, plugin); + ret |= GST_ELEMENT_REGISTER (rtspreal, plugin); + ret |= GST_ELEMENT_REGISTER (pnmsrc, plugin); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + realmedia, + "RealMedia support plugins", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/realmedia/rmdemux.c b/gst/realmedia/rmdemux.c new file mode 100644 index 0000000000..1873cc1028 --- /dev/null +++ b/gst/realmedia/rmdemux.c @@ -0,0 +1,2672 @@ +/* GStreamer RealMedia demuxer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David A. Schleef + * Copyright (C) <2004> Stephane Loeuillet + * Copyright (C) <2005> Owen Fraser-Green + * Copyright (C) <2005> Michael Smith + * Copyright (C) <2006> Wim Taymans + * Copyright (C) <2006> Tim-Philipp Müller + * Copyright (C) <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "rmdemux.h" +#include "rmutils.h" + +#include +#include + +#define RMDEMUX_GUINT32_GET(a) GST_READ_UINT32_BE(a) +#define RMDEMUX_GUINT16_GET(a) GST_READ_UINT16_BE(a) +#define RMDEMUX_FOURCC_GET(a) GST_READ_UINT32_LE(a) +#define HEADER_SIZE 10 +#define DATA_SIZE 8 + +#define MAX_FRAGS 256 + +static const guint8 sipr_subpk_size[4] = { 29, 19, 37, 20 }; + +typedef struct _GstRMDemuxIndex GstRMDemuxIndex; + +struct _GstRMDemuxStream +{ + guint32 subtype; + guint32 fourcc; + guint32 subformat; + guint32 format; + + int id; + GstPad *pad; + gboolean discont; + int timescale; + + int sample_index; + GstRMDemuxIndex *index; + int index_length; + gint framerate_numerator; + gint framerate_denominator; + guint32 seek_offset; + + guint16 width; + guint16 height; + guint16 flavor; + guint16 rate; /* samplerate */ + guint16 n_channels; /* channels */ + guint16 sample_width; /* bits_per_sample */ + guint16 leaf_size; /* subpacket_size */ + guint32 packet_size; /* coded_frame_size */ + guint16 version; + guint32 extra_data_size; /* codec_data_length */ + guint8 *extra_data; /* extras */ + guint32 bitrate; + + gboolean needs_descrambling; + guint subpackets_needed; /* subpackets needed for descrambling */ + GPtrArray *subpackets; /* array containing subpacket GstBuffers */ + + /* Variables needed for fixing timestamps. */ + GstClockTime next_ts, last_ts; + guint16 next_seq, last_seq; + + gint frag_seqnum; + gint frag_subseq; + guint frag_length; + guint frag_current; + guint frag_count; + guint frag_offset[MAX_FRAGS]; + GstAdapter *adapter; + + GstTagList *pending_tags; +}; + +struct _GstRMDemuxIndex +{ + guint32 offset; + GstClockTime timestamp; +}; + +static GstStaticPadTemplate gst_rmdemux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/vnd.rn-realmedia") + ); + +static GstStaticPadTemplate gst_rmdemux_videosrc_template = +GST_STATIC_PAD_TEMPLATE ("video_%u", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_rmdemux_audiosrc_template = +GST_STATIC_PAD_TEMPLATE ("audio_%u", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (rmdemux_debug); +#define GST_CAT_DEFAULT rmdemux_debug + +static GstElementClass *parent_class = NULL; + +static void gst_rmdemux_class_init (GstRMDemuxClass * klass); +static void gst_rmdemux_base_init (GstRMDemuxClass * klass); +static void gst_rmdemux_init (GstRMDemux * rmdemux); +static void gst_rmdemux_finalize (GObject * object); +static GstStateChangeReturn gst_rmdemux_change_state (GstElement * element, + GstStateChange transition); +static GstFlowReturn gst_rmdemux_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static void gst_rmdemux_loop (GstPad * pad); +static gboolean gst_rmdemux_sink_activate (GstPad * sinkpad, + GstObject * parent); +static gboolean gst_rmdemux_sink_activate_mode (GstPad * sinkpad, + GstObject * parent, GstPadMode mode, gboolean active); +static gboolean gst_rmdemux_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_rmdemux_src_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static void gst_rmdemux_send_event (GstRMDemux * rmdemux, GstEvent * event); +static gboolean gst_rmdemux_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); +static gboolean gst_rmdemux_perform_seek (GstRMDemux * rmdemux, + GstEvent * event); + +static void gst_rmdemux_parse__rmf (GstRMDemux * rmdemux, const guint8 * data, + int length); +static void gst_rmdemux_parse_prop (GstRMDemux * rmdemux, const guint8 * data, + int length); +static void gst_rmdemux_parse_mdpr (GstRMDemux * rmdemux, + const guint8 * data, int length); +static guint gst_rmdemux_parse_indx (GstRMDemux * rmdemux, const guint8 * data, + int length); +static void gst_rmdemux_parse_data (GstRMDemux * rmdemux, const guint8 * data, + int length); +static void gst_rmdemux_parse_cont (GstRMDemux * rmdemux, const guint8 * data, + int length); +static GstFlowReturn gst_rmdemux_parse_packet (GstRMDemux * rmdemux, + GstBuffer * in, guint16 version); +static void gst_rmdemux_parse_indx_data (GstRMDemux * rmdemux, + const guint8 * data, int length); +static void gst_rmdemux_stream_clear_cached_subpackets (GstRMDemux * rmdemux, + GstRMDemuxStream * stream); +static GstRMDemuxStream *gst_rmdemux_get_stream_by_id (GstRMDemux * rmdemux, + int id); + +static GType +gst_rmdemux_get_type (void) +{ + static GType rmdemux_type = 0; + + if (!rmdemux_type) { + static const GTypeInfo rmdemux_info = { + sizeof (GstRMDemuxClass), + (GBaseInitFunc) gst_rmdemux_base_init, NULL, + (GClassInitFunc) gst_rmdemux_class_init, + NULL, NULL, sizeof (GstRMDemux), 0, + (GInstanceInitFunc) gst_rmdemux_init, + }; + + rmdemux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRMDemux", &rmdemux_info, + 0); + } + return rmdemux_type; +} + +GST_ELEMENT_REGISTER_DEFINE (rmdemux, "rmdemux", + GST_RANK_PRIMARY, GST_TYPE_RMDEMUX); + +static void +gst_rmdemux_base_init (GstRMDemuxClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rmdemux_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rmdemux_videosrc_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rmdemux_audiosrc_template); + gst_element_class_set_static_metadata (element_class, "RealMedia Demuxer", + "Codec/Demuxer", + "Demultiplex a RealMedia file into audio and video streams", + "David Schleef "); +} + +static void +gst_rmdemux_class_init (GstRMDemuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rmdemux_change_state); + + GST_DEBUG_CATEGORY_INIT (rmdemux_debug, "rmdemux", + 0, "Demuxer for Realmedia streams"); + + gobject_class->finalize = gst_rmdemux_finalize; +} + +static void +gst_rmdemux_finalize (GObject * object) +{ + GstRMDemux *rmdemux = GST_RMDEMUX (object); + + if (rmdemux->adapter) { + g_object_unref (rmdemux->adapter); + rmdemux->adapter = NULL; + } + if (rmdemux->flowcombiner) { + gst_flow_combiner_free (rmdemux->flowcombiner); + rmdemux->flowcombiner = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); +} + +static void +gst_rmdemux_init (GstRMDemux * rmdemux) +{ + rmdemux->sinkpad = + gst_pad_new_from_static_template (&gst_rmdemux_sink_template, "sink"); + gst_pad_set_event_function (rmdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_rmdemux_sink_event)); + gst_pad_set_chain_function (rmdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_rmdemux_chain)); + gst_pad_set_activate_function (rmdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate)); + gst_pad_set_activatemode_function (rmdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_rmdemux_sink_activate_mode)); + + gst_element_add_pad (GST_ELEMENT (rmdemux), rmdemux->sinkpad); + + rmdemux->adapter = gst_adapter_new (); + rmdemux->first_ts = GST_CLOCK_TIME_NONE; + rmdemux->base_ts = GST_CLOCK_TIME_NONE; + rmdemux->need_newsegment = TRUE; + rmdemux->have_group_id = FALSE; + rmdemux->group_id = G_MAXUINT; + rmdemux->flowcombiner = gst_flow_combiner_new (); + rmdemux->seek_seqnum = GST_SEQNUM_INVALID; + + gst_rm_utils_run_tests (); +} + +static gboolean +gst_rmdemux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + gboolean ret; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEGMENT: + gst_event_unref (event); + ret = TRUE; + break; + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + return ret; +} + +static gboolean +gst_rmdemux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + gboolean ret = TRUE; + + GstRMDemux *rmdemux = GST_RMDEMUX (parent); + + GST_LOG_OBJECT (rmdemux, "handling src event"); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + gboolean running; + guint32 seqnum; + + GST_LOG_OBJECT (rmdemux, "Event on src: SEEK"); + + seqnum = gst_event_get_seqnum (event); + if (seqnum == rmdemux->seek_seqnum) { + GST_LOG_OBJECT (pad, + "Drop duplicated SEEK event seqnum %" G_GUINT32_FORMAT, seqnum); + gst_event_unref (event); + break; + } + + /* can't seek if we are not seekable, FIXME could pass the + * seek query upstream after converting it to bytes using + * the average bitrate of the stream. */ + if (!rmdemux->seekable) { + ret = FALSE; + GST_DEBUG ("seek on non seekable stream"); + goto done_unref; + } + + GST_OBJECT_LOCK (rmdemux); + /* check if we can do the seek now */ + running = rmdemux->running; + GST_OBJECT_UNLOCK (rmdemux); + + /* now do the seek */ + if (running) { + ret = gst_rmdemux_perform_seek (rmdemux, event); + } else + ret = TRUE; + + gst_event_unref (event); + break; + } + default: + GST_LOG_OBJECT (rmdemux, "Event on src: type=%d", GST_EVENT_TYPE (event)); + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; + +done_unref: + GST_DEBUG ("error handling event"); + gst_event_unref (event); + return ret; +} + +/* Validate that this looks like a reasonable point to seek to */ +static gboolean +gst_rmdemux_validate_offset (GstRMDemux * rmdemux) +{ + GstBuffer *buffer; + GstFlowReturn flowret; + guint16 version, length; + gboolean ret = TRUE; + GstMapInfo map; + + buffer = NULL; + flowret = gst_pad_pull_range (rmdemux->sinkpad, rmdemux->offset, 4, &buffer); + + if (flowret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (rmdemux, "Failed to pull data at offset %d", + rmdemux->offset); + return FALSE; + } + /* TODO: Can we also be seeking to a 'DATA' chunk header? Check this. + * Also, for the case we currently handle, can we check any more? It's pretty + * sucky to not be validating a little more heavily than this... */ + /* This should now be the start of a data packet header. That begins with + * a 2-byte 'version' field, which has to be 0 or 1, then a length. I'm not + * certain what values are valid for length, but it must always be at least + * 4 bytes, and we can check that it won't take us past our known total size + */ + + gst_buffer_map (buffer, &map, GST_MAP_READ); + version = RMDEMUX_GUINT16_GET (map.data); + if (version != 0 && version != 1) { + GST_DEBUG_OBJECT (rmdemux, "Expected version 0 or 1, got %d", + (int) version); + ret = FALSE; + } + + length = RMDEMUX_GUINT16_GET (map.data + 2); + /* TODO: Also check against total stream length */ + if (length < 4) { + GST_DEBUG_OBJECT (rmdemux, "Expected length >= 4, got %d", (int) length); + ret = FALSE; + } + gst_buffer_unmap (buffer, &map); + + if (ret) { + rmdemux->offset += 4; + gst_adapter_clear (rmdemux->adapter); + gst_adapter_push (rmdemux->adapter, buffer); + } else { + GST_WARNING_OBJECT (rmdemux, "Failed to validate seek offset at %d", + rmdemux->offset); + gst_buffer_unref (buffer); + } + + return ret; +} + +static gboolean +find_seek_offset_bytes (GstRMDemux * rmdemux, guint target) +{ + int i; + GSList *cur; + gboolean ret = FALSE; + + for (cur = rmdemux->streams; cur; cur = cur->next) { + GstRMDemuxStream *stream = cur->data; + + /* Search backwards through this stream's index until we find the first + * timestamp before our target time */ + for (i = stream->index_length - 1; i >= 0; i--) { + if (stream->index[i].offset <= target) { + /* Set the seek_offset for the stream so we don't bother parsing it + * until we've passed that point */ + stream->seek_offset = stream->index[i].offset; + rmdemux->offset = stream->index[i].offset; + ret = TRUE; + break; + } + } + } + return ret; +} + +static gboolean +find_seek_offset_time (GstRMDemux * rmdemux, GstClockTime time) +{ + int i, n_stream; + gboolean ret = FALSE; + GSList *cur; + GstClockTime earliest = GST_CLOCK_TIME_NONE; + + n_stream = 0; + for (cur = rmdemux->streams; cur; cur = cur->next, n_stream++) { + GstRMDemuxStream *stream = cur->data; + + /* Search backwards through this stream's index until we find the first + * timestamp before our target time */ + for (i = stream->index_length - 1; i >= 0; i--) { + if (stream->index[i].timestamp <= time) { + /* Set the seek_offset for the stream so we don't bother parsing it + * until we've passed that point */ + stream->seek_offset = stream->index[i].offset; + + /* If it's also the earliest timestamp we've seen of all streams, then + * that's our target! + */ + if (earliest == GST_CLOCK_TIME_NONE || + stream->index[i].timestamp < earliest) { + earliest = stream->index[i].timestamp; + rmdemux->offset = stream->index[i].offset; + GST_DEBUG_OBJECT (rmdemux, + "We're looking for %" GST_TIME_FORMAT + " and we found that stream %d has the latest index at %" + GST_TIME_FORMAT, GST_TIME_ARGS (rmdemux->segment.start), n_stream, + GST_TIME_ARGS (earliest)); + } + + ret = TRUE; + + break; + } + } + stream->discont = TRUE; + } + return ret; +} + +static gboolean +gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) +{ + gboolean validated; + gboolean ret = TRUE; + gboolean flush; + GstFormat format; + gdouble rate; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + gboolean update; + guint32 seqnum = GST_SEQNUM_INVALID; + GstEvent *fl_event; + + if (event) { + GST_DEBUG_OBJECT (rmdemux, "seek with event"); + + seqnum = gst_event_get_seqnum (event); + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* we can only seek on time */ + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (rmdemux, "can only seek on TIME"); + goto error; + } + /* cannot yet do backwards playback */ + if (rate <= 0.0) { + GST_DEBUG_OBJECT (rmdemux, "can only seek with positive rate, not %lf", + rate); + goto error; + } + } else { + GST_DEBUG_OBJECT (rmdemux, "seek without event"); + + flags = 0; + rate = 1.0; + } + + GST_DEBUG_OBJECT (rmdemux, "seek, rate %g", rate); + + flush = flags & GST_SEEK_FLAG_FLUSH; + + /* first step is to unlock the streaming thread if it is + * blocked in a chain call, we do this by starting the flush. */ + if (flush) { + fl_event = gst_event_new_flush_start (); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_pad_push_event (rmdemux->sinkpad, fl_event); + + fl_event = gst_event_new_flush_start (); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_rmdemux_send_event (rmdemux, fl_event); + } else { + gst_pad_pause_task (rmdemux->sinkpad); + } + + GST_LOG_OBJECT (rmdemux, "Done starting flushes"); + + /* now grab the stream lock so that streaming cannot continue, for + * non flushing seeks when the element is in PAUSED this could block + * forever. */ + GST_PAD_STREAM_LOCK (rmdemux->sinkpad); + + GST_LOG_OBJECT (rmdemux, "Took streamlock"); + + if (event) { + if (!gst_segment_do_seek (&rmdemux->segment, rate, format, flags, + cur_type, cur, stop_type, stop, &update)) { + ret = FALSE; + goto done; + } + + rmdemux->seek_seqnum = seqnum; + } + + GST_DEBUG_OBJECT (rmdemux, "segment positions set to %" GST_TIME_FORMAT "-%" + GST_TIME_FORMAT, GST_TIME_ARGS (rmdemux->segment.start), + GST_TIME_ARGS (rmdemux->segment.stop)); + + /* we need to stop flushing on the sinkpad as we're going to use it + * next. We can do this as we have the STREAM lock now. */ + fl_event = gst_event_new_flush_stop (TRUE); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_pad_push_event (rmdemux->sinkpad, fl_event); + + GST_LOG_OBJECT (rmdemux, "Pushed FLUSH_STOP event"); + + /* For each stream, find the first index offset equal to or before our seek + * target. Of these, find the smallest offset. That's where we seek to. + * + * Then we pull 4 bytes from that offset, and validate that we've seeked to a + * what looks like a plausible packet. + * If that fails, restart, with the seek target set to one less than the + * offset we just tried. If we run out of places to try, treat that as a fatal + * error. + */ + if (!find_seek_offset_time (rmdemux, rmdemux->segment.position)) { + GST_LOG_OBJECT (rmdemux, "Failed to find seek offset by time"); + ret = FALSE; + goto done; + } + + GST_LOG_OBJECT (rmdemux, "Validating offset %u", rmdemux->offset); + validated = gst_rmdemux_validate_offset (rmdemux); + while (!validated) { + GST_INFO_OBJECT (rmdemux, "Failed to validate offset at %u", + rmdemux->offset); + if (!find_seek_offset_bytes (rmdemux, rmdemux->offset - 1)) { + ret = FALSE; + goto done; + } + validated = gst_rmdemux_validate_offset (rmdemux); + } + + GST_LOG_OBJECT (rmdemux, "Found final offset. Excellent!"); + + /* now we have a new position, prepare for streaming again */ + { + /* Reset the demuxer state */ + rmdemux->state = RMDEMUX_STATE_DATA_PACKET; + + if (flush) { + fl_event = gst_event_new_flush_stop (TRUE); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_rmdemux_send_event (rmdemux, fl_event); + } + + /* must send newsegment event from streaming thread, so just set flag */ + rmdemux->need_newsegment = TRUE; + + /* notify start of new segment */ + if (rmdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + GstMessage *msg = + gst_message_new_segment_start (GST_OBJECT_CAST (rmdemux), + GST_FORMAT_TIME, rmdemux->segment.position); + if (seqnum != GST_SEQNUM_INVALID) + gst_message_set_seqnum (msg, seqnum); + gst_element_post_message (GST_ELEMENT_CAST (rmdemux), msg); + } + + /* restart our task since it might have been stopped when we did the + * flush. */ + gst_pad_start_task (rmdemux->sinkpad, (GstTaskFunction) gst_rmdemux_loop, + rmdemux->sinkpad, NULL); + } + +done: + /* streaming can continue now */ + GST_PAD_STREAM_UNLOCK (rmdemux->sinkpad); + + return ret; + +error: + { + GST_DEBUG_OBJECT (rmdemux, "seek failed"); + return FALSE; + } +} + + +static gboolean +gst_rmdemux_src_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + gboolean res = FALSE; + GstRMDemux *rmdemux; + + rmdemux = GST_RMDEMUX (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + GST_DEBUG_OBJECT (rmdemux, "Position query: no idea from demuxer!"); + break; + case GST_QUERY_DURATION:{ + GstFormat fmt; + + gst_query_parse_duration (query, &fmt, NULL); + if (fmt == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (rmdemux); + if (G_LIKELY (rmdemux->running)) { + gst_query_set_duration (query, GST_FORMAT_TIME, rmdemux->duration); + GST_DEBUG_OBJECT (rmdemux, "duration set to %" GST_TIME_FORMAT, + GST_TIME_ARGS (rmdemux->duration)); + res = TRUE; + } + GST_OBJECT_UNLOCK (rmdemux); + } + break; + } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (rmdemux); + if (G_LIKELY (rmdemux->running)) { + gst_query_set_seeking (query, GST_FORMAT_TIME, rmdemux->seekable, + 0, rmdemux->duration); + res = TRUE; + } + GST_OBJECT_UNLOCK (rmdemux); + } + break; + } + case GST_QUERY_SEGMENT: + { + GstFormat format; + gint64 start, stop; + + format = rmdemux->segment.format; + + start = + gst_segment_to_stream_time (&rmdemux->segment, format, + rmdemux->segment.start); + if ((stop = rmdemux->segment.stop) == -1) + stop = rmdemux->segment.duration; + else + stop = gst_segment_to_stream_time (&rmdemux->segment, format, stop); + + gst_query_set_segment (query, rmdemux->segment.rate, format, start, stop); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + +static void +gst_rmdemux_free_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream) +{ + g_object_unref (stream->adapter); + gst_rmdemux_stream_clear_cached_subpackets (rmdemux, stream); + if (stream->pending_tags) + gst_tag_list_unref (stream->pending_tags); + if (stream->subpackets) + g_ptr_array_free (stream->subpackets, TRUE); + g_free (stream->index); + g_free (stream); +} + +static void +gst_rmdemux_reset (GstRMDemux * rmdemux) +{ + GSList *cur; + + GST_OBJECT_LOCK (rmdemux); + rmdemux->running = FALSE; + GST_OBJECT_UNLOCK (rmdemux); + + for (cur = rmdemux->streams; cur; cur = cur->next) { + GstRMDemuxStream *stream = cur->data; + + gst_flow_combiner_remove_pad (rmdemux->flowcombiner, stream->pad); + gst_element_remove_pad (GST_ELEMENT (rmdemux), stream->pad); + gst_rmdemux_free_stream (rmdemux, stream); + } + g_slist_free (rmdemux->streams); + rmdemux->streams = NULL; + rmdemux->n_audio_streams = 0; + rmdemux->n_video_streams = 0; + + if (rmdemux->pending_tags != NULL) { + gst_tag_list_unref (rmdemux->pending_tags); + rmdemux->pending_tags = NULL; + } + + gst_adapter_clear (rmdemux->adapter); + rmdemux->state = RMDEMUX_STATE_HEADER; + rmdemux->have_pads = FALSE; + + gst_segment_init (&rmdemux->segment, GST_FORMAT_UNDEFINED); + rmdemux->first_ts = GST_CLOCK_TIME_NONE; + rmdemux->base_ts = GST_CLOCK_TIME_NONE; + rmdemux->need_newsegment = TRUE; + + rmdemux->have_group_id = FALSE; + rmdemux->group_id = G_MAXUINT; + + rmdemux->seek_seqnum = GST_SEQNUM_INVALID; +} + +static GstStateChangeReturn +gst_rmdemux_change_state (GstElement * element, GstStateChange transition) +{ + GstRMDemux *rmdemux = GST_RMDEMUX (element); + GstStateChangeReturn res; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + rmdemux->state = RMDEMUX_STATE_HEADER; + rmdemux->have_pads = FALSE; + gst_segment_init (&rmdemux->segment, GST_FORMAT_TIME); + rmdemux->running = FALSE; + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY:{ + gst_rmdemux_reset (rmdemux); + break; + } + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return res; +} + +/* this function is called when the pad is activated and should start + * processing data. + * + * We check if we can do random access to decide if we work push or + * pull based. + */ +static gboolean +gst_rmdemux_sink_activate (GstPad * sinkpad, GstObject * parent) +{ + GstQuery *query; + gboolean pull_mode; + + query = gst_query_new_scheduling (); + + if (!gst_pad_peer_query (sinkpad, query)) { + gst_query_unref (query); + goto activate_push; + } + + pull_mode = gst_query_has_scheduling_mode_with_flags (query, + GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); + gst_query_unref (query); + + if (!pull_mode) + goto activate_push; + + GST_DEBUG_OBJECT (sinkpad, "activating pull"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); + +activate_push: + { + GST_DEBUG_OBJECT (sinkpad, "activating push"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); + } +} + +static gboolean +gst_rmdemux_sink_activate_mode (GstPad * sinkpad, GstObject * parent, + GstPadMode mode, gboolean active) +{ + gboolean res; + GstRMDemux *demux; + + demux = GST_RMDEMUX (parent); + + switch (mode) { + case GST_PAD_MODE_PUSH: + demux->seekable = FALSE; + demux->running = active; + res = TRUE; + break; + case GST_PAD_MODE_PULL: + if (active) { + demux->seekable = TRUE; + demux->offset = 0; + demux->loop_state = RMDEMUX_LOOP_STATE_HEADER; + demux->data_offset = G_MAXUINT; + res = + gst_pad_start_task (sinkpad, (GstTaskFunction) gst_rmdemux_loop, + sinkpad, NULL); + } else { + res = gst_pad_stop_task (sinkpad); + } + break; + default: + res = FALSE; + break; + } + return res; +} + + +/* random access mode - just pass over to our chain function */ +static void +gst_rmdemux_loop (GstPad * pad) +{ + GstRMDemux *rmdemux; + GstBuffer *buffer; + GstFlowReturn ret = GST_FLOW_OK; + guint size; + + rmdemux = GST_RMDEMUX (GST_PAD_PARENT (pad)); + + GST_LOG_OBJECT (rmdemux, "loop with state=%d and offset=0x%x", + rmdemux->loop_state, rmdemux->offset); + + switch (rmdemux->state) { + case RMDEMUX_STATE_HEADER: + size = HEADER_SIZE; + break; + case RMDEMUX_STATE_HEADER_DATA: + size = DATA_SIZE; + break; + case RMDEMUX_STATE_DATA_PACKET: + size = rmdemux->avg_packet_size; + break; + case RMDEMUX_STATE_EOS: + GST_LOG_OBJECT (rmdemux, "At EOS, pausing task"); + ret = GST_FLOW_EOS; + goto need_pause; + default: + GST_LOG_OBJECT (rmdemux, "Default: requires %d bytes (state is %d)", + (int) rmdemux->size, rmdemux->state); + size = rmdemux->size; + } + + buffer = NULL; + ret = gst_pad_pull_range (pad, rmdemux->offset, size, &buffer); + if (ret != GST_FLOW_OK) { + if (rmdemux->offset == rmdemux->index_offset) { + /* The index isn't available so forget about it */ + rmdemux->loop_state = RMDEMUX_LOOP_STATE_DATA; + rmdemux->offset = rmdemux->data_offset; + GST_OBJECT_LOCK (rmdemux); + rmdemux->running = TRUE; + rmdemux->seekable = FALSE; + GST_OBJECT_UNLOCK (rmdemux); + return; + } else { + GST_DEBUG_OBJECT (rmdemux, "Unable to pull %d bytes at offset 0x%08x " + "(pull_range returned flow %s, state is %d)", (gint) size, + rmdemux->offset, gst_flow_get_name (ret), GST_STATE (rmdemux)); + goto need_pause; + } + } + + size = gst_buffer_get_size (buffer); + + /* Defer to the chain function */ + ret = gst_rmdemux_chain (pad, GST_OBJECT_CAST (rmdemux), buffer); + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (rmdemux, "Chain flow failed at offset 0x%08x", + rmdemux->offset); + goto need_pause; + } + + rmdemux->offset += size; + + switch (rmdemux->loop_state) { + case RMDEMUX_LOOP_STATE_HEADER: + if (rmdemux->offset >= rmdemux->data_offset) { + /* It's the end of the header */ + rmdemux->loop_state = RMDEMUX_LOOP_STATE_INDEX; + rmdemux->offset = rmdemux->index_offset; + } + break; + case RMDEMUX_LOOP_STATE_INDEX: + if (rmdemux->state == RMDEMUX_STATE_HEADER) { + if (rmdemux->index_offset == 0) { + /* We've read the last index */ + rmdemux->loop_state = RMDEMUX_LOOP_STATE_DATA; + rmdemux->offset = rmdemux->data_offset; + GST_OBJECT_LOCK (rmdemux); + rmdemux->running = TRUE; + GST_OBJECT_UNLOCK (rmdemux); + } else { + /* Get the next index */ + rmdemux->offset = rmdemux->index_offset; + } + } + break; + case RMDEMUX_LOOP_STATE_DATA: + break; + } + + return; + + /* ERRORS */ +need_pause: + { + const gchar *reason = gst_flow_get_name (ret); + + GST_LOG_OBJECT (rmdemux, "pausing task, reason %s", reason); + rmdemux->segment_running = FALSE; + gst_pad_pause_task (rmdemux->sinkpad); + + if (ret == GST_FLOW_EOS) { + /* perform EOS logic */ + if (rmdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gint64 stop; + + /* for segment playback we need to post when (in stream time) + * we stopped, this is either stop (when set) or the duration. */ + if ((stop = rmdemux->segment.stop) == -1) + stop = rmdemux->segment.duration; + + GST_LOG_OBJECT (rmdemux, "Sending segment done, at end of segment"); + gst_element_post_message (GST_ELEMENT (rmdemux), + gst_message_new_segment_done (GST_OBJECT (rmdemux), + GST_FORMAT_TIME, stop)); + gst_rmdemux_send_event (rmdemux, + gst_event_new_segment_done (GST_FORMAT_TIME, stop)); + } else { + /* normal playback, send EOS to all linked pads */ + GST_LOG_OBJECT (rmdemux, "Sending EOS, at end of stream"); + gst_rmdemux_send_event (rmdemux, gst_event_new_eos ()); + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) { + GST_ELEMENT_FLOW_ERROR (rmdemux, ret); + gst_rmdemux_send_event (rmdemux, gst_event_new_eos ()); + } + return; + } +} + +static gboolean +gst_rmdemux_fourcc_isplausible (guint32 fourcc) +{ + int i; + + for (i = 0; i < 4; i++) { + if (!isprint ((int) ((unsigned char *) (&fourcc))[i])) { + return FALSE; + } + } + return TRUE; +} + +static GstFlowReturn +gst_rmdemux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) +{ + GstFlowReturn ret = GST_FLOW_OK; + const guint8 *data; + guint16 version; + guint avail; + + GstRMDemux *rmdemux = GST_RMDEMUX (parent); + + if (rmdemux->base_ts == -1) { + if (GST_BUFFER_DTS_IS_VALID (buffer)) + rmdemux->base_ts = GST_BUFFER_DTS (buffer); + else + rmdemux->base_ts = GST_BUFFER_PTS (buffer); + + GST_LOG_OBJECT (rmdemux, "base_ts %" GST_TIME_FORMAT, + GST_TIME_ARGS (rmdemux->base_ts)); + } + + gst_adapter_push (rmdemux->adapter, buffer); + + GST_LOG_OBJECT (rmdemux, "Chaining buffer of size %" G_GSIZE_FORMAT, + gst_buffer_get_size (buffer)); + + while (TRUE) { + avail = gst_adapter_available (rmdemux->adapter); + + GST_LOG_OBJECT (rmdemux, "looping in chain, avail %u", avail); + switch (rmdemux->state) { + case RMDEMUX_STATE_HEADER: + { + if (gst_adapter_available (rmdemux->adapter) < HEADER_SIZE) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, HEADER_SIZE); + + rmdemux->object_id = RMDEMUX_FOURCC_GET (data + 0); + rmdemux->size = RMDEMUX_GUINT32_GET (data + 4) - HEADER_SIZE; + rmdemux->object_version = RMDEMUX_GUINT16_GET (data + 8); + + /* Sanity-check. We assume that the FOURCC is printable ASCII */ + if (!gst_rmdemux_fourcc_isplausible (rmdemux->object_id)) { + /* Failed. Remain in HEADER state, try again... We flush only + * the actual FOURCC, not the entire header, because we could + * need to resync anywhere at all... really, this should never + * happen. */ + GST_WARNING_OBJECT (rmdemux, "Bogus looking header, unprintable " + "FOURCC"); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, 4); + + break; + } + + GST_LOG_OBJECT (rmdemux, "header found with object_id=%" + GST_FOURCC_FORMAT + " size=%08x object_version=%d", + GST_FOURCC_ARGS (rmdemux->object_id), rmdemux->size, + rmdemux->object_version); + + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, HEADER_SIZE); + + switch (rmdemux->object_id) { + case GST_MAKE_FOURCC ('.', 'R', 'M', 'F'): + rmdemux->state = RMDEMUX_STATE_HEADER_RMF; + break; + case GST_MAKE_FOURCC ('P', 'R', 'O', 'P'): + rmdemux->state = RMDEMUX_STATE_HEADER_PROP; + break; + case GST_MAKE_FOURCC ('M', 'D', 'P', 'R'): + rmdemux->state = RMDEMUX_STATE_HEADER_MDPR; + break; + case GST_MAKE_FOURCC ('I', 'N', 'D', 'X'): + rmdemux->state = RMDEMUX_STATE_HEADER_INDX; + break; + case GST_MAKE_FOURCC ('D', 'A', 'T', 'A'): + rmdemux->state = RMDEMUX_STATE_HEADER_DATA; + break; + case GST_MAKE_FOURCC ('C', 'O', 'N', 'T'): + rmdemux->state = RMDEMUX_STATE_HEADER_CONT; + break; + default: + rmdemux->state = RMDEMUX_STATE_HEADER_UNKNOWN; + break; + } + break; + } + case RMDEMUX_STATE_HEADER_UNKNOWN: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + GST_WARNING_OBJECT (rmdemux, "Unknown object_id %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (rmdemux->object_id)); + + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_HEADER_RMF: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + if ((rmdemux->object_version == 0) || (rmdemux->object_version == 1)) { + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse__rmf (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + } else { + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + } + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_HEADER_PROP: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse_prop (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_HEADER_MDPR: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse_mdpr (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_HEADER_CONT: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse_cont (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_HEADER_DATA: + { + /* If we haven't already done so then signal there are no more pads */ + if (!rmdemux->have_pads) { + GST_LOG_OBJECT (rmdemux, "no more pads"); + gst_element_no_more_pads (GST_ELEMENT (rmdemux)); + rmdemux->have_pads = TRUE; + } + + /* The actual header is only 8 bytes */ + rmdemux->size = DATA_SIZE; + GST_LOG_OBJECT (rmdemux, "data available %" G_GSIZE_FORMAT, + gst_adapter_available (rmdemux->adapter)); + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse_data (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + + rmdemux->state = RMDEMUX_STATE_DATA_PACKET; + break; + } + case RMDEMUX_STATE_HEADER_INDX: + { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + rmdemux->size = gst_rmdemux_parse_indx (rmdemux, data, rmdemux->size); + /* Only flush the header */ + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, HEADER_SIZE); + + rmdemux->state = RMDEMUX_STATE_INDX_DATA; + break; + } + case RMDEMUX_STATE_INDX_DATA: + { + /* There's not always an data to get... */ + if (rmdemux->size > 0) { + if (gst_adapter_available (rmdemux->adapter) < rmdemux->size) + goto unlock; + + data = gst_adapter_map (rmdemux->adapter, rmdemux->size); + gst_rmdemux_parse_indx_data (rmdemux, data, rmdemux->size); + gst_adapter_unmap (rmdemux->adapter); + gst_adapter_flush (rmdemux->adapter, rmdemux->size); + } + + rmdemux->state = RMDEMUX_STATE_HEADER; + break; + } + case RMDEMUX_STATE_DATA_PACKET: + { + guint8 header[4]; + + if (gst_adapter_available (rmdemux->adapter) < 2) + goto unlock; + + gst_adapter_copy (rmdemux->adapter, header, 0, 2); + version = RMDEMUX_GUINT16_GET (header); + GST_LOG_OBJECT (rmdemux, "Data packet with version=%d", version); + + if (version == 0 || version == 1) { + guint16 length; + + if (gst_adapter_available (rmdemux->adapter) < 4) + goto unlock; + + gst_adapter_copy (rmdemux->adapter, header, 0, 4); + + length = RMDEMUX_GUINT16_GET (header + 2); + GST_LOG_OBJECT (rmdemux, "Got length %d", length); + + if (length < 4) { + GST_LOG_OBJECT (rmdemux, "length too small, dropping"); + /* Invalid, just drop it */ + gst_adapter_flush (rmdemux->adapter, 4); + } else { + GstBuffer *buffer; + + avail = gst_adapter_available (rmdemux->adapter); + if (avail < length) + goto unlock; + + GST_LOG_OBJECT (rmdemux, "we have %u available and we needed %d", + avail, length); + + /* flush version and length */ + gst_adapter_flush (rmdemux->adapter, 4); + length -= 4; + + buffer = gst_adapter_take_buffer (rmdemux->adapter, length); + + ret = gst_rmdemux_parse_packet (rmdemux, buffer, version); + rmdemux->chunk_index++; + } + + if (rmdemux->chunk_index == rmdemux->n_chunks || length == 0) + rmdemux->state = RMDEMUX_STATE_HEADER; + } else { + /* Stream done */ + gst_adapter_flush (rmdemux->adapter, 2); + + if (rmdemux->data_offset == 0) { + GST_LOG_OBJECT (rmdemux, + "No further data, internal demux state EOS"); + rmdemux->state = RMDEMUX_STATE_EOS; + } else + rmdemux->state = RMDEMUX_STATE_HEADER; + } + break; + } + case RMDEMUX_STATE_EOS: + gst_rmdemux_send_event (rmdemux, gst_event_new_eos ()); + goto unlock; + default: + GST_WARNING_OBJECT (rmdemux, "Unhandled state %d", rmdemux->state); + goto unlock; + } + } + +unlock: + return ret; +} + +static GstRMDemuxStream * +gst_rmdemux_get_stream_by_id (GstRMDemux * rmdemux, int id) +{ + GSList *cur; + + for (cur = rmdemux->streams; cur; cur = cur->next) { + GstRMDemuxStream *stream = cur->data; + + if (stream->id == id) { + return stream; + } + } + + return NULL; +} + +static void +gst_rmdemux_send_event (GstRMDemux * rmdemux, GstEvent * event) +{ + GSList *cur; + + for (cur = rmdemux->streams; cur; cur = cur->next) { + GstRMDemuxStream *stream = cur->data; + + GST_DEBUG_OBJECT (rmdemux, "Pushing %s event on pad %s", + GST_EVENT_TYPE_NAME (event), GST_PAD_NAME (stream->pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + stream->last_ts = -1; + stream->next_ts = -1; + stream->last_seq = -1; + stream->next_seq = -1; + break; + default: + break; + } + gst_event_ref (event); + gst_pad_push_event (stream->pad, event); + } + gst_event_unref (event); +} + +static void +gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream) +{ + GstCaps *stream_caps = NULL; + const gchar *codec_tag = NULL; + gchar *codec_name = NULL; + gchar *stream_id; + int version = 0; + + if (stream->subtype == GST_RMDEMUX_STREAM_VIDEO) { + char *name = g_strdup_printf ("video_%u", rmdemux->n_video_streams); + + stream->pad = + gst_pad_new_from_static_template (&gst_rmdemux_videosrc_template, name); + g_free (name); + + codec_tag = GST_TAG_VIDEO_CODEC; + + switch (stream->fourcc) { + case GST_RM_VDO_RV10: + version = 1; + break; + case GST_RM_VDO_RV20: + version = 2; + break; + case GST_RM_VDO_RV30: + version = 3; + break; + case GST_RM_VDO_RV40: + version = 4; + break; + default: + stream_caps = gst_caps_new_simple ("video/x-unknown-fourcc", + "fourcc", G_TYPE_UINT, stream->fourcc, NULL); + GST_WARNING_OBJECT (rmdemux, + "Unknown video FOURCC code \"%" GST_FOURCC_FORMAT "\" (%08x)", + GST_FOURCC_ARGS (stream->fourcc), stream->fourcc); + } + + if (version) { + stream_caps = + gst_caps_new_simple ("video/x-pn-realvideo", "rmversion", G_TYPE_INT, + (int) version, + "format", G_TYPE_INT, + (int) stream->format, + "subformat", G_TYPE_INT, (int) stream->subformat, NULL); + } + + if (stream_caps) { + gst_caps_set_simple (stream_caps, + "width", G_TYPE_INT, stream->width, + "height", G_TYPE_INT, stream->height, + "framerate", GST_TYPE_FRACTION, stream->framerate_numerator, + stream->framerate_denominator, NULL); + } + rmdemux->n_video_streams++; + + } else if (stream->subtype == GST_RMDEMUX_STREAM_AUDIO) { + char *name = g_strdup_printf ("audio_%u", rmdemux->n_audio_streams); + + stream->pad = + gst_pad_new_from_static_template (&gst_rmdemux_audiosrc_template, name); + GST_LOG_OBJECT (rmdemux, "Created audio pad \"%s\"", name); + g_free (name); + + codec_tag = GST_TAG_AUDIO_CODEC; + + switch (stream->fourcc) { + /* Older RealAudio Codecs */ + case GST_RM_AUD_14_4: + version = 1; + break; + + case GST_RM_AUD_28_8: + version = 2; + break; + + /* DolbyNet (Dolby AC3, low bitrate) */ + case GST_RM_AUD_DNET: + stream_caps = + gst_caps_new_simple ("audio/x-ac3", "rate", G_TYPE_INT, + (int) stream->rate, NULL); + stream->needs_descrambling = TRUE; + stream->subpackets_needed = 1; + stream->subpackets = NULL; + break; + + /* MPEG-4 based */ + case GST_RM_AUD_RAAC: + case GST_RM_AUD_RACP: + stream_caps = + gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, + (int) 4, "framed", G_TYPE_BOOLEAN, TRUE, NULL); + if (stream->extra_data_size > 0) { + /* strip off an unknown byte in the extra data */ + stream->extra_data_size--; + stream->extra_data++; + } + stream->needs_descrambling = TRUE; + stream->subpackets_needed = 1; + stream->subpackets = NULL; + break; + + /* Sony ATRAC3 */ + case GST_RM_AUD_ATRC: + stream_caps = gst_caps_new_empty_simple ("audio/x-vnd.sony.atrac3"); + stream->needs_descrambling = TRUE; + stream->subpackets_needed = stream->height; + stream->subpackets = NULL; + break; + + /* RealAudio G2 audio */ + case GST_RM_AUD_COOK: + version = 8; + stream->needs_descrambling = TRUE; + stream->subpackets_needed = stream->height; + stream->subpackets = NULL; + break; + + /* RALF is lossless */ + case GST_RM_AUD_RALF: + GST_DEBUG_OBJECT (rmdemux, "RALF"); + stream_caps = gst_caps_new_empty_simple ("audio/x-ralf-mpeg4-generic"); + break; + + case GST_RM_AUD_SIPR: + + if (stream->flavor > 3) { + GST_WARNING_OBJECT (rmdemux, "bad SIPR flavor %d, freeing it", + stream->flavor); + g_object_unref (stream->pad); + gst_rmdemux_free_stream (rmdemux, stream); + goto beach; + } + + GST_DEBUG_OBJECT (rmdemux, "SIPR"); + stream_caps = gst_caps_new_empty_simple ("audio/x-sipro"); + stream->needs_descrambling = TRUE; + stream->subpackets_needed = stream->height; + stream->subpackets = NULL; + stream->leaf_size = sipr_subpk_size[stream->flavor]; + + break; + + default: + stream_caps = gst_caps_new_simple ("video/x-unknown-fourcc", + "fourcc", G_TYPE_UINT, stream->fourcc, NULL); + GST_WARNING_OBJECT (rmdemux, + "Unknown audio FOURCC code \"%" GST_FOURCC_FORMAT "\" (%08x)", + GST_FOURCC_ARGS (stream->fourcc), stream->fourcc); + break; + } + + if (version) { + stream_caps = + gst_caps_new_simple ("audio/x-pn-realaudio", "raversion", G_TYPE_INT, + (int) version, NULL); + } + + if (stream_caps) { + gst_caps_set_simple (stream_caps, + "flavor", G_TYPE_INT, (int) stream->flavor, + "rate", G_TYPE_INT, (int) stream->rate, + "channels", G_TYPE_INT, (int) stream->n_channels, + "width", G_TYPE_INT, (int) stream->sample_width, + "leaf_size", G_TYPE_INT, (int) stream->leaf_size, + "packet_size", G_TYPE_INT, (int) stream->packet_size, + "bitrate", G_TYPE_INT, (int) stream->bitrate, + "height", G_TYPE_INT, (int) stream->height, NULL); + } + rmdemux->n_audio_streams++; + } else { + GST_WARNING_OBJECT (rmdemux, "not adding stream of type %d, freeing it", + stream->subtype); + gst_rmdemux_free_stream (rmdemux, stream); + goto beach; + } + + GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; + rmdemux->streams = g_slist_append (rmdemux->streams, stream); + GST_LOG_OBJECT (rmdemux, "n_streams is now %d", + g_slist_length (rmdemux->streams)); + + GST_LOG ("stream->pad = %p, stream_caps = %" GST_PTR_FORMAT, stream->pad, + stream_caps); + + if (stream->pad && stream_caps) { + GstEvent *event; + + GST_LOG_OBJECT (rmdemux, "%d bytes of extra data for stream %s", + stream->extra_data_size, GST_PAD_NAME (stream->pad)); + + /* add codec_data if there is any */ + if (stream->extra_data_size > 0) { + GstBuffer *buffer; + + buffer = gst_buffer_new_and_alloc (stream->extra_data_size); + gst_buffer_fill (buffer, 0, stream->extra_data, stream->extra_data_size); + + gst_caps_set_simple (stream_caps, "codec_data", GST_TYPE_BUFFER, + buffer, NULL); + + gst_buffer_unref (buffer); + } + + gst_pad_use_fixed_caps (stream->pad); + + gst_pad_set_event_function (stream->pad, + GST_DEBUG_FUNCPTR (gst_rmdemux_src_event)); + gst_pad_set_query_function (stream->pad, + GST_DEBUG_FUNCPTR (gst_rmdemux_src_query)); + + GST_DEBUG_OBJECT (rmdemux, "adding pad %s with caps %" GST_PTR_FORMAT + ", stream_id=%d", GST_PAD_NAME (stream->pad), stream_caps, stream->id); + gst_pad_set_active (stream->pad, TRUE); + + stream_id = + gst_pad_create_stream_id_printf (stream->pad, + GST_ELEMENT_CAST (rmdemux), "%03u", stream->id); + + event = + gst_pad_get_sticky_event (rmdemux->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &rmdemux->group_id)) + rmdemux->have_group_id = TRUE; + else + rmdemux->have_group_id = FALSE; + gst_event_unref (event); + } else if (!rmdemux->have_group_id) { + rmdemux->have_group_id = TRUE; + rmdemux->group_id = gst_util_group_id_next (); + } + + event = gst_event_new_stream_start (stream_id); + if (rmdemux->have_group_id) + gst_event_set_group_id (event, rmdemux->group_id); + + gst_pad_push_event (stream->pad, event); + g_free (stream_id); + + gst_pad_set_caps (stream->pad, stream_caps); + + codec_name = gst_pb_utils_get_codec_description (stream_caps); + + /* save for later, we must send the tags after the newsegment event */ + if (codec_tag != NULL && codec_name != NULL) { + if (stream->pending_tags == NULL) + stream->pending_tags = gst_tag_list_new_empty (); + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_KEEP, + codec_tag, codec_name, NULL); + g_free (codec_name); + } + gst_element_add_pad (GST_ELEMENT_CAST (rmdemux), stream->pad); + gst_flow_combiner_add_pad (rmdemux->flowcombiner, stream->pad); + } + +beach: + + if (stream_caps) + gst_caps_unref (stream_caps); +} + +static int +re_skip_pascal_string (const guint8 * ptr) +{ + int length; + + length = ptr[0]; + + return length + 1; +} + +static void +gst_rmdemux_parse__rmf (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + GST_LOG_OBJECT (rmdemux, "file_version: %d", RMDEMUX_GUINT32_GET (data)); + GST_LOG_OBJECT (rmdemux, "num_headers: %d", RMDEMUX_GUINT32_GET (data + 4)); +} + +static void +gst_rmdemux_parse_prop (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + GST_LOG_OBJECT (rmdemux, "max bitrate: %d", RMDEMUX_GUINT32_GET (data)); + GST_LOG_OBJECT (rmdemux, "avg bitrate: %d", RMDEMUX_GUINT32_GET (data + 4)); + GST_LOG_OBJECT (rmdemux, "max packet size: %d", + RMDEMUX_GUINT32_GET (data + 8)); + rmdemux->avg_packet_size = RMDEMUX_GUINT32_GET (data + 12); + GST_LOG_OBJECT (rmdemux, "avg packet size: %d", rmdemux->avg_packet_size); + rmdemux->num_packets = RMDEMUX_GUINT32_GET (data + 16); + GST_LOG_OBJECT (rmdemux, "number of packets: %d", rmdemux->num_packets); + + GST_LOG_OBJECT (rmdemux, "duration: %d", RMDEMUX_GUINT32_GET (data + 20)); + rmdemux->duration = RMDEMUX_GUINT32_GET (data + 20) * GST_MSECOND; + + GST_LOG_OBJECT (rmdemux, "preroll: %d", RMDEMUX_GUINT32_GET (data + 24)); + rmdemux->index_offset = RMDEMUX_GUINT32_GET (data + 28); + GST_LOG_OBJECT (rmdemux, "offset of INDX section: 0x%08x", + rmdemux->index_offset); + rmdemux->data_offset = RMDEMUX_GUINT32_GET (data + 32); + GST_LOG_OBJECT (rmdemux, "offset of DATA section: 0x%08x", + rmdemux->data_offset); + GST_LOG_OBJECT (rmdemux, "n streams: %d", RMDEMUX_GUINT16_GET (data + 36)); + GST_LOG_OBJECT (rmdemux, "flags: 0x%04x", RMDEMUX_GUINT16_GET (data + 38)); +} + +static void +gst_rmdemux_parse_mdpr (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + GstRMDemuxStream *stream; + char *stream1_type_string; + char *stream2_type_string; + guint str_len = 0; + int stream_type; + int offset; + guint32 max_bitrate; + guint32 avg_bitrate; + + stream = g_new0 (GstRMDemuxStream, 1); + + stream->id = RMDEMUX_GUINT16_GET (data); + stream->index = NULL; + stream->seek_offset = 0; + stream->last_ts = -1; + stream->next_ts = -1; + stream->discont = TRUE; + stream->adapter = gst_adapter_new (); + GST_LOG_OBJECT (rmdemux, "stream_number=%d", stream->id); + + /* parse the bitrates */ + max_bitrate = RMDEMUX_GUINT32_GET (data + 2); + avg_bitrate = RMDEMUX_GUINT32_GET (data + 6); + stream->bitrate = avg_bitrate; + GST_LOG_OBJECT (rmdemux, "Stream max bitrate=%u", max_bitrate); + GST_LOG_OBJECT (rmdemux, "Stream avg bitrate=%u", avg_bitrate); + if (max_bitrate != 0) { + if (stream->pending_tags == NULL) + stream->pending_tags = gst_tag_list_new_empty (); + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate, NULL); + } + if (avg_bitrate != 0) { + if (stream->pending_tags == NULL) + stream->pending_tags = gst_tag_list_new_empty (); + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, avg_bitrate, NULL); + } + + offset = 30; + stream1_type_string = gst_rm_utils_read_string8 (data + offset, + length - offset, &str_len); + offset += str_len; + stream2_type_string = gst_rm_utils_read_string8 (data + offset, + length - offset, &str_len); + offset += str_len; + + /* stream1_type_string for audio and video stream is a "put_whatever_you_want" field : + * observed values : + * - "[The ]Video/Audio Stream" (File produced by an official Real encoder) + * - "RealVideoPremierePlugIn-VIDEO/AUDIO" (File produced by Abobe Premiere) + * + * so, we should not rely on it to know which stream type it is + */ + + GST_LOG_OBJECT (rmdemux, "stream type: %s", stream1_type_string); + GST_LOG_OBJECT (rmdemux, "MIME type=%s", stream2_type_string); + + if (strcmp (stream2_type_string, "video/x-pn-realvideo") == 0) { + stream_type = GST_RMDEMUX_STREAM_VIDEO; + } else if (strcmp (stream2_type_string, + "video/x-pn-multirate-realvideo") == 0) { + stream_type = GST_RMDEMUX_STREAM_VIDEO; + } else if (strcmp (stream2_type_string, "audio/x-pn-realaudio") == 0) { + stream_type = GST_RMDEMUX_STREAM_AUDIO; + } else if (strcmp (stream2_type_string, + "audio/x-pn-multirate-realaudio") == 0) { + stream_type = GST_RMDEMUX_STREAM_AUDIO; + } else if (strcmp (stream2_type_string, + "audio/x-pn-multirate-realaudio-live") == 0) { + stream_type = GST_RMDEMUX_STREAM_AUDIO; + } else if (strcmp (stream2_type_string, "audio/x-ralf-mpeg4-generic") == 0) { + /* Another audio type found in the real testsuite */ + stream_type = GST_RMDEMUX_STREAM_AUDIO; + } else if (strcmp (stream1_type_string, "") == 0 && + strcmp (stream2_type_string, "logical-fileinfo") == 0) { + stream_type = GST_RMDEMUX_STREAM_FILEINFO; + } else { + stream_type = GST_RMDEMUX_STREAM_UNKNOWN; + GST_WARNING_OBJECT (rmdemux, "unknown stream type \"%s\",\"%s\"", + stream1_type_string, stream2_type_string); + } + g_free (stream1_type_string); + g_free (stream2_type_string); + + offset += 4; + + stream->subtype = stream_type; + switch (stream_type) { + + case GST_RMDEMUX_STREAM_VIDEO: + /* RV10/RV20/RV30/RV40 => video/x-pn-realvideo, version=1,2,3,4 */ + stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 8); + stream->width = RMDEMUX_GUINT16_GET (data + offset + 12); + stream->height = RMDEMUX_GUINT16_GET (data + offset + 14); + stream->rate = RMDEMUX_GUINT16_GET (data + offset + 16); + stream->subformat = RMDEMUX_GUINT32_GET (data + offset + 26); + stream->format = RMDEMUX_GUINT32_GET (data + offset + 30); + stream->extra_data_size = length - (offset + 26); + stream->extra_data = (guint8 *) data + offset + 26; + /* Natural way to represent framerates here requires unsigned 32 bit + * numerator, which we don't have. For the nasty case, approximate... + */ + { + guint32 numerator = RMDEMUX_GUINT16_GET (data + offset + 22) * 65536 + + RMDEMUX_GUINT16_GET (data + offset + 24); + if (numerator > G_MAXINT) { + stream->framerate_numerator = (gint) (numerator >> 1); + stream->framerate_denominator = 32768; + } else { + stream->framerate_numerator = (gint) numerator; + stream->framerate_denominator = 65536; + } + } + + GST_DEBUG_OBJECT (rmdemux, + "Video stream with fourcc=%" GST_FOURCC_FORMAT + " width=%d height=%d rate=%d framerate=%d/%d subformat=%x format=%x extra_data_size=%d", + GST_FOURCC_ARGS (stream->fourcc), stream->width, stream->height, + stream->rate, stream->framerate_numerator, + stream->framerate_denominator, stream->subformat, stream->format, + stream->extra_data_size); + break; + case GST_RMDEMUX_STREAM_AUDIO:{ + stream->version = RMDEMUX_GUINT16_GET (data + offset + 4); + GST_INFO ("stream version = %u", stream->version); + switch (stream->version) { + case 3: + stream->fourcc = GST_RM_AUD_14_4; + stream->packet_size = 20; + stream->rate = 8000; + stream->n_channels = 1; + stream->sample_width = 16; + stream->flavor = 1; + stream->leaf_size = 0; + stream->height = 0; + break; + case 4: + stream->flavor = RMDEMUX_GUINT16_GET (data + offset + 22); + stream->packet_size = RMDEMUX_GUINT32_GET (data + offset + 24); + /* stream->frame_size = RMDEMUX_GUINT32_GET (data + offset + 42); */ + stream->leaf_size = RMDEMUX_GUINT16_GET (data + offset + 44); + stream->height = RMDEMUX_GUINT16_GET (data + offset + 40); + stream->rate = RMDEMUX_GUINT16_GET (data + offset + 48); + stream->sample_width = RMDEMUX_GUINT16_GET (data + offset + 52); + stream->n_channels = RMDEMUX_GUINT16_GET (data + offset + 54); + stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 62); + stream->extra_data_size = RMDEMUX_GUINT32_GET (data + offset + 69); + GST_DEBUG_OBJECT (rmdemux, "%u bytes of extra codec data", + stream->extra_data_size); + if (length - (offset + 73) >= stream->extra_data_size) { + stream->extra_data = (guint8 *) data + offset + 73; + } else { + GST_WARNING_OBJECT (rmdemux, "codec data runs beyond MDPR chunk"); + stream->extra_data_size = 0; + } + break; + case 5: + stream->flavor = RMDEMUX_GUINT16_GET (data + offset + 22); + stream->packet_size = RMDEMUX_GUINT32_GET (data + offset + 24); + /* stream->frame_size = RMDEMUX_GUINT32_GET (data + offset + 42); */ + stream->leaf_size = RMDEMUX_GUINT16_GET (data + offset + 44); + stream->height = RMDEMUX_GUINT16_GET (data + offset + 40); + stream->rate = RMDEMUX_GUINT16_GET (data + offset + 54); + stream->sample_width = RMDEMUX_GUINT16_GET (data + offset + 58); + stream->n_channels = RMDEMUX_GUINT16_GET (data + offset + 60); + stream->fourcc = RMDEMUX_FOURCC_GET (data + offset + 66); + stream->extra_data_size = RMDEMUX_GUINT32_GET (data + offset + 74); + GST_DEBUG_OBJECT (rmdemux, "%u bytes of extra codec data", + stream->extra_data_size); + if (length - (offset + 78) >= stream->extra_data_size) { + stream->extra_data = (guint8 *) data + offset + 78; + } else { + GST_WARNING_OBJECT (rmdemux, "codec data runs beyond MDPR chunk"); + stream->extra_data_size = 0; + } + break; + default:{ + GST_WARNING_OBJECT (rmdemux, "Unhandled audio stream version %d", + stream->version); + break; + } + } + /* 14_4, 28_8, cook, dnet, sipr, raac, racp, ralf, atrc */ + GST_DEBUG_OBJECT (rmdemux, + "Audio stream with rate=%d sample_width=%d n_channels=%d", + stream->rate, stream->sample_width, stream->n_channels); + + break; + } + case GST_RMDEMUX_STREAM_FILEINFO: + { + int element_nb; + + /* Length of this section */ + GST_DEBUG_OBJECT (rmdemux, "length2: 0x%08x", + RMDEMUX_GUINT32_GET (data + offset)); + offset += 4; + + /* Unknown : 00 00 00 00 */ + offset += 4; + + /* Number of variables that would follow (loop iterations) */ + element_nb = RMDEMUX_GUINT32_GET (data + offset); + offset += 4; + + while (element_nb) { + /* Category Id : 00 00 00 XX 00 00 */ + offset += 6; + + /* Variable Name */ + offset += re_skip_pascal_string (data + offset); + + /* Variable Value Type */ + /* 00 00 00 00 00 => integer/boolean, preceded by length */ + /* 00 00 00 02 00 => pascal string, preceded by length, no trailing \0 */ + offset += 5; + + /* Variable Value */ + offset += re_skip_pascal_string (data + offset); + + element_nb--; + } + } + break; + case GST_RMDEMUX_STREAM_UNKNOWN: + default: + break; + } + + gst_rmdemux_add_stream (rmdemux, stream); +} + +static guint +gst_rmdemux_parse_indx (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + int n; + int id; + + n = RMDEMUX_GUINT32_GET (data); + id = RMDEMUX_GUINT16_GET (data + 4); + rmdemux->index_offset = RMDEMUX_GUINT32_GET (data + 6); + + GST_DEBUG_OBJECT (rmdemux, "Number of indices=%d Stream ID=%d length=%d", n, + id, length); + + /* Point to the next index_stream */ + rmdemux->index_stream = gst_rmdemux_get_stream_by_id (rmdemux, id); + + /* Return the length of the index */ + return 14 * n; +} + +static void +gst_rmdemux_parse_indx_data (GstRMDemux * rmdemux, const guint8 * data, + int length) +{ + int i; + int n; + GstRMDemuxIndex *index; + + /* The number of index records */ + n = length / 14; + + if (rmdemux->index_stream == NULL) + return; + + /* don't parse the index a second time when operating pull-based and + * reaching the end of the file */ + if (rmdemux->index_stream->index_length > 0) { + GST_DEBUG_OBJECT (rmdemux, "Already have an index for this stream"); + return; + } + + index = g_malloc (sizeof (GstRMDemuxIndex) * n); + rmdemux->index_stream->index = index; + rmdemux->index_stream->index_length = n; + + for (i = 0; i < n; i++) { + index[i].timestamp = RMDEMUX_GUINT32_GET (data + 2) * GST_MSECOND; + index[i].offset = RMDEMUX_GUINT32_GET (data + 6); + + GST_DEBUG_OBJECT (rmdemux, "Index found for timestamp=%f (at offset=%x)", + gst_guint64_to_gdouble (index[i].timestamp) / GST_SECOND, + index[i].offset); + data += 14; + } +} + +static void +gst_rmdemux_parse_data (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + rmdemux->n_chunks = RMDEMUX_GUINT32_GET (data); + rmdemux->data_offset = RMDEMUX_GUINT32_GET (data + 4); + rmdemux->chunk_index = 0; + GST_DEBUG_OBJECT (rmdemux, "Data chunk found with %d packets " + "(next data at 0x%08x)", rmdemux->n_chunks, rmdemux->data_offset); +} + +static void +gst_rmdemux_parse_cont (GstRMDemux * rmdemux, const guint8 * data, int length) +{ + GstTagList *tags; + + tags = gst_rm_utils_read_tags (data, length, gst_rm_utils_read_string16); + + if (tags) { + GstTagList *old_tags = rmdemux->pending_tags; + + GST_LOG_OBJECT (rmdemux, "tags: %" GST_PTR_FORMAT, tags); + + rmdemux->pending_tags = + gst_tag_list_merge (old_tags, tags, GST_TAG_MERGE_APPEND); + + gst_tag_list_unref (tags); + if (old_tags) + gst_tag_list_unref (old_tags); + + gst_tag_list_set_scope (rmdemux->pending_tags, GST_TAG_SCOPE_GLOBAL); + } +} + +static void +gst_rmdemux_stream_clear_cached_subpackets (GstRMDemux * rmdemux, + GstRMDemuxStream * stream) +{ + if (stream->subpackets == NULL || stream->subpackets->len == 0) + return; + + GST_DEBUG_OBJECT (rmdemux, "discarding %u previously collected subpackets", + stream->subpackets->len); + g_ptr_array_foreach (stream->subpackets, (GFunc) gst_mini_object_unref, NULL); + g_ptr_array_set_size (stream->subpackets, 0); +} + +static GstFlowReturn +gst_rmdemux_descramble_audio (GstRMDemux * rmdemux, GstRMDemuxStream * stream) +{ + GstFlowReturn ret = GST_FLOW_ERROR; + GstBuffer *outbuf; + GstMapInfo outmap; + guint packet_size = stream->packet_size; + guint height = stream->subpackets->len; + guint leaf_size = stream->leaf_size; + guint p, x; + + g_assert (stream->height == height); + + GST_LOG ("packet_size = %u, leaf_size = %u, height= %u", packet_size, + leaf_size, height); + + outbuf = gst_buffer_new_and_alloc (height * packet_size); + gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); + + for (p = 0; p < height; ++p) { + GstBuffer *b = g_ptr_array_index (stream->subpackets, p); + GstMapInfo map; + + gst_buffer_map (b, &map, GST_MAP_READ); + + if (p == 0) { + GST_BUFFER_PTS (outbuf) = GST_BUFFER_PTS (b); + GST_BUFFER_DTS (outbuf) = GST_BUFFER_DTS (b); + } + + for (x = 0; x < packet_size / leaf_size; ++x) { + guint idx; + + idx = height * x + ((height + 1) / 2) * (p % 2) + (p / 2); + + /* GST_LOG ("%3u => %3u", (height * p) + x, idx); */ + memcpy (outmap.data + leaf_size * idx, map.data + leaf_size * x, + leaf_size); + } + gst_buffer_unmap (b, &map); + } + gst_buffer_unmap (outbuf, &outmap); + + /* some decoders, such as realaudiodec, need to be fed in packet units */ + for (p = 0; p < height; ++p) { + GstBuffer *subbuf; + + subbuf = + gst_buffer_copy_region (outbuf, GST_BUFFER_COPY_ALL, p * packet_size, + packet_size); + + GST_LOG_OBJECT (rmdemux, "pushing buffer dts %" GST_TIME_FORMAT ", pts %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_DTS (subbuf)), + GST_TIME_ARGS (GST_BUFFER_PTS (subbuf))); + + if (stream->discont) { + GST_BUFFER_FLAG_SET (subbuf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + ret = gst_pad_push (stream->pad, subbuf); + if (ret != GST_FLOW_OK) + break; + } + + gst_buffer_unref (outbuf); + + gst_rmdemux_stream_clear_cached_subpackets (rmdemux, stream); + + return ret; +} + +static GstFlowReturn +gst_rmdemux_descramble_dnet_audio (GstRMDemux * rmdemux, + GstRMDemuxStream * stream) +{ + GstBuffer *buf; + + buf = g_ptr_array_index (stream->subpackets, 0); + g_ptr_array_index (stream->subpackets, 0) = NULL; + g_ptr_array_set_size (stream->subpackets, 0); + + buf = gst_rm_utils_descramble_dnet_buffer (buf); + + if (stream->discont) { + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + return gst_pad_push (stream->pad, buf); +} + +static GstFlowReturn +gst_rmdemux_descramble_mp4a_audio (GstRMDemux * rmdemux, + GstRMDemuxStream * stream) +{ + GstFlowReturn res; + GstBuffer *buf, *outbuf; + guint frames, index, i; + GstMapInfo map; + GstClockTime timestamp; + + res = GST_FLOW_OK; + + buf = g_ptr_array_index (stream->subpackets, 0); + g_ptr_array_index (stream->subpackets, 0) = NULL; + g_ptr_array_set_size (stream->subpackets, 0); + + gst_buffer_map (buf, &map, GST_MAP_READ); + timestamp = GST_BUFFER_PTS (buf); + + frames = (map.data[1] & 0xf0) >> 4; + index = 2 * frames + 2; + + for (i = 0; i < frames; i++) { + guint len = (map.data[i * 2 + 2] << 8) | map.data[i * 2 + 3]; + + outbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, index, len); + if (i == 0) { + GST_BUFFER_PTS (outbuf) = timestamp; + GST_BUFFER_DTS (outbuf) = timestamp; + } + + index += len; + + if (stream->discont) { + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + res = gst_pad_push (stream->pad, outbuf); + if (res != GST_FLOW_OK) + break; + } + gst_buffer_unmap (buf, &map); + gst_buffer_unref (buf); + return res; +} + +static GstFlowReturn +gst_rmdemux_descramble_sipr_audio (GstRMDemux * rmdemux, + GstRMDemuxStream * stream) +{ + GstFlowReturn ret; + GstBuffer *outbuf; + GstMapInfo outmap; + guint packet_size = stream->packet_size; + guint height = stream->subpackets->len; + guint p; + + g_assert (stream->height == height); + + GST_LOG ("packet_size = %u, leaf_size = %u, height= %u", packet_size, + stream->leaf_size, height); + + outbuf = gst_buffer_new_and_alloc (height * packet_size); + gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); + + for (p = 0; p < height; ++p) { + GstBuffer *b = g_ptr_array_index (stream->subpackets, p); + + if (p == 0) { + GST_BUFFER_DTS (outbuf) = GST_BUFFER_DTS (b); + GST_BUFFER_PTS (outbuf) = GST_BUFFER_PTS (b); + } + + gst_buffer_extract (b, 0, outmap.data + packet_size * p, packet_size); + } + gst_buffer_unmap (outbuf, &outmap); + + GST_LOG_OBJECT (rmdemux, "pushing buffer dts %" GST_TIME_FORMAT ", pts %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_DTS (outbuf)), + GST_TIME_ARGS (GST_BUFFER_PTS (outbuf))); + + if (stream->discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + outbuf = gst_rm_utils_descramble_sipr_buffer (outbuf); + + ret = gst_pad_push (stream->pad, outbuf); + + gst_rmdemux_stream_clear_cached_subpackets (rmdemux, stream); + + return ret; +} + +static GstFlowReturn +gst_rmdemux_handle_scrambled_packet (GstRMDemux * rmdemux, + GstRMDemuxStream * stream, GstBuffer * buf, gboolean keyframe) +{ + GstFlowReturn ret; + + if (stream->subpackets == NULL) + stream->subpackets = g_ptr_array_sized_new (stream->subpackets_needed); + + GST_LOG ("Got subpacket %u/%u, len=%" G_GSIZE_FORMAT ", key=%d", + stream->subpackets->len + 1, stream->subpackets_needed, + gst_buffer_get_size (buf), keyframe); + + if (keyframe && stream->subpackets->len > 0) { + gst_rmdemux_stream_clear_cached_subpackets (rmdemux, stream); + } + + g_ptr_array_add (stream->subpackets, buf); + + if (stream->subpackets->len < stream->subpackets_needed) + return GST_FLOW_OK; + + g_assert (stream->subpackets->len >= 1); + + switch (stream->fourcc) { + case GST_RM_AUD_DNET: + ret = gst_rmdemux_descramble_dnet_audio (rmdemux, stream); + break; + case GST_RM_AUD_COOK: + case GST_RM_AUD_ATRC: + ret = gst_rmdemux_descramble_audio (rmdemux, stream); + break; + case GST_RM_AUD_RAAC: + case GST_RM_AUD_RACP: + ret = gst_rmdemux_descramble_mp4a_audio (rmdemux, stream); + break; + case GST_RM_AUD_SIPR: + ret = gst_rmdemux_descramble_sipr_audio (rmdemux, stream); + break; + default: + ret = GST_FLOW_ERROR; + g_assert_not_reached (); + } + + return ret; +} + +#define PARSE_NUMBER(data, size, number, label) \ +G_STMT_START { \ + if (size < 2) \ + goto label; \ + number = GST_READ_UINT16_BE (data); \ + if (!(number & 0xc000)) { \ + if (size < 4) \ + goto label; \ + number = GST_READ_UINT32_BE (data); \ + data += 4; \ + size -= 4; \ + } else { \ + number &= 0x3fff; \ + data += 2; \ + size -= 2; \ + } \ +} G_STMT_END + +static GstFlowReturn +gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream, + GstBuffer * in, guint offset, guint16 version, + GstClockTime timestamp, gboolean key) +{ + GstFlowReturn ret; + GstMapInfo map; + const guint8 *data; + gsize size; + + gst_buffer_map (in, &map, GST_MAP_READ); + + if (map.size < offset) + goto not_enough_data; + + data = map.data + offset; + size = map.size - offset; + + /* if size <= 2, we want this method to return the same GstFlowReturn as it + * was previously for that given stream. */ + ret = GST_PAD_LAST_FLOW_RETURN (stream->pad); + + while (size > 2) { + guint8 pkg_header; + guint pkg_offset; + guint pkg_length; + guint pkg_subseq = 0, pkg_seqnum = G_MAXUINT; + guint fragment_size; + GstBuffer *fragment; + + pkg_header = *data++; + size--; + + /* packet header + * bit 7: 1=last block in block chain + * bit 6: 1=short header (only one block?) + */ + if ((pkg_header & 0xc0) == 0x40) { + /* skip unknown byte */ + data++; + size--; + pkg_offset = 0; + pkg_length = size; + } else { + if ((pkg_header & 0x40) == 0) { + pkg_subseq = (*data++) & 0x7f; + size--; + } else { + pkg_subseq = 0; + } + + /* length */ + PARSE_NUMBER (data, size, pkg_length, not_enough_data); + + /* offset */ + PARSE_NUMBER (data, size, pkg_offset, not_enough_data); + + /* seqnum */ + if (size < 1) + goto not_enough_data; + + pkg_seqnum = *data++; + size--; + } + + GST_DEBUG_OBJECT (rmdemux, + "seq %d, subseq %d, offset %d, length %d, size %" G_GSIZE_FORMAT + ", header %02x", pkg_seqnum, pkg_subseq, pkg_offset, pkg_length, size, + pkg_header); + + /* calc size of fragment */ + if ((pkg_header & 0xc0) == 0x80) { + fragment_size = pkg_offset; + } else { + if ((pkg_header & 0xc0) == 0) + fragment_size = size; + else + fragment_size = pkg_length; + } + GST_DEBUG_OBJECT (rmdemux, "fragment size %d", fragment_size); + + if (map.size < (data - map.data) + fragment_size) + goto not_enough_data; + + /* get the fragment */ + fragment = + gst_buffer_copy_region (in, GST_BUFFER_COPY_ALL, data - map.data, + fragment_size); + + if (pkg_subseq == 1) { + GST_DEBUG_OBJECT (rmdemux, "start new fragment"); + gst_adapter_clear (stream->adapter); + stream->frag_current = 0; + stream->frag_count = 0; + stream->frag_length = pkg_length; + } else if (pkg_subseq == 0) { + GST_DEBUG_OBJECT (rmdemux, "non fragmented packet"); + stream->frag_current = 0; + stream->frag_count = 0; + stream->frag_length = fragment_size; + } + + /* put fragment in adapter */ + gst_adapter_push (stream->adapter, fragment); + stream->frag_offset[stream->frag_count] = stream->frag_current; + stream->frag_current += fragment_size; + stream->frag_count++; + + if (stream->frag_count > MAX_FRAGS) + goto too_many_fragments; + + GST_DEBUG_OBJECT (rmdemux, "stored fragment in adapter %d/%d", + stream->frag_current, stream->frag_length); + + /* flush fragment when complete */ + if (stream->frag_current >= stream->frag_length) { + GstBuffer *out; + GstMapInfo outmap; + guint8 *outdata; + guint header_size; + gint i, avail; + + /* calculate header size, which is: + * 1 byte for the number of fragments - 1 + * for each fragment: + * 4 bytes 0x00000001 little endian + * 4 bytes fragment offset + * + * This is also the matroska header for realvideo, the decoder needs the + * fragment offsets, both in ffmpeg and real .so, so we just give it that + * in front of the data. + */ + header_size = 1 + (8 * (stream->frag_count)); + + GST_DEBUG_OBJECT (rmdemux, + "fragmented completed. count %d, header_size %u", stream->frag_count, + header_size); + + avail = gst_adapter_available (stream->adapter); + + out = gst_buffer_new_and_alloc (header_size + avail); + gst_buffer_map (out, &outmap, GST_MAP_WRITE); + outdata = outmap.data; + + /* create header */ + *outdata++ = stream->frag_count - 1; + for (i = 0; i < stream->frag_count; i++) { + GST_WRITE_UINT32_LE (outdata, 0x00000001); + outdata += 4; + GST_WRITE_UINT32_LE (outdata, stream->frag_offset[i]); + outdata += 4; + } + + /* copy packet data after the header now */ + gst_adapter_copy (stream->adapter, outdata, 0, avail); + gst_adapter_flush (stream->adapter, avail); + + stream->frag_current = 0; + stream->frag_count = 0; + stream->frag_length = 0; + + if (timestamp != -1) { + if (rmdemux->first_ts != -1 && timestamp > rmdemux->first_ts) + timestamp -= rmdemux->first_ts; + else + timestamp = 0; + + if (rmdemux->base_ts != -1) + timestamp += rmdemux->base_ts; + } + gst_buffer_unmap (out, &outmap); + + /* video has DTS */ + GST_BUFFER_DTS (out) = timestamp; + GST_BUFFER_PTS (out) = GST_CLOCK_TIME_NONE; + + GST_LOG_OBJECT (rmdemux, "pushing timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (stream->discont) { + GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + if (!key) { + GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DELTA_UNIT); + } + + ret = gst_pad_push (stream->pad, out); + ret = gst_flow_combiner_update_flow (rmdemux->flowcombiner, ret); + if (ret != GST_FLOW_OK) + break; + + timestamp = GST_CLOCK_TIME_NONE; + } + data += fragment_size; + size -= fragment_size; + } + GST_DEBUG_OBJECT (rmdemux, "%" G_GSIZE_FORMAT " bytes left", size); + +done: + gst_buffer_unmap (in, &map); + gst_buffer_unref (in); + + return ret; + + /* ERRORS */ +not_enough_data: + { + GST_ELEMENT_WARNING (rmdemux, STREAM, DECODE, ("Skipping bad packet."), + (NULL)); + ret = GST_FLOW_OK; + goto done; + } +too_many_fragments: + { + GST_ELEMENT_ERROR (rmdemux, STREAM, DECODE, + ("Got more fragments (%u) than can be handled (%u)", + stream->frag_count, MAX_FRAGS), (NULL)); + ret = GST_FLOW_ERROR; + goto done; + } +} + +static GstFlowReturn +gst_rmdemux_parse_audio_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream, + GstBuffer * in, guint offset, guint16 version, + GstClockTime timestamp, gboolean key) +{ + GstFlowReturn ret; + GstBuffer *buffer; + + if (gst_buffer_get_size (in) < offset) + goto not_enough_data; + + buffer = gst_buffer_copy_region (in, GST_BUFFER_COPY_MEMORY, offset, -1); + + if (rmdemux->first_ts != -1 && timestamp > rmdemux->first_ts) + timestamp -= rmdemux->first_ts; + else + timestamp = 0; + + if (rmdemux->base_ts != -1) + timestamp += rmdemux->base_ts; + + GST_BUFFER_PTS (buffer) = timestamp; + GST_BUFFER_DTS (buffer) = timestamp; + + if (stream->needs_descrambling) { + GST_LOG_OBJECT (rmdemux, "descramble timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + ret = gst_rmdemux_handle_scrambled_packet (rmdemux, stream, buffer, key); + } else { + GST_LOG_OBJECT (rmdemux, + "Pushing buffer of size %" G_GSIZE_FORMAT ", timestamp %" + GST_TIME_FORMAT "to pad %s", gst_buffer_get_size (buffer), + GST_TIME_ARGS (timestamp), GST_PAD_NAME (stream->pad)); + + if (stream->discont) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + ret = gst_pad_push (stream->pad, buffer); + } + +done: + gst_buffer_unref (in); + + return ret; + + /* ERRORS */ +not_enough_data: + { + GST_ELEMENT_WARNING (rmdemux, STREAM, DECODE, ("Skipping bad packet."), + (NULL)); + ret = GST_FLOW_OK; + goto done; + } +} + +static GstFlowReturn +gst_rmdemux_parse_packet (GstRMDemux * rmdemux, GstBuffer * in, guint16 version) +{ + guint16 id; + GstRMDemuxStream *stream; + gsize size, offset; + GstFlowReturn cret, ret; + GstClockTime timestamp; + gboolean key; + GstMapInfo map; + guint8 *data; + guint8 flags; + guint32 ts; + + gst_buffer_map (in, &map, GST_MAP_READ); + data = map.data; + size = map.size; + + if (size < 4 + 6 + 1 + 2) + goto not_enough_data; + + /* stream number */ + id = RMDEMUX_GUINT16_GET (data); + + stream = gst_rmdemux_get_stream_by_id (rmdemux, id); + if (!stream || !stream->pad) + goto unknown_stream; + + /* timestamp in Msec */ + ts = RMDEMUX_GUINT32_GET (data + 2); + timestamp = ts * GST_MSECOND; + + rmdemux->segment.position = timestamp; + + GST_LOG_OBJECT (rmdemux, "Parsing a packet for stream=%d, timestamp=%" + GST_TIME_FORMAT ", size %" G_GSIZE_FORMAT ", version=%d, ts=%u", id, + GST_TIME_ARGS (timestamp), size, version, ts); + + if (rmdemux->first_ts == GST_CLOCK_TIME_NONE) { + GST_DEBUG_OBJECT (rmdemux, "First timestamp: %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + rmdemux->first_ts = timestamp; + } + + /* skip stream_id and timestamp */ + data += (2 + 4); + size -= (2 + 4); + + /* get flags */ + flags = GST_READ_UINT8 (data + 1); + + data += 2; + size -= 2; + + /* version 1 has an extra byte */ + if (version == 1) { + if (size < 1) + goto not_enough_data; + + data += 1; + size -= 1; + } + offset = data - map.data; + gst_buffer_unmap (in, &map); + + key = (flags & 0x02) != 0; + GST_DEBUG_OBJECT (rmdemux, "flags %d, Keyframe %d", flags, key); + + if (rmdemux->need_newsegment) { + GstEvent *event; + + event = gst_event_new_segment (&rmdemux->segment); + + GST_DEBUG_OBJECT (rmdemux, "sending NEWSEGMENT event, segment.start= %" + GST_TIME_FORMAT, GST_TIME_ARGS (rmdemux->segment.start)); + + gst_rmdemux_send_event (rmdemux, event); + rmdemux->need_newsegment = FALSE; + + if (rmdemux->pending_tags != NULL) { + gst_rmdemux_send_event (rmdemux, + gst_event_new_tag (rmdemux->pending_tags)); + rmdemux->pending_tags = NULL; + } + } + + if (stream->pending_tags != NULL) { + GST_LOG_OBJECT (stream->pad, "tags %" GST_PTR_FORMAT, stream->pending_tags); + gst_pad_push_event (stream->pad, gst_event_new_tag (stream->pending_tags)); + stream->pending_tags = NULL; + } + + if ((rmdemux->offset + size) <= stream->seek_offset) { + GST_DEBUG_OBJECT (rmdemux, + "Stream %d is skipping: seek_offset=%d, offset=%d, size=%" + G_GSIZE_FORMAT, stream->id, stream->seek_offset, rmdemux->offset, size); + cret = GST_FLOW_OK; + gst_buffer_unref (in); + goto beach; + } + + /* do special headers */ + if (stream->subtype == GST_RMDEMUX_STREAM_VIDEO) { + ret = + gst_rmdemux_parse_video_packet (rmdemux, stream, in, offset, + version, timestamp, key); + } else if (stream->subtype == GST_RMDEMUX_STREAM_AUDIO) { + ret = + gst_rmdemux_parse_audio_packet (rmdemux, stream, in, offset, + version, timestamp, key); + } else { + gst_buffer_unref (in); + ret = GST_FLOW_OK; + } + + cret = gst_flow_combiner_update_pad_flow (rmdemux->flowcombiner, stream->pad, + ret); + +beach: + return cret; + + /* ERRORS */ +unknown_stream: + { + GST_WARNING_OBJECT (rmdemux, "No stream for stream id %d in parsing " + "data packet", id); + gst_buffer_unmap (in, &map); + gst_buffer_unref (in); + return GST_FLOW_OK; + } + + /* ERRORS */ +not_enough_data: + { + GST_ELEMENT_WARNING (rmdemux, STREAM, DECODE, ("Skipping bad packet."), + (NULL)); + gst_buffer_unmap (in, &map); + gst_buffer_unref (in); + return GST_FLOW_OK; + } +} diff --git a/gst/realmedia/rmdemux.h b/gst/realmedia/rmdemux.h new file mode 100644 index 0000000000..40e1a0b6dc --- /dev/null +++ b/gst/realmedia/rmdemux.h @@ -0,0 +1,166 @@ +/* GStreamer RealMedia demuxer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_RMDEMUX_H__ +#define __GST_RMDEMUX_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RMDEMUX \ + (gst_rmdemux_get_type()) +#define GST_RMDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RMDEMUX,GstRMDemux)) +#define GST_RMDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RMDEMUX,GstRMDemuxClass)) +#define GST_IS_RMDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RMDEMUX)) +#define GST_IS_RMDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RMDEMUX)) + +typedef enum +{ + RMDEMUX_STATE_NULL, + RMDEMUX_STATE_HEADER, + RMDEMUX_STATE_HEADER_UNKNOWN, + RMDEMUX_STATE_HEADER_RMF, + RMDEMUX_STATE_HEADER_PROP, + RMDEMUX_STATE_HEADER_MDPR, + RMDEMUX_STATE_HEADER_INDX, + RMDEMUX_STATE_HEADER_DATA, + RMDEMUX_STATE_HEADER_CONT, + RMDEMUX_STATE_HEADER_SEEKING, + RMDEMUX_STATE_SEEKING, + RMDEMUX_STATE_DATA_PACKET, + RMDEMUX_STATE_SEEKING_EOS, + RMDEMUX_STATE_EOS, + RMDEMUX_STATE_INDX_DATA +} GstRMDemuxState; + +typedef enum +{ + RMDEMUX_LOOP_STATE_HEADER, + RMDEMUX_LOOP_STATE_INDEX, + RMDEMUX_LOOP_STATE_DATA +} GstRMDemuxLoopState; + +typedef enum +{ + GST_RMDEMUX_STREAM_UNKNOWN, + GST_RMDEMUX_STREAM_VIDEO, + GST_RMDEMUX_STREAM_AUDIO, + GST_RMDEMUX_STREAM_FILEINFO +} GstRMDemuxStreamType; + +typedef struct _GstRMDemux GstRMDemux; +typedef struct _GstRMDemuxClass GstRMDemuxClass; +typedef struct _GstRMDemuxStream GstRMDemuxStream; + +struct _GstRMDemux { + GstElement element; + + /* pads */ + GstPad *sinkpad; + + gboolean have_group_id; + guint group_id; + + GSList *streams; + guint n_video_streams; + guint n_audio_streams; + GstAdapter *adapter; + gboolean have_pads; + + GstFlowCombiner *flowcombiner; + + guint32 timescale; + guint64 duration; + guint32 avg_packet_size; + guint32 index_offset; + guint32 data_offset; + guint32 num_packets; + + guint offset; + gboolean seekable; + guint32 seek_seqnum; + + GstRMDemuxState state; + GstRMDemuxLoopState loop_state; + GstRMDemuxStream *index_stream; + + /* playback start/stop positions */ + GstSegment segment; + gboolean segment_running; + gboolean running; + + /* Whether we need to send a newsegment event */ + gboolean need_newsegment; + + /* Current timestamp */ + GstClockTime cur_timestamp; + + /* First timestamp */ + GstClockTime base_ts; + GstClockTime first_ts; + + int n_chunks; + int chunk_index; + + guint32 object_id; + guint32 size; + guint16 object_version; + + /* container tags for all streams */ + GstTagList *pending_tags; +}; + +struct _GstRMDemuxClass { + GstElementClass parent_class; +}; + +/* RealMedia VideoCodec FOURCC codes */ +#define GST_RM_VDO_RV10 GST_MAKE_FOURCC('R','V','1','0') // RealVideo 1 +#define GST_RM_VDO_RV20 GST_MAKE_FOURCC('R','V','2','0') // RealVideo G2 +#define GST_RM_VDO_RV30 GST_MAKE_FOURCC('R','V','3','0') // RealVideo 8 +#define GST_RM_VDO_RV40 GST_MAKE_FOURCC('R','V','4','0') // RealVideo 9+10 + +/* RealMedia AudioCodec FOURCC codes */ +#define GST_RM_AUD_14_4 GST_MAKE_FOURCC('1','4','_','4') // 14.4 Audio Codec +#define GST_RM_AUD_28_8 GST_MAKE_FOURCC('2','8','_','8') // 28.8 Audio Codec +#define GST_RM_AUD_COOK GST_MAKE_FOURCC('c','o','o','k') // Cooker G2 Audio Codec +#define GST_RM_AUD_DNET GST_MAKE_FOURCC('d','n','e','t') // DolbyNet Audio Codec (low bitrate Dolby AC3) +#define GST_RM_AUD_SIPR GST_MAKE_FOURCC('s','i','p','r') // Sipro/ACELP.NET Voice Codec +#define GST_RM_AUD_RAAC GST_MAKE_FOURCC('r','a','a','c') // LE-AAC Audio Codec +#define GST_RM_AUD_RACP GST_MAKE_FOURCC('r','a','c','p') // HE-AAC Audio Codec +#define GST_RM_AUD_RALF GST_MAKE_FOURCC('r','a','l','f') // RealAudio Lossless +#define GST_RM_AUD_ATRC GST_MAKE_FOURCC('a','t','r','c') // Sony ATRAC3 Audio Codec + +#define GST_RM_AUD_xRA4 GST_MAKE_FOURCC('.','r','a','4') // Not a real audio codec +#define GST_RM_AUD_xRA5 GST_MAKE_FOURCC('.','r','a','5') // Not a real audio codec + +GST_ELEMENT_REGISTER_DECLARE (rmdemux); + +G_END_DECLS + +#endif /* __GST_RMDEMUX_H__ */ diff --git a/gst/realmedia/rmutils.c b/gst/realmedia/rmutils.c new file mode 100644 index 0000000000..c9bc0982a9 --- /dev/null +++ b/gst/realmedia/rmutils.c @@ -0,0 +1,294 @@ +/* GStreamer RealMedia utility functions + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "rmutils.h" + +gchar * +gst_rm_utils_read_string8 (const guint8 * data, guint datalen, + guint * p_total_len) +{ + gint length; + + if (p_total_len) + *p_total_len = 0; + + if (datalen < 1) + return NULL; + + length = GST_READ_UINT8 (data); + if (datalen < (1 + length)) + return NULL; + + if (p_total_len) + *p_total_len = 1 + length; + + return g_strndup ((gchar *) data + 1, length); +} + +gchar * +gst_rm_utils_read_string16 (const guint8 * data, guint datalen, + guint * p_total_len) +{ + gint length; + + if (p_total_len) + *p_total_len = 0; + + if (datalen < 2) + return NULL; + + length = GST_READ_UINT16_BE (data); + if (datalen < (2 + length)) + return NULL; + + if (p_total_len) + *p_total_len = 2 + length; + + return g_strndup ((gchar *) data + 2, length); +} + +GstTagList * +gst_rm_utils_read_tags (const guint8 * data, guint datalen, + GstRmUtilsStringReadFunc read_string_func) +{ + const gchar *gst_tags[] = { GST_TAG_TITLE, GST_TAG_ARTIST, + GST_TAG_COPYRIGHT, GST_TAG_COMMENT + }; + GstTagList *tags; + guint i; + + g_assert (read_string_func != NULL); + + GST_DEBUG ("File Content : (CONT) len = %d", datalen); + + tags = gst_tag_list_new_empty (); + + for (i = 0; i < G_N_ELEMENTS (gst_tags); ++i) { + gchar *str = NULL; + guint total_length = 0; + + str = read_string_func (data, datalen, &total_length); + data += total_length; + datalen -= total_length; + + if (str != NULL && !g_utf8_validate (str, -1, NULL)) { + const gchar *encoding; + gchar *tmp; + + encoding = g_getenv ("GST_TAG_ENCODING"); + if (encoding == NULL || *encoding == '\0') { + if (g_get_charset (&encoding)) + encoding = "ISO-8859-15"; + } + GST_DEBUG ("converting tag from %s to UTF-8", encoding); + tmp = g_convert_with_fallback (str, -1, "UTF-8", encoding, (gchar *) "*", + NULL, NULL, NULL); + g_free (str); + str = tmp; + } + + GST_DEBUG ("%s = %s", gst_tags[i], GST_STR_NULL (str)); + if (str != NULL && *str != '\0') { + gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, gst_tags[i], str, NULL); + } + g_free (str); + } + + if (gst_tag_list_n_tags (tags) > 0) + return tags; + + gst_tag_list_unref (tags); + return NULL; +} + +GstBuffer * +gst_rm_utils_descramble_dnet_buffer (GstBuffer * buf) +{ + GstMapInfo map; + guint8 *data, *end, tmp; + + buf = gst_buffer_make_writable (buf); + + /* dnet = byte-order swapped AC3 */ + gst_buffer_map (buf, &map, GST_MAP_READWRITE); + data = map.data; + end = data + map.size; + while ((data + 1) < end) { + /* byte-swap */ + tmp = data[0]; + data[0] = data[1]; + data[1] = tmp; + data += sizeof (guint16); + } + gst_buffer_unmap (buf, &map); + return buf; +} + +static void +gst_rm_utils_swap_nibbles (guint8 * data, gint idx1, gint idx2, gint len) +{ + guint8 *d1, *d2, tmp1 = 0, tmp2, tmp1n, tmp2n; + + if ((idx2 & 1) && !(idx1 & 1)) { + /* align destination to a byte by swapping the indexes */ + tmp1 = idx1; + idx1 = idx2; + idx2 = tmp1; + } + d1 = data + (idx1 >> 1); + d2 = data + (idx2 >> 1); + + /* check if we have aligned offsets and we can copy bytes */ + if ((idx1 & 1) == (idx2 & 1)) { + if (idx1 & 1) { + /* swap first nibble */ + tmp1 = *d1; + tmp2 = *d2; + *d1++ = (tmp2 & 0xf0) | (tmp1 & 0x0f); + *d2++ = (tmp1 & 0xf0) | (tmp2 & 0x0f); + len--; + } + for (; len > 1; len -= 2) { + /* swap 2 nibbles */ + tmp1 = *d1; + *d1++ = *d2; + *d2++ = tmp1; + } + if (len) { + /* swap leftover nibble */ + tmp1 = *d1; + tmp2 = *d2; + *d1 = (tmp2 & 0x0f) | (tmp1 & 0xf0); + *d2 = (tmp1 & 0x0f) | (tmp2 & 0xf0); + } + } else { + /* preload nibbles from source */ + tmp2n = *d1; + tmp2 = *d2; + + for (; len > 1; len -= 2) { + /* assemble nibbles */ + *d1++ = (tmp2n & 0x0f) | (tmp2 << 4); + tmp1n = *d1; + *d2++ = (tmp1n << 4) | (tmp1 >> 4); + + tmp1 = tmp1n; + tmp2n = (tmp2 >> 4); + tmp2 = *d2; + } + if (len) { + /* last leftover */ + *d1 = (tmp2 << 4) | (tmp2n & 0x0f); + *d2 = (tmp1 >> 4) | (tmp2 & 0xf0); + } else { + *d1 = (tmp1 & 0xf0) | (tmp2n); + } + } +} + +static const gint sipr_swap_index[38][2] = { + {0, 63}, {1, 22}, {2, 44}, {3, 90}, + {5, 81}, {7, 31}, {8, 86}, {9, 58}, + {10, 36}, {12, 68}, {13, 39}, {14, 73}, + {15, 53}, {16, 69}, {17, 57}, {19, 88}, + {20, 34}, {21, 71}, {24, 46}, {25, 94}, + {26, 54}, {28, 75}, {29, 50}, {32, 70}, + {33, 92}, {35, 74}, {38, 85}, {40, 56}, + {42, 87}, {43, 65}, {45, 59}, {48, 79}, + {49, 93}, {51, 89}, {55, 95}, {61, 76}, + {67, 83}, {77, 80} +}; + +GstBuffer * +gst_rm_utils_descramble_sipr_buffer (GstBuffer * buf) +{ + GstMapInfo map; + gint n, bs; + gsize size; + + size = gst_buffer_get_size (buf); + + /* split the packet in 96 blocks of nibbles */ + bs = size * 2 / 96; + if (bs == 0) + return buf; + + buf = gst_buffer_make_writable (buf); + + gst_buffer_map (buf, &map, GST_MAP_WRITE); + + /* we need to perform 38 swaps on the blocks */ + for (n = 0; n < 38; n++) { + gint idx1, idx2; + + /* get the indexes of the blocks of nibbles that need swapping */ + idx1 = bs * sipr_swap_index[n][0]; + idx2 = bs * sipr_swap_index[n][1]; + + /* swap the blocks */ + gst_rm_utils_swap_nibbles (map.data, idx1, idx2, bs); + } + gst_buffer_unmap (buf, &map); + + return buf; +} + +void +gst_rm_utils_run_tests (void) +{ +#if 0 + guint8 tab1[] = { 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe }; + guint8 tab2[8]; + + memcpy (tab2, tab1, 8); + gst_util_dump_mem (tab2, 8); + + gst_rm_utils_swap_nibbles (tab2, 0, 8, 4); + gst_util_dump_mem (tab2, 8); + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 0, 8, 5); + gst_util_dump_mem (tab2, 8); + + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 1, 8, 4); + gst_util_dump_mem (tab2, 8); + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 1, 8, 5); + gst_util_dump_mem (tab2, 8); + + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 0, 9, 4); + gst_util_dump_mem (tab2, 8); + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 0, 9, 5); + gst_util_dump_mem (tab2, 8); + + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 1, 9, 4); + gst_util_dump_mem (tab2, 8); + memcpy (tab2, tab1, 8); + gst_rm_utils_swap_nibbles (tab2, 1, 9, 5); + gst_util_dump_mem (tab2, 8); +#endif +} diff --git a/gst/realmedia/rmutils.h b/gst/realmedia/rmutils.h new file mode 100644 index 0000000000..cf8bbb57dd --- /dev/null +++ b/gst/realmedia/rmutils.h @@ -0,0 +1,50 @@ +/* GStreamer RealMedia utility functions + * Copyright (C) 2006 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RM_UTILS_H__ +#define __GST_RM_UTILS_H__ + +#include + +G_BEGIN_DECLS + +typedef gchar * (*GstRmUtilsStringReadFunc) (const guint8 * data, guint datalen, guint * p_strlen); + +gchar *gst_rm_utils_read_string8 (const guint8 * data, + guint datalen, + guint * p_totallen); + +gchar *gst_rm_utils_read_string16 (const guint8 * data, + guint datalen, + guint * p_totallen); + +GstTagList *gst_rm_utils_read_tags (const guint8 * data, + guint datalen, + GstRmUtilsStringReadFunc func); + +GstBuffer *gst_rm_utils_descramble_dnet_buffer (GstBuffer * buf); +GstBuffer *gst_rm_utils_descramble_sipr_buffer (GstBuffer * buf); + +void gst_rm_utils_run_tests (void); + + +G_END_DECLS + +#endif /* __GST_RM_UTILS_H__ */ + diff --git a/gst/realmedia/rtspreal.c b/gst/realmedia/rtspreal.c new file mode 100644 index 0000000000..5804747ee7 --- /dev/null +++ b/gst/realmedia/rtspreal.c @@ -0,0 +1,735 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-rtspreal + * @title: rtspreal + * + * A RealMedia RTSP extension + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +#include +#include + +#include + +#include "realhash.h" +#include "rtspreal.h" +#include "asmrules.h" + +GST_DEBUG_CATEGORY_STATIC (rtspreal_debug); +#define GST_CAT_DEFAULT (rtspreal_debug) + +#define SERVER_PREFIX "RealServer" +#define DEFAULT_BANDWIDTH "10485800" + +static GstRTSPResult +rtsp_ext_real_get_transports (GstRTSPExtension * ext, + GstRTSPLowerTrans protocols, gchar ** transport) +{ + GstRTSPReal *ctx = (GstRTSPReal *) ext; + GString *str; + + if (!ctx->isreal) + return GST_RTSP_OK; + + GST_DEBUG_OBJECT (ext, "generating transports for %d", protocols); + + str = g_string_new (""); + + /* + if (protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST) { + g_string_append (str, "x-real-rdt/mcast;client_port=%%u1;mode=play,"); + } + if (protocols & GST_RTSP_LOWER_TRANS_UDP) { + g_string_append (str, "x-real-rdt/udp;client_port=%%u1;mode=play,"); + g_string_append (str, "x-pn-tng/udp;client_port=%%u1;mode=play,"); + } + */ + if (protocols & GST_RTSP_LOWER_TRANS_TCP) { + g_string_append (str, "x-real-rdt/tcp;mode=play,"); + g_string_append (str, "x-pn-tng/tcp;mode=play,"); + } + + /* if we added something, remove trailing ',' */ + if (str->len > 0) + g_string_truncate (str, str->len - 1); + + *transport = g_string_free (str, FALSE); + + return GST_RTSP_OK; +} + +static GstRTSPResult +rtsp_ext_real_before_send (GstRTSPExtension * ext, GstRTSPMessage * request) +{ + GstRTSPReal *ctx = (GstRTSPReal *) ext; + + switch (request->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + gst_rtsp_message_add_header (request, GST_RTSP_HDR_USER_AGENT, + //"RealMedia Player (" GST_PACKAGE_NAME ")"); + "RealMedia Player Version 6.0.9.1235 (linux-2.0-libc6-i386-gcc2.95)"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_CHALLENGE, + "9e26d33f2984236010ef6253fb1887f7"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_COMPANY_ID, + "KnKV4M4I/B2FjJ1TToLycw=="); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_GUID, + "00000000-0000-0000-0000-000000000000"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_REGION_DATA, "0"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_PLAYER_START_TIME, + "[28/03/2003:22:50:23 00:00]"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_ID, + "Linux_2.4_6.0.9.1235_play32_RN01_EN_586"); + ctx->isreal = FALSE; + break; + } + case GST_RTSP_DESCRIBE: + { + if (ctx->isreal) { + gst_rtsp_message_add_header (request, GST_RTSP_HDR_BANDWIDTH, + DEFAULT_BANDWIDTH); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_GUID, + "00000000-0000-0000-0000-000000000000"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_REGION_DATA, "0"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_ID, + "Linux_2.4_6.0.9.1235_play32_RN01_EN_586"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_MAX_ASM_WIDTH, "1"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_LANGUAGE, "en-US"); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_REQUIRE, + "com.real.retain-entity-for-setup"); + } + break; + } + case GST_RTSP_SETUP: + { + if (ctx->isreal) { + gchar *value = + g_strdup_printf ("%s, sd=%s", ctx->challenge2, ctx->checksum); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_REAL_CHALLENGE2, + value); + gst_rtsp_message_add_header (request, GST_RTSP_HDR_IF_MATCH, ctx->etag); + g_free (value); + } + break; + } + default: + break; + } + return GST_RTSP_OK; +} + +static GstRTSPResult +rtsp_ext_real_after_send (GstRTSPExtension * ext, GstRTSPMessage * req, + GstRTSPMessage * resp) +{ + GstRTSPReal *ctx = (GstRTSPReal *) ext; + + switch (req->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + gchar *challenge1 = NULL; + gchar *server = NULL; + + gst_rtsp_message_get_header (resp, GST_RTSP_HDR_SERVER, &server, 0); + + gst_rtsp_message_get_header (resp, GST_RTSP_HDR_REAL_CHALLENGE1, + &challenge1, 0); + if (!challenge1) + goto no_challenge1; + + gst_rtsp_ext_real_calc_response_and_checksum (ctx->challenge2, + ctx->checksum, challenge1); + + GST_DEBUG_OBJECT (ctx, "Found Real challenge tag"); + ctx->isreal = TRUE; + break; + } + case GST_RTSP_DESCRIBE: + { + gchar *etag = NULL; + guint len; + + gst_rtsp_message_get_header (resp, GST_RTSP_HDR_ETAG, &etag, 0); + if (etag) { + len = sizeof (ctx->etag); + strncpy (ctx->etag, etag, len); + ctx->etag[len - 1] = '\0'; + } + break; + } + default: + break; + } + return GST_RTSP_OK; + + /* ERRORS */ +no_challenge1: + { + GST_DEBUG_OBJECT (ctx, "Could not find challenge tag."); + ctx->isreal = FALSE; + return GST_RTSP_OK; + } +} + +#define ENSURE_SIZE(size) \ +G_STMT_START { \ + while (data_len < size) { \ + data_len += 1024; \ + data = g_realloc (data, data_len); \ + } \ +} G_STMT_END + +#define READ_BUFFER_GEN(src, func, name, dest, dest_len) \ +G_STMT_START { \ + dest = (gchar *)func (src, name); \ + dest_len = 0; \ + if (!dest) { \ + dest = (char *) ""; \ + } \ + else if (!strncmp (dest, "buffer;\"", 8)) { \ + dest += 8; \ + dest_len = strlen (dest) - 1; \ + dest[dest_len] = '\0'; \ + g_base64_decode_inplace (dest, &dest_len); \ + } \ +} G_STMT_END + +#define READ_BUFFER(sdp, name, dest, dest_len) \ + READ_BUFFER_GEN(sdp, gst_sdp_message_get_attribute_val, name, dest, dest_len) +#define READ_BUFFER_M(media, name, dest, dest_len) \ + READ_BUFFER_GEN(media, gst_sdp_media_get_attribute_val, name, dest, dest_len) + +#define READ_INT_GEN(src, func, name, dest) \ +G_STMT_START { \ + const gchar *val = func (src, name); \ + if (val && !strncmp (val, "integer;", 8)) \ + dest = atoi (val + 8); \ + else \ + dest = 0; \ +} G_STMT_END + +#define READ_INT(sdp, name, dest) \ + READ_INT_GEN(sdp, gst_sdp_message_get_attribute_val, name, dest) +#define READ_INT_M(media, name, dest) \ + READ_INT_GEN(media, gst_sdp_media_get_attribute_val, name, dest) + +#define READ_STRING(media, name, dest, dest_len) \ +G_STMT_START { \ + const gchar *val = gst_sdp_media_get_attribute_val (media, name); \ + if (val && !strncmp (val, "string;\"", 8)) { \ + dest = (gchar *) val + 8; \ + dest_len = strlen (dest) - 1; \ + dest[dest_len] = '\0'; \ + } else { \ + dest = (char *) ""; \ + dest_len = 0; \ + } \ +} G_STMT_END + +#define WRITE_STRING1(datap, str, str_len) \ +G_STMT_START { \ + *datap = str_len; \ + memcpy ((datap) + 1, str, str_len); \ + datap += str_len + 1; \ +} G_STMT_END + +#define WRITE_STRING2(datap, str, str_len) \ +G_STMT_START { \ + GST_WRITE_UINT16_BE (datap, str_len); \ + memcpy (datap + 2, str, str_len); \ + datap += str_len + 2; \ +} G_STMT_END + +static GstRTSPResult +rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, + GstStructure * props) +{ + GstRTSPReal *ctx = (GstRTSPReal *) ext; + guint size; + gint i; + gchar *title, *author, *copyright, *comment; + gsize title_len, author_len, copyright_len, comment_len; + guint8 *data = NULL, *datap; + guint data_len = 0, offset; + GstBuffer *buf; + gchar *opaque_data; + gsize opaque_data_len, asm_rule_book_len; + GHashTable *vars; + GString *rules; + + /* don't bother for non-real formats */ + READ_INT (sdp, "IsRealDataType", ctx->isreal); + if (!ctx->isreal) + return TRUE; + + /* Force PAUSE | PLAY */ + //src->methods |= GST_RTSP_PLAY | GST_RTSP_PAUSE; + + ctx->n_streams = gst_sdp_message_medias_len (sdp); + + ctx->max_bit_rate = 0; + ctx->avg_bit_rate = 0; + ctx->max_packet_size = 0; + ctx->avg_packet_size = 0; + ctx->duration = 0; + + for (i = 0; i < ctx->n_streams; i++) { + const GstSDPMedia *media; + gint intval; + + media = gst_sdp_message_get_media (sdp, i); + + READ_INT_M (media, "MaxBitRate", intval); + ctx->max_bit_rate += intval; + READ_INT_M (media, "AvgBitRate", intval); + ctx->avg_bit_rate += intval; + READ_INT_M (media, "MaxPacketSize", intval); + ctx->max_packet_size = MAX (ctx->max_packet_size, intval); + READ_INT_M (media, "AvgPacketSize", intval); + ctx->avg_packet_size = (ctx->avg_packet_size * i + intval) / (i + 1); + READ_INT_M (media, "Duration", intval); + ctx->duration = MAX (ctx->duration, intval); + } + + /* FIXME: use GstByteWriter to write the header */ + /* PROP */ + offset = 0; + size = 50; + ENSURE_SIZE (size); + datap = data + offset; + + memcpy (datap + 0, "PROP", 4); + GST_WRITE_UINT32_BE (datap + 4, size); + GST_WRITE_UINT16_BE (datap + 8, 0); + GST_WRITE_UINT32_BE (datap + 10, ctx->max_bit_rate); + GST_WRITE_UINT32_BE (datap + 14, ctx->avg_bit_rate); + GST_WRITE_UINT32_BE (datap + 18, ctx->max_packet_size); + GST_WRITE_UINT32_BE (datap + 22, ctx->avg_packet_size); + GST_WRITE_UINT32_BE (datap + 26, 0); + GST_WRITE_UINT32_BE (datap + 30, ctx->duration); + GST_WRITE_UINT32_BE (datap + 34, 0); + GST_WRITE_UINT32_BE (datap + 38, 0); + GST_WRITE_UINT32_BE (datap + 42, 0); + GST_WRITE_UINT16_BE (datap + 46, ctx->n_streams); + GST_WRITE_UINT16_BE (datap + 48, 0); + offset += size; + + /* CONT */ + READ_BUFFER (sdp, "Title", title, title_len); + READ_BUFFER (sdp, "Author", author, author_len); + READ_BUFFER (sdp, "Comment", comment, comment_len); + READ_BUFFER (sdp, "Copyright", copyright, copyright_len); + + size = 18 + title_len + author_len + comment_len + copyright_len; + ENSURE_SIZE (offset + size); + datap = data + offset; + + memcpy (datap, "CONT", 4); + GST_WRITE_UINT32_BE (datap + 4, size); + GST_WRITE_UINT16_BE (datap + 8, 0); /* Version */ + datap += 10; + WRITE_STRING2 (datap, title, title_len); + WRITE_STRING2 (datap, author, author_len); + WRITE_STRING2 (datap, copyright, copyright_len); + WRITE_STRING2 (datap, comment, comment_len); + offset += size; + + /* fix the hashtale for the rule parser */ + rules = g_string_new (""); + vars = g_hash_table_new (g_str_hash, g_str_equal); + g_hash_table_insert (vars, (gchar *) "Bandwidth", + (gchar *) DEFAULT_BANDWIDTH); + + /* MDPR */ + for (i = 0; i < ctx->n_streams; i++) { + const GstSDPMedia *media; + guint32 len; + GstRTSPRealStream *stream; + gchar *str; + gint rulematches[MAX_RULEMATCHES]; + gint sel, j, n; + + media = gst_sdp_message_get_media (sdp, i); + + if (media->media && !strcmp (media->media, "data")) + continue; + + stream = g_new0 (GstRTSPRealStream, 1); + ctx->streams = g_list_append (ctx->streams, stream); + + READ_INT_M (media, "MaxBitRate", stream->max_bit_rate); + READ_INT_M (media, "AvgBitRate", stream->avg_bit_rate); + READ_INT_M (media, "MaxPacketSize", stream->max_packet_size); + READ_INT_M (media, "AvgPacketSize", stream->avg_packet_size); + READ_INT_M (media, "StartTime", stream->start_time); + READ_INT_M (media, "Preroll", stream->preroll); + READ_INT_M (media, "Duration", stream->duration); + READ_STRING (media, "StreamName", str, stream->stream_name_len); + stream->stream_name = g_strndup (str, stream->stream_name_len); + READ_STRING (media, "mimetype", str, stream->mime_type_len); + stream->mime_type = g_strndup (str, stream->mime_type_len); + + /* FIXME: Depending on the current bandwidth, we need to select one + * bandwidth out of a list offered by the server. Someone needs to write + * a parser for strings like + * + * #($Bandwidth < 67959),TimestampDelivery=T,DropByN=T,priority=9; + * #($Bandwidth >= 67959) && ($Bandwidth < 167959),AverageBandwidth=67959, + * Priority=9;#($Bandwidth >= 67959) && ($Bandwidth < 167959), + * AverageBandwidth=0,Priority=5,OnDepend=\"1\"; + * #($Bandwidth >= 167959) && ($Bandwidth < 267959), + * AverageBandwidth=167959,Priority=9; + * #($Bandwidth >= 167959) && ($Bandwidth < 267959),AverageBandwidth=0, + * Priority=5,OnDepend=\"3\";#($Bandwidth >= 267959), + * AverageBandwidth=267959,Priority=9;#($Bandwidth >= 267959), + * AverageBandwidth=0,Priority=5,OnDepend=\"5\"; + * + * As I don't know how to do that, I just use the first entry (sel = 0). + * But to give you a starting point, I offer you above string + * in the variable 'asm_rule_book'. + */ + READ_STRING (media, "ASMRuleBook", str, asm_rule_book_len); + stream->rulebook = gst_asm_rule_book_new (str); + + n = gst_asm_rule_book_match (stream->rulebook, vars, rulematches); + for (j = 0; j < n; j++) { + g_string_append_printf (rules, "stream=%u;rule=%u,", i, rulematches[j]); + } + + /* get the MLTI for the first matched rules */ + sel = rulematches[0]; + + READ_BUFFER_M (media, "OpaqueData", opaque_data, opaque_data_len); + + if (opaque_data_len < 4) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", + opaque_data_len); + goto strange_opaque_data; + } + if (strncmp (opaque_data, "MLTI", 4)) { + GST_DEBUG_OBJECT (ctx, "no MLTI found, appending all"); + stream->type_specific_data_len = opaque_data_len; + stream->type_specific_data = g_memdup2 (opaque_data, opaque_data_len); + goto no_type_specific; + } + opaque_data += 4; + opaque_data_len -= 4; + + if (opaque_data_len < 2) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", + opaque_data_len); + goto strange_opaque_data; + } + stream->num_rules = GST_READ_UINT16_BE (opaque_data); + opaque_data += 2; + opaque_data_len -= 2; + + if (sel >= stream->num_rules) { + GST_DEBUG_OBJECT (ctx, "sel %d >= num_rules %d", sel, stream->num_rules); + goto strange_opaque_data; + } + + if (opaque_data_len < 2 * sel) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT + " < 2 * sel (%d)", opaque_data_len, 2 * sel); + goto strange_opaque_data; + } + opaque_data += 2 * sel; + opaque_data_len -= 2 * sel; + + if (opaque_data_len < 2) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", + opaque_data_len); + goto strange_opaque_data; + } + stream->codec = GST_READ_UINT16_BE (opaque_data); + opaque_data += 2; + opaque_data_len -= 2; + + if (opaque_data_len < 2 * (stream->num_rules - sel - 1)) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT + " < %d", opaque_data_len, 2 * (stream->num_rules - sel - 1)); + goto strange_opaque_data; + } + opaque_data += 2 * (stream->num_rules - sel - 1); + opaque_data_len -= 2 * (stream->num_rules - sel - 1); + + if (opaque_data_len < 2) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", + opaque_data_len); + goto strange_opaque_data; + } + stream->num_rules = GST_READ_UINT16_BE (opaque_data); + opaque_data += 2; + opaque_data_len -= 2; + + if (stream->codec > stream->num_rules) { + GST_DEBUG_OBJECT (ctx, "codec %d > num_rules %d", stream->codec, + stream->num_rules); + goto strange_opaque_data; + } + + for (j = 0; j < stream->codec; j++) { + if (opaque_data_len < 4) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", + opaque_data_len); + goto strange_opaque_data; + } + len = GST_READ_UINT32_BE (opaque_data); + opaque_data += 4; + opaque_data_len -= 4; + + if (opaque_data_len < len) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < len %d", + opaque_data_len, len); + goto strange_opaque_data; + } + opaque_data += len; + opaque_data_len -= len; + } + + if (opaque_data_len < 4) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", + opaque_data_len); + goto strange_opaque_data; + } + stream->type_specific_data_len = GST_READ_UINT32_BE (opaque_data); + opaque_data += 4; + opaque_data_len -= 4; + + if (opaque_data_len < stream->type_specific_data_len) { + GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < %d", + opaque_data_len, stream->type_specific_data_len); + goto strange_opaque_data; + } + stream->type_specific_data = + g_memdup2 (opaque_data, stream->type_specific_data_len); + + no_type_specific: + size = + 46 + stream->stream_name_len + stream->mime_type_len + + stream->type_specific_data_len; + ENSURE_SIZE (offset + size); + datap = data + offset; + + memcpy (datap, "MDPR", 4); + GST_WRITE_UINT32_BE (datap + 4, size); + GST_WRITE_UINT16_BE (datap + 8, 0); + GST_WRITE_UINT16_BE (datap + 10, i); + GST_WRITE_UINT32_BE (datap + 12, stream->max_bit_rate); + GST_WRITE_UINT32_BE (datap + 16, stream->avg_bit_rate); + GST_WRITE_UINT32_BE (datap + 20, stream->max_packet_size); + GST_WRITE_UINT32_BE (datap + 24, stream->avg_packet_size); + GST_WRITE_UINT32_BE (datap + 28, stream->start_time); + GST_WRITE_UINT32_BE (datap + 32, stream->preroll); + GST_WRITE_UINT32_BE (datap + 36, stream->duration); + datap += 40; + WRITE_STRING1 (datap, stream->stream_name, stream->stream_name_len); + WRITE_STRING1 (datap, stream->mime_type, stream->mime_type_len); + GST_WRITE_UINT32_BE (datap, stream->type_specific_data_len); + if (stream->type_specific_data_len) + memcpy (datap + 4, stream->type_specific_data, + stream->type_specific_data_len); + offset += size; + } + + /* destroy the rulebook hashtable now */ + g_hash_table_destroy (vars); + + /* strip final , if we added some stream rules */ + if (rules->len > 0) { + rules = g_string_truncate (rules, rules->len - 1); + } + + /* and store rules in the context */ + ctx->rules = g_string_free (rules, FALSE); + + /* DATA */ + size = 18; + ENSURE_SIZE (offset + size); + datap = data + offset; + + memcpy (datap, "DATA", 4); + GST_WRITE_UINT32_BE (datap + 4, size); + GST_WRITE_UINT16_BE (datap + 8, 0); + GST_WRITE_UINT32_BE (datap + 10, 0); /* number of packets */ + GST_WRITE_UINT32_BE (datap + 14, 0); /* next data header */ + offset += size; + + buf = gst_buffer_new_wrapped (data, offset); + + /* Set on caps */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER); + gst_structure_set (props, "config", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + + /* Overwrite encoding and media fields */ + gst_structure_set (props, "encoding-name", G_TYPE_STRING, "X-REAL-RDT", NULL); + gst_structure_set (props, "media", G_TYPE_STRING, "application", NULL); + + return TRUE; + + /* ERRORS */ +strange_opaque_data: + { + g_string_free (rules, TRUE); + g_hash_table_destroy (vars); + g_free (data); + + GST_ELEMENT_ERROR (ctx, RESOURCE, WRITE, ("Strange opaque data."), (NULL)); + return FALSE; + } +} + +static GstRTSPResult +rtsp_ext_real_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url) +{ + GstRTSPReal *ctx = (GstRTSPReal *) ext; + GstRTSPResult res; + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + gchar *req_url; + + if (!ctx->isreal) + return GST_RTSP_OK; + + if (!ctx->rules) + return GST_RTSP_OK; + + req_url = gst_rtsp_url_get_request_uri (url); + + /* create SET_PARAMETER */ + if ((res = gst_rtsp_message_init_request (&request, GST_RTSP_SET_PARAMETER, + req_url)) < 0) + goto create_request_failed; + + g_free (req_url); + + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SUBSCRIBE, ctx->rules); + + /* send SET_PARAMETER */ + if ((res = gst_rtsp_extension_send (ext, &request, &response)) < 0) + goto send_error; + + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + + return GST_RTSP_OK; + + /* ERRORS */ +create_request_failed: + { + GST_ELEMENT_ERROR (ctx, LIBRARY, INIT, + ("Could not create request."), (NULL)); + g_free (req_url); + goto reset; + } +send_error: + { + GST_ELEMENT_ERROR (ctx, RESOURCE, WRITE, + ("Could not send message."), (NULL)); + goto reset; + } +reset: + { + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + return res; + } +} + +static void gst_rtsp_real_extension_init (gpointer g_iface, + gpointer iface_data); +static void gst_rtsp_real_finalize (GObject * obj); + +#define gst_rtsp_real_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstRTSPReal, gst_rtsp_real, GST_TYPE_ELEMENT, + G_IMPLEMENT_INTERFACE (GST_TYPE_RTSP_EXTENSION, + gst_rtsp_real_extension_init)); +GST_ELEMENT_REGISTER_DEFINE (rtspreal, "rtspreal", + GST_RANK_MARGINAL, GST_TYPE_RTSP_REAL); + +static void +gst_rtsp_real_class_init (GstRTSPRealClass * g_class) +{ + GObjectClass *gobject_class = (GObjectClass *) g_class; + GstElementClass *gstelement_class = (GstElementClass *) g_class; + + gobject_class->finalize = gst_rtsp_real_finalize; + + gst_element_class_set_static_metadata (gstelement_class, + "RealMedia RTSP Extension", "Network/Extension/Protocol", + "Extends RTSP so that it can handle RealMedia setup", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rtspreal_debug, "rtspreal", 0, + "RealMedia RTSP extension"); +} + +static void +gst_rtsp_real_init (GstRTSPReal * rtspreal) +{ + rtspreal->isreal = FALSE; +} + +static void +gst_rtsp_stream_free (GstRTSPRealStream * stream) +{ + g_free (stream->stream_name); + g_free (stream->mime_type); + gst_asm_rule_book_free (stream->rulebook); + g_free (stream->type_specific_data); + + g_free (stream); +} + +static void +gst_rtsp_real_finalize (GObject * obj) +{ + GstRTSPReal *r = (GstRTSPReal *) obj; + + g_list_foreach (r->streams, (GFunc) gst_rtsp_stream_free, NULL); + g_list_free (r->streams); + g_free (r->rules); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_rtsp_real_extension_init (gpointer g_iface, gpointer iface_data) +{ + GstRTSPExtensionInterface *iface = (GstRTSPExtensionInterface *) g_iface; + + iface->before_send = rtsp_ext_real_before_send; + iface->after_send = rtsp_ext_real_after_send; + iface->parse_sdp = rtsp_ext_real_parse_sdp; + iface->stream_select = rtsp_ext_real_stream_select; + iface->get_transports = rtsp_ext_real_get_transports; +} diff --git a/gst/realmedia/rtspreal.h b/gst/realmedia/rtspreal.h new file mode 100644 index 0000000000..f5cea96d5b --- /dev/null +++ b/gst/realmedia/rtspreal.h @@ -0,0 +1,93 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_RTSP_REAL_H__ +#define __GST_RTSP_REAL_H__ + +#include + +#include "asmrules.h" + +G_BEGIN_DECLS + +#define GST_TYPE_RTSP_REAL (gst_rtsp_real_get_type()) +#define GST_IS_RTSP_REAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSP_REAL)) +#define GST_IS_RTSP_REAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSP_REAL)) +#define GST_RTSP_REAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSP_REAL, GstRTSPReal)) +#define GST_RTSP_REAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSP_REAL, GstRTSPRealClass)) + +typedef struct _GstRTSPReal GstRTSPReal; +typedef struct _GstRTSPRealClass GstRTSPRealClass; + +typedef struct _GstRTSPRealStream GstRTSPRealStream; + +struct _GstRTSPRealStream { + guint id; + guint max_bit_rate; + guint avg_bit_rate; + guint max_packet_size; + guint avg_packet_size; + guint start_time; + guint preroll; + guint duration; + gchar *stream_name; + guint stream_name_len; + gchar *mime_type; + guint mime_type_len; + + GstASMRuleBook *rulebook; + + gchar *type_specific_data; + guint type_specific_data_len; + + guint16 num_rules, j, sel, codec; +}; + +struct _GstRTSPReal { + GstElement element; + + gchar checksum[34]; + gchar challenge2[64]; + gchar etag[64]; + gboolean isreal; + + guint n_streams; + GList *streams; + + guint max_bit_rate; + guint avg_bit_rate; + guint max_packet_size; + guint avg_packet_size; + guint duration; + + gchar *rules; +}; + +struct _GstRTSPRealClass { + GstElementClass parent_class; +}; + +GType gst_rtsp_real_get_type(void); + +GST_ELEMENT_REGISTER_DECLARE (rtspreal); + + +G_END_DECLS + +#endif /* __GST_RTSP_REAL_H__ */ diff --git a/gst/xingmux/gstxingmux.c b/gst/xingmux/gstxingmux.c new file mode 100644 index 0000000000..33087ccd69 --- /dev/null +++ b/gst/xingmux/gstxingmux.c @@ -0,0 +1,683 @@ +/* + * Copyright (c) 2006 Christophe Fergeau + * Copyright (c) 2008 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* Xing SDK: http://www.mp3-tech.org/programmer/sources/vbrheadersdk.zip */ + + +/** + * SECTION:element-xingmux + * @title: xingmux + * + * xingmux adds a Xing header to MP3 files. This contains information about the duration and size + * of the file and a seek table and is very useful for getting an almost correct duration and better + * seeking on VBR MP3 files. + * + * This element will remove any existing Xing, LAME or VBRI headers from the beginning of the file. + * + * ## Example launch line + * |[ + * gst-launch-1.0 audiotestsrc num-buffers=1000 ! audioconvert ! lamemp3enc ! xingmux ! filesink location=test.mp3 + * gst-launch-1.0 filesrc location=test.mp3 ! xingmux ! filesink location=test2.mp3 + * gst-launch-1.0 filesrc location=test.mp3 ! mp3parse ! xingmux ! filesink location=test2.mp3 + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include "gstxingmux.h" + +GST_DEBUG_CATEGORY_STATIC (xing_mux_debug); +#define GST_CAT_DEFAULT xing_mux_debug + +#define gst_xing_mux_parent_class parent_class +G_DEFINE_TYPE (GstXingMux, gst_xing_mux, GST_TYPE_ELEMENT); +GST_ELEMENT_REGISTER_DEFINE (xingmux, "xingmux", GST_RANK_MARGINAL, + GST_TYPE_XING_MUX); + +/* Xing Header stuff */ +#define GST_XING_FRAME_FIELD (1 << 0) +#define GST_XING_BYTES_FIELD (1 << 1) +#define GST_XING_TOC_FIELD (1 << 2) +#define GST_XING_QUALITY_FIELD (1 << 3) + +typedef struct _GstXingSeekEntry +{ + gint64 timestamp; + gint byte; +} GstXingSeekEntry; + +static inline GstXingSeekEntry * +gst_xing_seek_entry_new (void) +{ + return g_slice_new (GstXingSeekEntry); +} + +static inline void +gst_xing_seek_entry_free (GstXingSeekEntry * entry) +{ + g_slice_free (GstXingSeekEntry, entry); +} + +static void gst_xing_mux_finalize (GObject * obj); +static GstStateChangeReturn +gst_xing_mux_change_state (GstElement * element, GstStateChange transition); +static GstFlowReturn gst_xing_mux_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static gboolean gst_xing_mux_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); + +static GstStaticPadTemplate gst_xing_mux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ]")); + + +static GstStaticPadTemplate gst_xing_mux_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ]")); +static const guint mp3types_bitrates[2][3][16] = { + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} + }, +}; + +static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; + +static gboolean +parse_header (guint32 header, guint * ret_size, guint * ret_spf, + gulong * ret_rate) +{ + guint length, spf; + gulong samplerate, bitrate, layer, padding; + gint lsf, mpg25; + + if ((header & 0xffe00000) != 0xffe00000) { + g_warning ("invalid sync"); + return FALSE; + } + + if (((header >> 19) & 3) == 0x01) { + g_warning ("invalid MPEG version"); + return FALSE; + } + + if (((header >> 17) & 3) == 0x00) { + g_warning ("invalid MPEG layer"); + return FALSE; + } + + if (((header >> 12) & 0xf) == 0xf || ((header >> 12) & 0xf) == 0x0) { + g_warning ("invalid bitrate"); + return FALSE; + } + + if (((header >> 10) & 0x3) == 0x3) { + g_warning ("invalid sampling rate"); + return FALSE; + } + + if (header & 0x00000002) { + g_warning ("invalid emphasis"); + return FALSE; + } + + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + layer = 4 - ((header >> 17) & 0x3); + + bitrate = (header >> 12) & 0xF; + bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; + if (bitrate == 0) + return FALSE; + + samplerate = (header >> 10) & 0x3; + samplerate = mp3types_freqs[lsf + mpg25][samplerate]; + + padding = (header >> 9) & 0x1; + + switch (layer) { + case 1: + length = 4 * ((bitrate * 12) / samplerate + padding); + break; + case 2: + length = (bitrate * 144) / samplerate + padding; + break; + default: + case 3: + length = (bitrate * 144) / (samplerate << lsf) + padding; + break; + } + + if (layer == 1) + spf = 384; + else if (layer == 2 || lsf == 0) + spf = 1152; + else + spf = 576; + + if (ret_size) + *ret_size = length; + if (ret_spf) + *ret_spf = spf; + if (ret_rate) + *ret_rate = samplerate; + + return TRUE; +} + +static guint +get_xing_offset (guint32 header) +{ + guint mpeg_version = (header >> 19) & 0x3; + guint channel_mode = (header >> 6) & 0x3; + + if (mpeg_version == 0x3) { + if (channel_mode == 0x3) { + return 0x11; + } else { + return 0x20; + } + } else { + if (channel_mode == 0x3) { + return 0x09; + } else { + return 0x11; + } + } +} + +static gboolean +has_xing_header (guint32 header, GstBuffer * buffer, gsize size) +{ + gboolean ret; + GstMapInfo map; + guint8 *data; + + gst_buffer_map (buffer, &map, GST_MAP_READ); + data = map.data; + data += 4; + data += get_xing_offset (header); + + if (memcmp (data, "Xing", 4) == 0 || + memcmp (data, "Info", 4) == 0 || memcmp (data, "VBRI", 4) == 0) + ret = TRUE; + else + ret = FALSE; + + gst_buffer_unmap (buffer, &map); + return ret; +} + +static GstBuffer * +generate_xing_header (GstXingMux * xing) +{ + guint8 *xing_flags; + guint32 xing_flags_tmp = 0; + GstBuffer *xing_header; + GstMapInfo map; + guchar *data; + + guint32 header; + guint32 header_be; + guint size, spf, xing_offset; + gulong rate; + guint bitrate = 0x00; + + gint64 duration; + gint64 byte_count; + + header = xing->first_header; + + /* Set bitrate and choose lowest possible size */ + do { + bitrate++; + + header &= 0xffff0fff; + header |= bitrate << 12; + + if (!parse_header (header, &size, &spf, &rate)) { + GST_ERROR ("Failed to parse header!"); + return NULL; + } + xing_offset = get_xing_offset (header); + } while (size < (4 + xing_offset + 4 + 4 + 4 + 4 + 100) && bitrate < 0xe); + + if (bitrate == 0xe) { + GST_ERROR ("No usable bitrate found!"); + return NULL; + } + + xing_header = gst_buffer_new_and_alloc (size); + + gst_buffer_map (xing_header, &map, GST_MAP_WRITE); + data = map.data; + memset (data, 0, size); + header_be = GUINT32_TO_BE (header); + memcpy (data, &header_be, 4); + + data += 4; + data += xing_offset; + + memcpy (data, "Xing", 4); + data += 4; + + xing_flags = data; + data += 4; + + if (xing->duration != GST_CLOCK_TIME_NONE) { + duration = xing->duration; + } else { + GstFormat fmt = GST_FORMAT_TIME; + + if (!gst_pad_peer_query_duration (xing->sinkpad, fmt, &duration)) + duration = GST_CLOCK_TIME_NONE; + } + + if (duration != GST_CLOCK_TIME_NONE) { + guint32 number_of_frames; + + /* The Xing Header contains a NumberOfFrames field, which verifies to: + * Duration = NumberOfFrames *SamplesPerFrame/SamplingRate + * SamplesPerFrame and SamplingRate are values for the current frame. + */ + number_of_frames = gst_util_uint64_scale (duration, rate, GST_SECOND) / spf; + number_of_frames += 1; /* Xing Header Frame */ + GST_DEBUG ("Setting number of frames to %u", number_of_frames); + number_of_frames = GUINT32_TO_BE (number_of_frames); + memcpy (data, &number_of_frames, 4); + xing_flags_tmp |= GST_XING_FRAME_FIELD; + data += 4; + } + + if (xing->byte_count != 0) { + byte_count = xing->byte_count; + } else { + GstFormat fmt = GST_FORMAT_BYTES; + + if (!gst_pad_peer_query_duration (xing->sinkpad, fmt, &byte_count)) + byte_count = 0; + if (byte_count == -1) + byte_count = 0; + } + + if (byte_count != 0) { + guint32 nbytes; + + if (byte_count > G_MAXUINT32) { + GST_DEBUG ("Too large stream: %" G_GINT64_FORMAT " > %u bytes", + byte_count, G_MAXUINT32); + } else { + nbytes = byte_count; + GST_DEBUG ("Setting number of bytes to %u", nbytes); + nbytes = GUINT32_TO_BE (nbytes); + memcpy (data, &nbytes, 4); + xing_flags_tmp |= GST_XING_BYTES_FIELD; + data += 4; + } + } + + if (xing->seek_table != NULL && byte_count != 0 + && duration != GST_CLOCK_TIME_NONE) { + GList *it; + gint percent = 0; + + xing_flags_tmp |= GST_XING_TOC_FIELD; + + GST_DEBUG ("Writing seek table"); + for (it = xing->seek_table; it != NULL && percent < 100; it = it->next) { + GstXingSeekEntry *entry = (GstXingSeekEntry *) it->data; + gint64 pos; + guchar byte; + + while ((entry->timestamp * 100) / duration >= percent) { + pos = (entry->byte * 256) / byte_count; + GST_DEBUG (" %d %% -- %" G_GINT64_FORMAT " 1/256", percent, pos); + byte = (guchar) pos; + memcpy (data, &byte, 1); + data++; + percent++; + } + } + + if (percent < 100) { + guchar b; + gint i; + + memcpy (&b, data - 1, 1); + + for (i = percent; i < 100; i++) { + GST_DEBUG (" %d %% -- %d 1/256", i, b); + memcpy (data, &b, 1); + data++; + } + } + } + + GST_DEBUG ("Setting Xing flags to 0x%x\n", xing_flags_tmp); + xing_flags_tmp = GUINT32_TO_BE (xing_flags_tmp); + memcpy (xing_flags, &xing_flags_tmp, 4); + gst_buffer_unmap (xing_header, &map); + return xing_header; +} + +static void +gst_xing_mux_class_init (GstXingMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_xing_mux_finalize); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_xing_mux_change_state); + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_xing_mux_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_xing_mux_sink_template); + + GST_DEBUG_CATEGORY_INIT (xing_mux_debug, "xingmux", 0, "Xing Header Muxer"); + + gst_element_class_set_static_metadata (gstelement_class, "MP3 Xing muxer", + "Formatter/Muxer/Metadata", + "Adds a Xing header to the beginning of a VBR MP3 file", + "Christophe Fergeau "); +} + +static void +gst_xing_mux_finalize (GObject * obj) +{ + GstXingMux *xing = GST_XING_MUX (obj); + + if (xing->adapter) { + g_object_unref (xing->adapter); + xing->adapter = NULL; + } + + if (xing->seek_table) { + g_list_foreach (xing->seek_table, (GFunc) gst_xing_seek_entry_free, NULL); + g_list_free (xing->seek_table); + xing->seek_table = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +xing_reset (GstXingMux * xing) +{ + xing->duration = GST_CLOCK_TIME_NONE; + xing->byte_count = 0; + + gst_adapter_clear (xing->adapter); + + if (xing->seek_table) { + g_list_foreach (xing->seek_table, (GFunc) gst_xing_seek_entry_free, NULL); + g_list_free (xing->seek_table); + xing->seek_table = NULL; + } + + xing->sent_xing = FALSE; +} + + +static void +gst_xing_mux_init (GstXingMux * xing) +{ + /* pad through which data comes in to the element */ + xing->sinkpad = + gst_pad_new_from_static_template (&gst_xing_mux_sink_template, "sink"); + gst_pad_set_chain_function (xing->sinkpad, + GST_DEBUG_FUNCPTR (gst_xing_mux_chain)); + gst_pad_set_event_function (xing->sinkpad, + GST_DEBUG_FUNCPTR (gst_xing_mux_sink_event)); + GST_PAD_SET_PROXY_CAPS (xing->sinkpad); + gst_element_add_pad (GST_ELEMENT (xing), xing->sinkpad); + + /* pad through which data goes out of the element */ + xing->srcpad = + gst_pad_new_from_static_template (&gst_xing_mux_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (xing), xing->srcpad); + + xing->adapter = gst_adapter_new (); + + xing_reset (xing); +} + +static GstFlowReturn +gst_xing_mux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) +{ + GstXingMux *xing = GST_XING_MUX (parent); + GstFlowReturn ret = GST_FLOW_OK; + + gst_adapter_push (xing->adapter, buffer); + + while (gst_adapter_available (xing->adapter) >= 4) { + const guchar *data; + guint32 header; + GstBuffer *outbuf; + GstClockTime duration; + guint size, spf; + gulong rate; + GstXingSeekEntry *seek_entry; + + data = gst_adapter_map (xing->adapter, 4); + header = GST_READ_UINT32_BE (data); + gst_adapter_unmap (xing->adapter); + + if (!parse_header (header, &size, &spf, &rate)) { + GST_DEBUG ("Lost sync, resyncing"); + gst_adapter_flush (xing->adapter, 1); + continue; + } + + if (gst_adapter_available (xing->adapter) < size) + break; + + outbuf = gst_adapter_take_buffer (xing->adapter, size); + + if (!xing->sent_xing) { + if (has_xing_header (header, outbuf, size)) { + GST_LOG_OBJECT (xing, "Dropping old Xing header"); + gst_buffer_unref (outbuf); + continue; + } else { + GstBuffer *xing_header; + guint64 xing_header_size; + + xing->first_header = header; + + xing_header = generate_xing_header (xing); + + if (xing_header == NULL) { + GST_ERROR ("Can't generate Xing header"); + gst_buffer_unref (outbuf); + return GST_FLOW_ERROR; + } + + xing_header_size = gst_buffer_get_size (xing_header); + + if ((ret = gst_pad_push (xing->srcpad, xing_header)) != GST_FLOW_OK) { + GST_ERROR_OBJECT (xing, "Failed to push Xing header: %s", + gst_flow_get_name (ret)); + gst_buffer_unref (xing_header); + gst_buffer_unref (outbuf); + return ret; + } + + xing->byte_count += xing_header_size; + xing->sent_xing = TRUE; + } + } + + seek_entry = gst_xing_seek_entry_new (); + seek_entry->timestamp = + (xing->duration == GST_CLOCK_TIME_NONE) ? 0 : xing->duration; + /* Workaround for parsers checking that the first seek table entry is 0 */ + seek_entry->byte = (seek_entry->timestamp == 0) ? 0 : xing->byte_count; + xing->seek_table = g_list_append (xing->seek_table, seek_entry); + + duration = gst_util_uint64_scale_ceil (spf, GST_SECOND, rate); + + GST_BUFFER_TIMESTAMP (outbuf) = + (xing->duration == GST_CLOCK_TIME_NONE) ? 0 : xing->duration; + GST_BUFFER_DURATION (outbuf) = duration; + GST_BUFFER_OFFSET (outbuf) = xing->byte_count; + xing->byte_count += gst_buffer_get_size (outbuf); + GST_BUFFER_OFFSET_END (outbuf) = xing->byte_count; + + if (xing->duration == GST_CLOCK_TIME_NONE) + xing->duration = duration; + else + xing->duration += duration; + + if ((ret = gst_pad_push (xing->srcpad, outbuf)) != GST_FLOW_OK) { + GST_ERROR_OBJECT (xing, "Failed to push MP3 frame: %s", + gst_flow_get_name (ret)); + return ret; + } + } + + return ret; +} + +static gboolean +gst_xing_mux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstXingMux *xing; + gboolean result; + + xing = GST_XING_MUX (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEGMENT: + if (xing->sent_xing) { + GST_ERROR ("Already sent Xing header, dropping NEWSEGMENT event!"); + gst_event_unref (event); + result = FALSE; + } else { + GstSegment segment; + + gst_event_copy_segment (event, &segment); + + if (segment.format == GST_FORMAT_BYTES) { + result = gst_pad_push_event (xing->srcpad, event); + } else { + + gst_event_unref (event); + gst_segment_init (&segment, GST_FORMAT_BYTES); + event = gst_event_new_segment (&segment); + + result = gst_pad_push_event (xing->srcpad, event); + } + } + break; + + case GST_EVENT_EOS:{ + GstEvent *n_event; + + GST_DEBUG_OBJECT (xing, "handling EOS event"); + + if (xing->sent_xing) { + GstSegment segment; + + gst_segment_init (&segment, GST_FORMAT_BYTES); + n_event = gst_event_new_segment (&segment); + + if (G_UNLIKELY (!gst_pad_push_event (xing->srcpad, n_event))) { + GST_WARNING + ("Failed to seek to position 0 for pushing the Xing header"); + } else { + GstBuffer *header; + GstFlowReturn ret; + + header = generate_xing_header (xing); + + if (header == NULL) { + GST_ERROR ("Can't generate Xing header"); + } else { + + GST_INFO ("Writing real Xing header to beginning of stream"); + + if ((ret = gst_pad_push (xing->srcpad, header)) != GST_FLOW_OK) + GST_WARNING ("Failed to push updated Xing header: %s\n", + gst_flow_get_name (ret)); + } + } + } + result = gst_pad_push_event (xing->srcpad, event); + break; + } + default: + result = gst_pad_event_default (pad, parent, event); + break; + } + + return result; +} + + +static GstStateChangeReturn +gst_xing_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstXingMux *xing; + GstStateChangeReturn result; + + xing = GST_XING_MUX (element); + + result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + xing_reset (xing); + break; + default: + break; + } + + return result; +} diff --git a/gst/xingmux/gstxingmux.h b/gst/xingmux/gstxingmux.h new file mode 100644 index 0000000000..0d8e82c896 --- /dev/null +++ b/gst/xingmux/gstxingmux.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2006 Christophe Fergeau + * Copyright (c) 2008 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#ifndef __GST_XINGMUX_H__ +#define __GST_XINGMUX_H__ + +G_BEGIN_DECLS + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_XING_MUX \ + (gst_xing_mux_get_type()) +#define GST_XING_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_XING_MUX,GstXingMux)) +#define GST_XING_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_XING_MUX,GstXingMuxClass)) +#define GST_IS_XING_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_XING_MUX)) +#define GST_IS_XING_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XING_MUX)) + +typedef struct _GstXingMux GstXingMux; +typedef struct _GstXingMuxClass GstXingMuxClass; + +/* Definition of structure storing data for this element. */ + +/** + * GstXingMux: + * + * Opaque data structure. + */ +struct _GstXingMux { + GstElement element; + + GstPad *sinkpad, *srcpad; + + /* < private > */ + + GstAdapter *adapter; + GstClockTime duration; + guint64 byte_count; + guint64 frame_count; + GList *seek_table; + gboolean sent_xing; + + /* Copy of the first frame header */ + guint32 first_header; +}; + +/* Standard definition defining a class for this element. */ + +/** + * GstXingMuxClass: + * + * Opaque data structure. + */ +struct _GstXingMuxClass { + GstElementClass parent_class; +}; + +/* Standard function returning type information. */ +GType gst_xing_mux_get_type (void); +GST_ELEMENT_REGISTER_DECLARE (xingmux); + +G_END_DECLS + +#endif /* __GST_XINGMUX_H__ */ diff --git a/gst/xingmux/meson.build b/gst/xingmux/meson.build new file mode 100644 index 0000000000..d5b9f64182 --- /dev/null +++ b/gst/xingmux/meson.build @@ -0,0 +1,15 @@ +xing_sources = [ + 'plugin.c', + 'gstxingmux.c', +] + +gstxingmux = library('gstxingmux', + xing_sources, + c_args : ugly_args, + include_directories : [configinc], + dependencies : [gstbase_dep], + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstxingmux, install_dir : plugins_pkgconfig_install_dir) +plugins += [gstxingmux] diff --git a/gst/xingmux/plugin.c b/gst/xingmux/plugin.c new file mode 100644 index 0000000000..21dabbbbcb --- /dev/null +++ b/gst/xingmux/plugin.c @@ -0,0 +1,37 @@ +/* GStreamer + * Copyright (C) <2008> Jan Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstxingmux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return GST_ELEMENT_REGISTER (xingmux, plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + xingmux, + "Add XING tags to mpeg audio files", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/hooks/pre-commit.hook b/hooks/pre-commit.hook new file mode 100755 index 0000000000..6f177402b3 --- /dev/null +++ b/hooks/pre-commit.hook @@ -0,0 +1,83 @@ +#!/bin/sh +# +# Check that the code follows a consistent code style +# + +# Check for existence of indent, and error out if not present. +# On some *bsd systems the binary seems to be called gnunindent, +# so check for that first. + +version=`gnuindent --version 2>/dev/null` +if test "x$version" = "x"; then + version=`gindent --version 2>/dev/null` + if test "x$version" = "x"; then + version=`indent --version 2>/dev/null` + if test "x$version" = "x"; then + echo "GStreamer git pre-commit hook:" + echo "Did not find GNU indent, please install it before continuing." + exit 1 + else + INDENT=indent + fi + else + INDENT=gindent + fi +else + INDENT=gnuindent +fi + +case `$INDENT --version` in + GNU*) + ;; + default) + echo "GStreamer git pre-commit hook:" + echo "Did not find GNU indent, please install it before continuing." + echo "(Found $INDENT, but it doesn't seem to be GNU indent)" + exit 1 + ;; +esac + +INDENT_PARAMETERS="--braces-on-if-line \ + --case-brace-indentation0 \ + --case-indentation2 \ + --braces-after-struct-decl-line \ + --line-length80 \ + --no-tabs \ + --cuddle-else \ + --dont-line-up-parentheses \ + --continuation-indentation4 \ + --honour-newlines \ + --tab-size8 \ + --indent-level2 \ + --leave-preprocessor-space" + +echo "--Checking style--" +for file in `git diff-index --cached --name-only HEAD --diff-filter=ACMR| grep "\.c$"` ; do + # nf is the temporary checkout. This makes sure we check against the + # revision in the index (and not the checked out version). + nf=`git checkout-index --temp ${file} | cut -f 1` + newfile=`mktemp /tmp/${nf}.XXXXXX` || exit 1 + $INDENT ${INDENT_PARAMETERS} \ + $nf -o $newfile 2>> /dev/null + # FIXME: Call indent twice as it tends to do line-breaks + # different for every second call. + $INDENT ${INDENT_PARAMETERS} \ + $newfile 2>> /dev/null + diff -u -p "${nf}" "${newfile}" + r=$? + rm "${newfile}" + rm "${nf}" + if [ $r != 0 ] ; then +echo "=================================================================================================" +echo " Code style error in: $file " +echo " " +echo " Please fix before committing. Don't forget to run git add before trying to commit again. " +echo " If the whole file is to be committed, this should work (run from the top-level directory): " +echo " " +echo " gst-indent $file; git add $file; git commit" +echo " " +echo "=================================================================================================" + exit 1 + fi +done +echo "--Checking style pass--" diff --git a/meson.build b/meson.build new file mode 100644 index 0000000000..c5c78fc2bf --- /dev/null +++ b/meson.build @@ -0,0 +1,318 @@ +project('gst-plugins-ugly', 'c', + version : '1.19.2', + meson_version : '>= 0.54', + default_options : [ 'warning_level=1', + 'buildtype=debugoptimized' ]) + +gst_version = meson.project_version() +version_arr = gst_version.split('.') +gst_version_major = version_arr[0].to_int() +gst_version_minor = version_arr[1].to_int() +gst_version_micro = version_arr[2].to_int() + if version_arr.length() == 4 + gst_version_nano = version_arr[3].to_int() +else + gst_version_nano = 0 +endif +gst_version_is_dev = gst_version_minor % 2 == 1 and gst_version_micro < 90 + +have_cxx = add_languages('cpp', native: false, required: false) + +glib_req = '>= 2.56.0' +gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor) + +api_version = '1.0' + +plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0') +plugins = [] + +cc = meson.get_compiler('c') +if have_cxx + cxx = meson.get_compiler('cpp') +endif + +if cc.get_id() == 'msvc' + msvc_args = [ + # Ignore several spurious warnings for things gstreamer does very commonly + # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it + # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once + # NOTE: Only add warnings here if you are sure they're spurious + '/wd4018', # implicit signed/unsigned conversion + '/wd4146', # unary minus on unsigned (beware INT_MIN) + '/wd4244', # lossy type conversion (e.g. double -> int) + '/wd4305', # truncating type conversion (e.g. double -> float) + cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 + + # Enable some warnings on MSVC to match GCC/Clang behaviour + '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled + '/w14101', # 'identifier' : unreferenced local variable + '/w14189', # 'identifier' : local variable is initialized but not referenced + ] + if have_cxx + add_project_arguments(msvc_args, language: ['c', 'cpp']) + else + add_project_arguments(msvc_args, language: 'c') + endif + # Disable SAFESEH with MSVC for plugins and libs that use external deps that + # are built with MinGW + noseh_link_args = ['/SAFESEH:NO'] +else + noseh_link_args = [] +endif + +if cc.has_link_argument('-Wl,-Bsymbolic-functions') + add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') +endif +if have_cxx and cxx.has_link_argument('-Wl,-Bsymbolic-functions') + add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'cpp') +endif + +cdata = configuration_data() +check_headers = [ + ['HAVE_DLFCN_H', 'dlfcn.h'], + ['HAVE_INTTYPES_H', 'inttypes.h'], + ['HAVE_MALLOC_H', 'malloc.h'], + ['HAVE_MEMORY_H', 'memory.h'], + ['HAVE_STDINT_H', 'stdint.h'], + ['HAVE_STDLIB_H', 'stdlib.h'], + ['HAVE_STRINGS_H', 'strings.h'], + ['HAVE_STRING_H', 'string.h'], + ['HAVE_SYS_STAT_H', 'sys/stat.h'], + ['HAVE_SYS_TYPES_H', 'sys/types.h'], + ['HAVE_UNISTD_H', 'unistd.h'], + ['HAVE_WINSOCK2_H', 'winsock2.h'], +] + +foreach h : check_headers + if cc.has_header(h.get(1)) + cdata.set(h.get(0), 1) + endif +endforeach + +check_functions = [ + ['HAVE_DCGETTEXT', 'dcgettext'], # FIXME: this looks unused +] + +foreach f : check_functions + if cc.has_function(f.get(1)) + cdata.set(f.get(0), 1) + endif +endforeach + +cdata.set('SIZEOF_CHAR', cc.sizeof('char')) +cdata.set('SIZEOF_INT', cc.sizeof('int')) +cdata.set('SIZEOF_LONG', cc.sizeof('long')) +cdata.set('SIZEOF_SHORT', cc.sizeof('short')) +cdata.set('SIZEOF_VOIDP', cc.sizeof('void*')) + +cdata.set_quoted('VERSION', gst_version) +cdata.set_quoted('PACKAGE', 'gst-plugins-ugly') +cdata.set_quoted('GST_LICENSE', 'LGPL') +cdata.set_quoted('GETTEXT_PACKAGE', 'gst-plugins-ugly-1.0') +cdata.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) + +# GStreamer package name and origin url +gst_package_name = get_option('package-name') +if gst_package_name == '' + if gst_version_nano == 0 + gst_package_name = 'GStreamer Ugly Plug-ins source release' + elif gst_version_nano == 1 + gst_package_name = 'GStreamer Ugly Plug-ins git' + else + gst_package_name = 'GStreamer Ugly Plug-ins prerelease' + endif +endif +cdata.set_quoted('GST_PACKAGE_NAME', gst_package_name) +cdata.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin')) + +# Mandatory GST deps +gst_dep = dependency('gstreamer-1.0', version : gst_req, + fallback : ['gstreamer', 'gst_dep']) +gstapp_dep = dependency('gstreamer-app-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'app_dep']) +gstvideo_dep = dependency('gstreamer-video-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'video_dep']) +gstpbutils_dep = dependency('gstreamer-pbutils-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'pbutils_dep']) +gsttag_dep = dependency('gstreamer-tag-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'tag_dep']) +gstfft_dep = dependency('gstreamer-fft-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'fft_dep']) +gstaudio_dep = dependency('gstreamer-audio-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'audio_dep']) +gstbase_dep = dependency('gstreamer-base-1.0', version : gst_req, + fallback : ['gstreamer', 'gst_base_dep']) +gstriff_dep = dependency('gstreamer-riff-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'riff_dep']) +gstrtp_dep = dependency('gstreamer-rtp-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'rtp_dep']) +gstnet_dep = dependency('gstreamer-net-1.0', version : gst_req, + fallback : ['gstreamer', 'gst_net_dep']) +gstsdp_dep = dependency('gstreamer-sdp-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'sdp_dep']) +gstrtsp_dep = dependency('gstreamer-rtsp-1.0', version : gst_req, + fallback : ['gst-plugins-base', 'rtsp_dep']) +gstcheck_dep = dependency('gstreamer-check-1.0', version : gst_req, + required : get_option('tests'), + fallback : ['gstreamer', 'gst_check_dep']) +gstcontroller_dep = dependency('gstreamer-controller-1.0', version : gst_req, + fallback : ['gstreamer', 'gst_controller_dep']) + +orc_dep = dependency('orc-0.4', version : '>= 0.4.16', required : get_option('orc'), + fallback : ['orc', 'orc_dep']) +if orc_dep.found() + cdata.set('HAVE_ORC', 1) # used by a52dec for cpu detection +else + cdata.set('DISABLE_ORC', 1) +endif + +gmodule_dep = dependency('gmodule-2.0', fallback : ['glib', 'libgmodule_dep']) + +if gmodule_dep.version().version_compare('< 2.67.4') + cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)') +endif + +ugly_args = ['-DHAVE_CONFIG_H'] +configinc = include_directories('.') +libsinc = include_directories('gst-libs') + +# Disable compiler warnings for unused variables and args if gst debug system is disabled +if gst_dep.type_name() == 'internal' + gst_debug_disabled = not subproject('gstreamer').get_variable('gst_debug') +else + # We can't check that in the case of subprojects as we won't + # be able to build against an internal dependency (which is not built yet) + gst_debug_disabled = cc.has_header_symbol('gst/gstconfig.h', 'GST_DISABLE_GST_DEBUG', dependencies: gst_dep) +endif + +if gst_debug_disabled + message('GStreamer debug system is disabled') + if cc.has_argument('-Wno-unused') + add_project_arguments('-Wno-unused', language: 'c') + endif + if have_cxx and cxx.has_argument ('-Wno-unused') + add_project_arguments('-Wno-unused', language: 'cpp') + endif +else + message('GStreamer debug system is enabled') +endif + +warning_flags = [ + '-Wmissing-declarations', + '-Wredundant-decls', + '-Wwrite-strings', + '-Wformat', + '-Wformat-nonliteral', + '-Wformat-security', + '-Winit-self', + '-Wmissing-include-dirs', + '-Waddress', + '-Wno-multichar', + '-Wvla', + '-Wpointer-arith', + '-Waggregate-return', + '-fno-strict-aliasing', + # Symbol visibility + '-fvisibility=hidden', +] + +warning_c_flags = [ + '-Wmissing-prototypes', + '-Wold-style-definition', + '-Wdeclaration-after-statement', + '-Wnested-externs' +] + +foreach extra_arg : warning_flags + if cc.has_argument (extra_arg) + add_project_arguments([extra_arg], language: 'c') + endif + if have_cxx and cxx.has_argument (extra_arg) + add_project_arguments([extra_arg], language: 'cpp') + endif +endforeach + +foreach extra_arg : warning_c_flags + if cc.has_argument (extra_arg) + add_project_arguments([extra_arg], language: 'c') + endif +endforeach + +# Define G_DISABLE_DEPRECATED for development versions +if gst_version_is_dev + message('Disabling deprecated GLib API') + add_project_arguments('-DG_DISABLE_DEPRECATED', language: 'c') +endif + +cast_checks = get_option('gobject-cast-checks') +if cast_checks.disabled() or (cast_checks.auto() and not gst_version_is_dev) + message('Disabling GLib cast checks') + add_project_arguments('-DG_DISABLE_CAST_CHECKS', language: 'c') +endif + +glib_asserts = get_option('glib-asserts') +if glib_asserts.disabled() or (glib_asserts.auto() and not gst_version_is_dev) + message('Disabling GLib asserts') + add_project_arguments('-DG_DISABLE_ASSERT', language: 'c') +endif + +glib_checks = get_option('glib-checks') +if glib_checks.disabled() or (glib_checks.auto() and not gst_version_is_dev) + message('Disabling GLib checks') + add_project_arguments('-DG_DISABLE_CHECKS', language: 'c') +endif + +presetdir = join_paths(get_option('datadir'), 'gstreamer-' + api_version, 'presets') + +pkgconfig = import('pkgconfig') +plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig') +if get_option('default_library') == 'shared' + # If we don't build static plugins there is no need to generate pc files + plugins_pkgconfig_install_dir = disabler() +endif + +python3 = import('python').find_installation() +subdir('gst') +subdir('ext') +subdir('tests') + +# xgettext is optional (on Windows for instance) +if find_program('xgettext', required : get_option('nls')).found() + cdata.set('ENABLE_NLS', 1) + subdir('po') +endif +subdir('docs') +subdir('scripts') + +# Set release date +if gst_version_nano == 0 + extract_release_date = find_program('scripts/extract-release-date-from-doap-file.py') + run_result = run_command(extract_release_date, gst_version, files('gst-plugins-ugly.doap')) + if run_result.returncode() == 0 + release_date = run_result.stdout().strip() + cdata.set_quoted('GST_PACKAGE_RELEASE_DATETIME', release_date) + message('Package release date: ' + release_date) + else + # Error out if our release can't be found in the .doap file + error(run_result.stderr()) + endif +endif + +configure_file(output : 'config.h', configuration : cdata) + +run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")') + +if meson.version().version_compare('>= 0.54') + plugin_names = [] + foreach plugin: plugins + # FIXME: Use str.subtring() when we can depend on Meson 0.56 + split = plugin.name().split('gst') + if split.length() == 2 + plugin_names += [split[1]] + else + warning('Need substring API in meson >= 0.56 to properly parse plugin name: ' + plugin.name()) + plugin_names += [plugin.name()] + endif + endforeach + summary({'Plugins':plugin_names}, list_sep: ', ') +endif diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000000..0b59d01a61 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,39 @@ +option('x264_libraries', type : 'string', value : '', + description : 'Colon separated list of additional x264 library paths, e.g. for 10-bit version') + +# Feature options for plugins without external deps +option('asfdemux', type : 'feature', value : 'auto') +option('dvdlpcmdec', type : 'feature', value : 'auto') +option('dvdsub', type : 'feature', value : 'auto') +option('realmedia', type : 'feature', value : 'auto') +option('xingmux', type : 'feature', value : 'auto') + +# Feature options for plugins that need external deps +option('a52dec', type : 'feature', value : 'auto', description : 'Dolby Digital (AC-3) audio decoder plugin') +option('amrnb', type : 'feature', value : 'auto', description : 'Adaptive Multi-Rate Narrow-Band audio codec plugin') +option('amrwbdec', type : 'feature', value : 'auto', description : 'Adaptive Multi-Rate Wide-Band audio decoder plugin') +option('cdio', type : 'feature', value : 'auto', description : 'CD audio source plugin') +option('dvdread', type : 'feature', value : 'auto', description : 'DVD video source plugin') +option('mpeg2dec', type : 'feature', value : 'auto', description : 'MPEG 2 video decoder plugin') +option('sidplay', type : 'feature', value : 'auto', description : 'Commodore 64 audio decoder plugin') +option('x264', type : 'feature', value : 'auto', description : 'H.264 video encoder plugin') + +# Common feature options +option('nls', type : 'feature', value : 'auto', yield: true, + description : 'Enable native language support (translations)') +option('orc', type : 'feature', value : 'auto', yield : true) +option('tests', type : 'feature', value : 'auto', yield : true) +option('gobject-cast-checks', type : 'feature', value : 'auto', yield : true, + description: 'Enable run-time GObject cast checks (auto = enabled for development, disabled for stable releases)') +option('glib-asserts', type : 'feature', value : 'enabled', yield : true, + description: 'Enable GLib assertion (auto = enabled for development, disabled for stable releases)') +option('glib-checks', type : 'feature', value : 'enabled', yield : true, + description: 'Enable GLib checks such as API guards (auto = enabled for development, disabled for stable releases)') + +# Common options +option('package-name', type : 'string', yield : true, + description : 'package name to use in plugins') +option('package-origin', type : 'string', value : 'Unknown package origin', yield: true, + description : 'package origin URL to use in plugins') +option('doc', type : 'feature', value : 'auto', yield: true, + description: 'Enable documentation.') \ No newline at end of file diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000000..99428b1e99 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1 @@ +af ast az bg ca cs da de el en_GB eo es eu fi fr fur gl hr hu id it ja lt lv ms mt nb nl or pl pt_BR ro ru sk sl sq sr sv ta tr uk vi zh_CN diff --git a/po/POTFILES b/po/POTFILES new file mode 100644 index 0000000000..5520fe110b --- /dev/null +++ b/po/POTFILES @@ -0,0 +1,3 @@ +ext/cdio/gstcdiocddasrc.c +ext/dvdread/dvdreadsrc.c +gst/asfdemux/gstasfdemux.c diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000000..27b75ef986 --- /dev/null +++ b/po/af.po @@ -0,0 +1,234 @@ +# Translation of gstreamer plugin messages to Afrikaans. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is put in the public domain. +# Petri Jooste , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.7.6\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2004-03-18 14:16+0200\n" +"Last-Translator: Petri Jooste \n" +"Language-Team: Afrikaans \n" +"Language: af\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "Kon nie skryf na ler \"%s\" nie." + +msgid "Could not open CD device for reading." +msgstr "Kon nie CD-toestel oopmaak om te lees nie." + +#, fuzzy +msgid "Disc is not an Audio CD." +msgstr "Toestel is nie oop nie." + +msgid "Could not open DVD" +msgstr "" + +#, fuzzy, c-format +msgid "Could not open DVD title %d" +msgstr "Kon nie vfs-ler \"%s\" toemaak nie." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Kon nie skryf na ler \"%s\" nie." + +msgid "This stream contains no data." +msgstr "" + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "Kon nie skryf na ler \"%s\" nie." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Kon nie vfs-ler \"%s\" toemaak nie." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Kon nie ler \"%s\" oopmaak om in te skryf nie." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Fout tydens toemaak van ler \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Kon nie ler \"%s\" oopmaak om te lees nie." + +#~ msgid "No filename specified." +#~ msgstr "Geen lernaam gespesifiseer." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "Geen of ongeldige klanktoevoer, AVI-stroom sal korrup wees." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Kon nie beheertoestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Kon nie oudio-toestel \"%s\" konfigureer nie." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Kon nie klanktoestel \"%s\" verstel na %d Hz nie." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "Kon nie oudio-toestel \"%s\" toemaak nie." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Kon nie video-toestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Kon nie video-toestel \"%s\" toemaak nie." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "Kon nie skryf na toestel \"%s\" nie." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS-toestel \"%s\" is reeds in gebruik deur 'n ander program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Kon nie toegang kry tot toestel \"%s\" nie, kyk na toegangsregte." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Toestel \"%s\" bestaan nie." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Kon nie toestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Kon nie toestel \"%s\" oopmaak vir lees nie." + +#~ msgid "Volume" +#~ msgstr "Volume" + +#~ msgid "Bass" +#~ msgstr "Bas" + +#~ msgid "Treble" +#~ msgstr "Treble" + +#~ msgid "Synth" +#~ msgstr "Sintetiseerder" + +#~ msgid "PCM" +#~ msgstr "PCM" + +#~ msgid "Speaker" +#~ msgstr "Luidspreker" + +#~ msgid "Line-in" +#~ msgstr "Lyn-in" + +#~ msgid "Microphone" +#~ msgstr "Mikrofoon" + +#~ msgid "CD" +#~ msgstr "CD" + +#~ msgid "Mixer" +#~ msgstr "Menger" + +#~ msgid "PCM-2" +#~ msgstr "PCM-2" + +#~ msgid "Record" +#~ msgstr "Neem op" + +#~ msgid "In-gain" +#~ msgstr "In-versterking" + +#~ msgid "Out-gain" +#~ msgstr "Uit-versterking" + +#~ msgid "Line-1" +#~ msgstr "Lyn-1" + +#~ msgid "Line-2" +#~ msgstr "Lyn-2" + +#~ msgid "Line-3" +#~ msgstr "Lyn-3" + +#~ msgid "Digital-1" +#~ msgstr "Digitaal-1" + +#~ msgid "Digital-2" +#~ msgstr "Digitaal-2" + +#~ msgid "Digital-3" +#~ msgstr "Digitaal-3" + +#~ msgid "Phone-in" +#~ msgstr "Telefoon-in" + +#~ msgid "Phone-out" +#~ msgstr "Telefoon-uit" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "Radio" +#~ msgstr "Radio" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "Luidspreker" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Kon nie vfs-ler \"%s\" oopmaak vir lees nie." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Geen lernaam gespesifiseer." + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Kon nie vfs-ler \"%s\" oopmaak vir skryf nie." + +#, fuzzy +#~ msgid "No filename given" +#~ msgstr "Geen lernaam gespesifiseer." + +#~ msgid "No device specified." +#~ msgstr "Geen toestel gespesifiseer" + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "Kon nie toestel \"%s\" oopmaak vir lees en skryf nie." + +#~ msgid "Device is open." +#~ msgstr "Toestel is oop." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000000..9f7ecec00b --- /dev/null +++ b/po/ast.po @@ -0,0 +1,76 @@ +# Asturian translation for gst-plugins-ugly +# This file is put in the public domain. +# +# enolp , 2018. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.10.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2016-11-01 17:53+0200\n" +"PO-Revision-Date: 2018-07-14 12:03+0100\n" +"Last-Translator: enolp \n" +"Language-Team: Asturian \n" +"Language: ast\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 2.0\n" + +#: ext/cdio/gstcdiocddasrc.c:199 +msgid "Could not read from CD." +msgstr "Nun pudo lleese dende'l CD." + +#: ext/cdio/gstcdiocddasrc.c:406 +msgid "Could not open CD device for reading." +msgstr "Nun pudo abrise'l preséu de CDs pa la llectura." + +#: ext/cdio/gstcdiocddasrc.c:413 +msgid "Disc is not an Audio CD." +msgstr "El discu nun ye un CD d'audiu." + +#: ext/dvdread/dvdreadsrc.c:231 ext/dvdread/dvdreadsrc.c:238 +msgid "Could not open DVD" +msgstr "Nun pudo abrise'l DVD" + +#: ext/dvdread/dvdreadsrc.c:245 ext/dvdread/dvdreadsrc.c:621 +#: ext/dvdread/dvdreadsrc.c:628 +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nun pudo abrise'l titulu del DVD %d" + +#: ext/dvdread/dvdreadsrc.c:251 +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Fallu al dir al capítulu %d del títulu del DVD %d" + +#: ext/dvdread/dvdreadsrc.c:635 +#, c-format +msgid "Could not open DVD title %d. Interactive titles are not supported by this element" +msgstr "Nun pudo abrise'l títulu del DVD %d. Esti elementu nun sofita los elementos interactivos." + +#: ext/dvdread/dvdreadsrc.c:990 +msgid "Could not read DVD. This may be because the DVD is encrypted and a DVD decryption library is not installed." +msgstr "Nun pudo lleese'l DVD. Esto podría ser porque'l DVD ta cifráu y nun s'instaló una biblioteca de descifráu de DVDs." + +#: ext/dvdread/dvdreadsrc.c:993 +msgid "Could not read DVD." +msgstr "Nun pudo lleese'l DVD." + +#: ext/lame/gstlamemp3enc.c:395 +msgid "Failed to configure LAME mp3 audio encoder. Check your encoding parameters." +msgstr "Fallu al configurar el codificador d'audiu MP3 de LAME. Comprueba los parámetros de codificación." + +#: ext/lame/gstlamemp3enc.c:427 ext/twolame/gsttwolamemp2enc.c:488 +#, c-format +msgid "The requested bitrate %d kbit/s for property '%s' is not allowed. The bitrate was changed to %d kbit/s." +msgstr "La tasa de bits %d kbit/s solicitada pa la propieda «%s» nun ta permitida. Camudóse la tasa de bits a %d kbit/s." + +#: ext/twolame/gsttwolamemp2enc.c:411 +msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +msgstr "Fallu al configurar el codificador TwoLAME. Comprueba los parámetros de codificación." + +#: gst/asfdemux/gstasfdemux.c:446 +msgid "This stream contains no data." +msgstr "Esti fluxu nun contién datos." diff --git a/po/az.po b/po/az.po new file mode 100644 index 0000000000..d3c387022e --- /dev/null +++ b/po/az.po @@ -0,0 +1,235 @@ +# Translation of 'gst-plugins' messages to Azerbaijani. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is put in the public domain. +# Mətin Əmirov , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-0.8.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2004-03-19 18:29+0200\n" +"Last-Translator: Metin Amiroff \n" +"Language-Team: Azerbaijani \n" +"Language: az\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "\"%s\" faylına yazıla bilmədi." + +msgid "Could not open CD device for reading." +msgstr "CD avadanlığı oxuma üçün açıla bilmədi." + +#, fuzzy +msgid "Disc is not an Audio CD." +msgstr "Avadanlıq açıq deyil." + +msgid "Could not open DVD" +msgstr "" + +#, fuzzy, c-format +msgid "Could not open DVD title %d" +msgstr "\"%s\" vfs faylı bağlana bilmədi." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "\"%s\" faylına yazıla bilmədi." + +msgid "This stream contains no data." +msgstr "" + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "\"%s\" faylına yazıla bilmədi." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "\"%s\" vfs faylı bağlana bilmədi." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "\"%s\" faylı yazma üçün açıla bilmədi." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "\"%s\" faylı bağlana bilmədi." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "\"%s\" faylı oxuma üçün açıla bilmədi." + +#~ msgid "No filename specified." +#~ msgstr "Fayl adı verilməyib." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "Səhv ya da olmayan audio girişi, AVI yayımı pozulacaqdır." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "\"%s\" idarə avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "\"%s\" audio avadanlığı quraşdırıla bilmədi." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "\"%s\" audio avadanlığı %d Hz-ə keçirilə bilmədi." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "\"%s\" audio avadanlığı bağlana bilmədi." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "\"%s\" video avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "\"%s\" video avadanlığı bağlana bilmədi." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "\"%s\" avadanlığına yazıla bilmədi." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "\"%s\" OSS avadanlığı başqa bir proqram tərəfindən istifadədədir." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "\"%s\" avadanlığına yetişə bilmədi, səlahiyyətlərini yoxlayın." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "\"%s\" avadanlığı mövcud deyil." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "\"%s\" avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "\"%s\" avadanlığı oxuma üçün açıla bilmədi." + +#~ msgid "Volume" +#~ msgstr "Səs" + +#~ msgid "Bass" +#~ msgstr "Bas" + +#~ msgid "Treble" +#~ msgstr "İncə" + +#~ msgid "Synth" +#~ msgstr "Sint" + +#~ msgid "PCM" +#~ msgstr "PCM" + +#~ msgid "Speaker" +#~ msgstr "Spiker" + +#~ msgid "Line-in" +#~ msgstr "Xətd-giriş" + +#~ msgid "Microphone" +#~ msgstr "Mikrofon" + +#~ msgid "CD" +#~ msgstr "CD" + +#~ msgid "Mixer" +#~ msgstr "Mikser" + +#~ msgid "PCM-2" +#~ msgstr "PCM-2" + +#~ msgid "Record" +#~ msgstr "Qeyd" + +#~ msgid "In-gain" +#~ msgstr "Giriş-gain" + +#~ msgid "Out-gain" +#~ msgstr "Çıxış-gain" + +#~ msgid "Line-1" +#~ msgstr "Xətd-1" + +#~ msgid "Line-2" +#~ msgstr "Xətd-2" + +#~ msgid "Line-3" +#~ msgstr "Xətd-3" + +#~ msgid "Digital-1" +#~ msgstr "Dijital-1" + +#~ msgid "Digital-2" +#~ msgstr "Dijital-2" + +#~ msgid "Digital-3" +#~ msgstr "Dijital-3" + +#~ msgid "Phone-in" +#~ msgstr "Telefon-girişi" + +#~ msgid "Phone-out" +#~ msgstr "Telefon-çıxışı" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "Radio" +#~ msgstr "Radio" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "Spiker" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "\"%s\" vfs faylı oxuma üçün açıla bilmədi." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Fayl adı verilməyib." + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "\"%s\" vfs faylı yazma üçün açıla bilmədi." + +#, fuzzy +#~ msgid "No filename given" +#~ msgstr "Fayl adı verilməyib." + +#~ msgid "No device specified." +#~ msgstr "Avadanlıq bildirilməyib." + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "\"%s\" avadanlığı oxuma və yazma üçün açıla bilmədi." + +#~ msgid "Device is open." +#~ msgstr "Avadanlıq açıqdır." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "\"%s\" avadanlığı capture avadanlığı deyil." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000000..54912403a3 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,82 @@ +# Bulgarian translation of gst-plugins-ugly. +# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Alexander Shopov , 2007, 2008, 2009, 2010, 2011, 2016. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.7.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2016-02-21 21:03+0200\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not read from CD." +msgstr "CD-то не може да бъде прочетено." + +msgid "Could not open CD device for reading." +msgstr "Не може да се чете от устройството за CD-та." + +msgid "Disc is not an Audio CD." +msgstr "Дискът не е аудио CD." + +msgid "Could not open DVD" +msgstr "DVD-то не може да бъде отворено" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Заглавната част %d от DVD-то не може да бъде отворена" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Не може да се премине към раздел %d от заглавната част %d на DVD-то" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Заглавната част %d от DVD-то не може да бъде отворена. Интерактивни части не " +"се поддържат от този елемент" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD-то не може да бъде прочетено. Причината може да е, че DVD-то е шифрирано " +"и не е инсталирана библиотека за дешифриране." + +msgid "Could not read DVD." +msgstr "DVD-то не може да бъде прочетено." + +msgid "This stream contains no data." +msgstr "Потокът не съдържа данни." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Кодерът за mp3 — LAME не може да бъде настроен. Проверете настройките за " +#~ "кодиране." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Поисканата честота в битове %d kbit/s за свойството „%s“ не е позволена. " +#~ "Тя бе променена на %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Кодерът TwoLAME не може да бъде настроен. Проверете настройките за " +#~ "кодиране." + +#~ msgid "Internal data stream error." +#~ msgstr "Вътрешна грешка в потока от данни." diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000000..1d5b4376ec --- /dev/null +++ b/po/ca.po @@ -0,0 +1,84 @@ +# Catalan translation for gstreamer. +# Copyright © 2004, 2005, 2010 Free Software Foundation, Inc. +# This file is put in the public domain. +# Jordi Mallach , 2004, 2005, 2010. +# Jordi Estrada , 2011. +# Gil Forcada , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.17.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-01-01 14:19+0100\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not read from CD." +msgstr "No s'ha pogut llegir des del CD." + +msgid "Could not open CD device for reading." +msgstr "No s'ha pogut obrir el dispositiu de CD per a lectura." + +msgid "Disc is not an Audio CD." +msgstr "El disc no és un CD d'àudio." + +msgid "Could not open DVD" +msgstr "No s'ha pogut obrir el DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "No s'ha pogut obrir el títol %d del DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "No s'ha pogut anar al capítol %d del títol %d del DVD." + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"No s'ha pogut obrir el títol %d del DVD. Els títols interactius no són " +"compatibles amb aquest element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"No s'ha pogut llegir el DVD. Possiblement el DVD està encriptat i la " +"biblioteca de desencriptació de DVD no està instal·lada." + +msgid "Could not read DVD." +msgstr "No s'ha pogut llegir el DVD." + +msgid "This stream contains no data." +msgstr "Aquest flux no conté dades." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "No s'ha pogut configurar el codificador LAME. Comproveu els paràmetres de " +#~ "codificació." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "La taxa de bits %d kbit/s per a la propietat «%s» no és permesa. S'ha " +#~ "canviat la taxa de bits a %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "No s'ha pogut configurar el codificador TwoLAME. Comproveu els paràmetres " +#~ "de codificació." + +#~ msgid "Internal data stream error." +#~ msgstr "S'ha produït un error intern de flux de dades." diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000000..eecac79ac3 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,84 @@ +# Czech translations of gst-plugins-ugly. +# Copyright (C) 2007, 2008, 2009 the author(s) of gst-plugins-ugly. +# Copyright (C) 2004 Miloslav Trmac . +# This file is put in the public domain. +# +# Miloslav Trmac , 2004. +# Petr Kovar , 2007, 2008, 2009. +# Marek Černocký , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2013-09-07 07:06+0200\n" +"Last-Translator: Marek Černocký \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Gtranslator 2.91.6\n" + +msgid "Could not read from CD." +msgstr "Nezdařilo se čtení z CD." + +msgid "Could not open CD device for reading." +msgstr "Nezdařilo se otevřít zařízení CD pro čtení." + +msgid "Disc is not an Audio CD." +msgstr "Disk není zvukovým CD." + +msgid "Could not open DVD" +msgstr "Nezdařilo se otevřít DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nezdařilo se otevřít titul DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nezdařil se přechod na kapitolu %d titulu DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nezdařilo se otevřít titul DVD %d. Interaktivní tituly nejsou tímto prvkem " +"podporovány" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Nezdařilo se čtení DVD. To může být způsobeno tím, že je DVD šifrováno a " +"knihovna pro dešifrování DVD není nainstalována." + +msgid "Could not read DVD." +msgstr "Nezdařilo se čtení DVD." + +msgid "This stream contains no data." +msgstr "Tento proud neobsahuje žádná data." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Selhalo nastavení zvukového kodéru LAME mp3. Zkontrolujte parametry " +#~ "kódování." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Požadovaný datový tok %d kb/s za sekundu není u vlastnosti „%s“ povolen. " +#~ "Datový tok byl změněn na %d kb/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "Selhalo nastavení kodéru TwoLAME. Zkontrolujte parametry kódování." + +#~ msgid "Internal data stream error." +#~ msgstr "Interní chyba datového proudu." diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000000..40172a3f79 --- /dev/null +++ b/po/da.po @@ -0,0 +1,97 @@ +# Danish translation of gst-plugins-ugly. +# Copyright (C) 2011 gst. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Mogens Jaeger , 2007. +# Joe Hansen , 2008, 2009, 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-09 03:56+0100\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not read from CD." +msgstr "Kunne ikke åbne cd." + +msgid "Could not open CD device for reading." +msgstr "Kunne ikke åbne cd-enhed." + +msgid "Disc is not an Audio CD." +msgstr "Disk er ikke en lyd-cd." + +msgid "Could not open DVD" +msgstr "Kunne ikke åbne dvd" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Kunne ikke åbne dvd-titel %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Kunne ikke gå til kapitel %d i dvd-titel %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Kunne ikke åbne dvd-titel %d. Interaktive titler er ikke understøttet i " +"dette element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Kunne ikke læse dvd. Dette kan være fordi dvd'en er krypteret og et dvd-" +"dekrypteringsbibliotek ikke er installeret." + +msgid "Could not read DVD." +msgstr "Kunne ikke læse dvd." + +msgid "This stream contains no data." +msgstr "Denne strøm indeholder ingen data." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Kunne ikke konfigurere LAME mp3-lydindkoderen. Kontroller dine " +#~ "indkoderparametre." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Den krævede bithastighed %d kbit/s for egenskab %s er ikke tilladt. " +#~ "Bithastigheden blev ændret til %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Kunne ikke konfigurere TwoLAME-indkoderen. Kontroller dine " +#~ "indkoderparametre." + +#~ msgid "Internal data stream error." +#~ msgstr "Intern datastrømfejl." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Ugyldig titelinformation på dvd." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Kunne ikke læse titelinformation på dvd." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Kunne ikke åbne dvd-enhed %s." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Mislykkedes i at indstille PGC-baseret søgning." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Filen er krypteret og kan ikke afspilles." diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000000..4fc0d2104c --- /dev/null +++ b/po/de.po @@ -0,0 +1,101 @@ +# German translations for gst-plugins-ugly 1.3.2 +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# PCM = PCM +# Line-in = Eingang +# Line-out = Ausgang +# Pipeline = Weiterleitung +# Stream = Strom +# Christian Kirbach , 2009, 2011, 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.3.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2014-05-22 18:29+0100\n" +"Last-Translator: Christian Kirbach \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.4\n" + +msgid "Could not read from CD." +msgstr "Von der CD konnte nicht gelesen werden." + +msgid "Could not open CD device for reading." +msgstr "Das CD-Laufwerk konnte nicht zum Lesen geöffnet werden." + +msgid "Disc is not an Audio CD." +msgstr "Das Medium ist keine Audio-CD." + +msgid "Could not open DVD" +msgstr "Die DVD konnte nicht geöffnet werden." + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Der Titel »%d« der DVD konnte nicht geöffnet werden." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Springen zu Kapitel %d des DVD-Titels »%d« schlug fehl" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Der DVD-Titel »%d« konnte nicht geöffnet werden. Interaktive Titel werden " +"von diesem Element nicht unterstützt" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD konnten nicht gelesen werden. Dies könnte daran liegen, dass die DVD " +"verschlüsselt ist und eine Bibliothek zur DVD-Entschlüsselung nicht " +"installiert ist." + +msgid "Could not read DVD." +msgstr "DVD konnten nicht gelesen werden." + +msgid "This stream contains no data." +msgstr "Dieser Strom enthält keine Daten." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Konfigurieren des MP3 Audio-Enkodierers »LAME« schlug fehl. Überprüfen " +#~ "Sie die Parameter zum Enkodieren." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Die angeforderte Bitrate von %d kBit/s ist für die Eigenschaft »%s« nicht " +#~ "erlaubt. Die Bitrate wurde auf %d kBit/s abgeändert." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Konfigurieren des Enkodierers »TwoLAME« schlug fehl. Überprüfen Sie die " +#~ "Parameter zum Enkodieren. " + +#~ msgid "Internal data stream error." +#~ msgstr "Interner Datenstromfehler." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Ungültige Titelinformation auf der DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Die Titelinformationen der DVD konnten nicht gelesen werden." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Öffnen des DVD-Geräts »%s« schlug fehl." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "PGC-basiertes Suchen schlug fehl." diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000000..7bbc820d2b --- /dev/null +++ b/po/el.po @@ -0,0 +1,82 @@ +# Greek translation for gst-plugins-ugly package of GStreamer project. +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 GStreamer core team +# This file is distributed under the same license as the gst-plugins-ugly package. +# Simos Xenitellis , 2009. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.17.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-03-18 01:04+0100\n" +"Last-Translator: Savvas Radevic \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not read from CD." +msgstr "Δέν μπόρεσε να γινει ανάγνωση το CD." + +msgid "Could not open CD device for reading." +msgstr "Δέν ήταν δυνατό το άνοιγμα της συσκευής CD για την ανάγνωση. " + +msgid "Disc is not an Audio CD." +msgstr "Ο δίσκος δεν είναι ένα ακουστικό CD." + +msgid "Could not open DVD" +msgstr "Δεν ήταν δυνατό το άνοιγμα του DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Δεν ήταν δυνατό το άνοιγμα του τίτλου DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Αποτυχία μετάβασης στο κεφάλαιο %d του τίτλου του DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα του τίτλου DVD %d. Οι διαδραστικοί τίτλοι δεν " +"υποστηρίζονται από αυτό το στοιχείο" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Δεν είναι δυνατή η ανάγνωση του DVD. Αυτό μπορεί να οφείλεται στο ότι το DVD " +"είναι κρυπτογραφημένο και μια βιβλιοθήκη αποκρυπτογράφησης DVD δεν έχει " +"εγκατασταθεί." + +msgid "Could not read DVD." +msgstr "Δεν είναι δυνατή η ανάγνωση του DVD." + +msgid "This stream contains no data." +msgstr "Η ροή αυτή δεν περιέχει καθόλου δεδομένα." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Αδυναμία ρύθμισης του κωδικοποιητή LAME. Ελέγξτε τις παραμέτρους " +#~ "κωδικοποίησης." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Ο αιτούμενος ρυθμός μετάδοσης %d kbit/s για την ιδιοκτησία '%s' δεν είναι " +#~ "επιτρεπτός.Ορυθμός μετάδοσης άλλαξε σε %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Αδυναμία ρύθμισης του κωδικοποιητή TwoLAME. Ελέγξτε τις παραμέτρους " +#~ "κωδικοποίησης." + +#~ msgid "Internal data stream error." +#~ msgstr "Εσωτερικό σφάλμα ροής δεδομένων." diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000000..527b2b0db1 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,240 @@ +# English (British) translation. +# Copyright (C) 2004 Free Software Foundation, Inc. +# Gareth Owen , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.8.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2004-04-26 10:41-0400\n" +"Last-Translator: Gareth Owen \n" +"Language-Team: English (British) \n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "Could not write to file \"%s\"." + +msgid "Could not open CD device for reading." +msgstr "Could not open CD device for reading." + +#, fuzzy +msgid "Disc is not an Audio CD." +msgstr "Device is not open." + +msgid "Could not open DVD" +msgstr "" + +#, fuzzy, c-format +msgid "Could not open DVD title %d" +msgstr "Could not close vfs file \"%s\"." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Could not write to file \"%s\"." + +msgid "This stream contains no data." +msgstr "" + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "Could not write to file \"%s\"." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Could not close vfs file \"%s\"." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Could not open file \"%s\" for writing." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Error closing file \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Could not open file \"%s\" for reading." + +#~ msgid "No filename specified." +#~ msgstr "No filename specified." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "No or invalid input audio, AVI stream will be corrupt." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "Could not open audio device \"%s\" for writing." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Could not open control device \"%s\" for writing." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Could not configure audio device \"%s\"." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Could not set audio device \"%s\" to %d Hz." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "Could not close audio device \"%s\"." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "Could not close control device \"%s\"." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Could not open video device \"%s\" for writing." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Could not close video device \"%s\"." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "Could not write to device \"%s\"." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS device \"%s\" is already in use by another program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Could not access device \"%s\", check its permissions." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Device \"%s\" does not exist." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Could not open device \"%s\" for writing." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Could not open device \"%s\" for reading." + +#, fuzzy +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Your oss device could not be probed correctly" + +#~ msgid "Volume" +#~ msgstr "Volume" + +#~ msgid "Bass" +#~ msgstr "Bass" + +#~ msgid "Treble" +#~ msgstr "Treble" + +#~ msgid "Synth" +#~ msgstr "Synth" + +#~ msgid "PCM" +#~ msgstr "PCM" + +#~ msgid "Speaker" +#~ msgstr "Speaker" + +#~ msgid "Line-in" +#~ msgstr "Line-in" + +#~ msgid "Microphone" +#~ msgstr "Microphone" + +#~ msgid "CD" +#~ msgstr "CD" + +#~ msgid "Mixer" +#~ msgstr "Mixer" + +#~ msgid "PCM-2" +#~ msgstr "PCM-2" + +#~ msgid "Record" +#~ msgstr "Record" + +#~ msgid "In-gain" +#~ msgstr "In-gain" + +#~ msgid "Out-gain" +#~ msgstr "Out-gain" + +#~ msgid "Line-1" +#~ msgstr "Line-1" + +#~ msgid "Line-2" +#~ msgstr "Line-2" + +#~ msgid "Line-3" +#~ msgstr "Line-3" + +#~ msgid "Digital-1" +#~ msgstr "Digital-1" + +#~ msgid "Digital-2" +#~ msgstr "Digital-2" + +#~ msgid "Digital-3" +#~ msgstr "Digital-3" + +#~ msgid "Phone-in" +#~ msgstr "Phone-in" + +#~ msgid "Phone-out" +#~ msgstr "Phone-out" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "Radio" +#~ msgstr "Radio" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "Speaker" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Could not open vfs file \"%s\" for reading." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "No filename given" + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Could not open vfs file \"%s\" for writing." + +#~ msgid "No filename given" +#~ msgstr "No filename given" + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "Your oss device could not be probed correctly" + +#~ msgid "No device specified." +#~ msgstr "No device specified." + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "Could not open device \"%s\" for reading and writing." + +#~ msgid "Device is open." +#~ msgstr "Device is open." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "Device \"%s\" is not a capture device." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "Could not get buffers from device \"%s\"." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "Could not get enough buffers from device \"%s\"." diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000000..03a7a5a698 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,80 @@ +# Esperanto translations for gst-plugins-ugly. +# Copyright (C) 2014 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Kristjan SCHMIDT , 2011. +# Benno Schulenberg , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.4.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2014-09-21 21:03+0200\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Lokalize 1.0\n" + +msgid "Could not read from CD." +msgstr "Ne eblis legi de la KD." + +msgid "Could not open CD device for reading." +msgstr "Ne eblis malfermi la KD-aparaton por legi." + +msgid "Disc is not an Audio CD." +msgstr "La disko ne estas son-KD." + +msgid "Could not open DVD" +msgstr "Ne eblis malfermi la DVD-n" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Ne eblis malfermi titolon \"%d\" de la DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Fiaskis iri al ĉapitro %d de la DVD-titolo %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Ne eblis malfermi DVD-titolon \"%d\"; ĉi tiu elemento ne subtenas interagajn " +"titolojn" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Ne eblis legi la DVD-n. Eble la DVD estas ĉifrita sed biblioteko por DVD-" +"malĉifrado ne estas instalita." + +msgid "Could not read DVD." +msgstr "Ne eblis legi la DVD-n." + +msgid "This stream contains no data." +msgstr "Tiu fluo enhavas neniun datumon." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "Fiaskis agordi la LAME-kodilon. Kontrolu viajn kodad-parametrojn." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "La petita bitrapido je %d kbit/s ne estas permesata por la atributo \"%s" +#~ "\". La bitrapido estas ŝanĝite al %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Fiaskis agordi la TwoLAME-kodilon. Kontrolu viajn kodad-parametrojn." + +#~ msgid "Internal data stream error." +#~ msgstr "Interna datum-flu-eraro." diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000000..e8cdc4d874 --- /dev/null +++ b/po/es.po @@ -0,0 +1,98 @@ +# translation of gst-plugins-ugly-0.10.17.2.po to Español +# spanish translation for gst-plugins-ugly +# This file is put in the public domain. +# Jorge González , 2007, 2009, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.17.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2011-10-02 15:45+0200\n" +"Last-Translator: Jorge González González \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Could not read from CD." +msgstr "No se pudo leer del CD." + +msgid "Could not open CD device for reading." +msgstr "No se pudo abrir el dispositivo de CD para su lectura." + +msgid "Disc is not an Audio CD." +msgstr "El disco no es un CD de sonido." + +msgid "Could not open DVD" +msgstr "No se pudo abrir el DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "No se pudo abrir el título %d del DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Falló al ir al capítulo %d del título %d del DVD" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"No se pudo abrir el título %d del DVD. Los títulos interactivos no están " +"soportados por este elemento." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"No se pudo leer el DVD. Puede ser debido a que el DVD está cifrado y la " +"biblioteca de descifrado del DVD no está instalada." + +msgid "Could not read DVD." +msgstr "No se pudo leer el DVD." + +msgid "This stream contains no data." +msgstr "Este medio no contiene datos." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Falló al configurar el codificador LAME. Compruebe sus parámetros de " +#~ "codificación." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "La tasa de bits %d kbps solicitada para la propiedad «%s» no está " +#~ "permitida. La tasa de bits se cambió a %d kbps." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Falló al configurar el codificador TwoLAME. Compruebe sus parámetros de " +#~ "codificación." + +#~ msgid "Internal data stream error." +#~ msgstr "Error del flujo de datos interno." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Información del título del DVD no válida." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "No se pudo leer la información del título para el DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Falló abrir el dispositivo DVD «%s»." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Falló al establecer la búsqueda basada en PGC." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Este archivo está cifrado y no se puede reproducir." diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000000..7a133fcc67 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,99 @@ +# translation of gst-plugins-ugly.master.po to Basque +# Copyright (C) 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Iñaki Larrañaga Murgoitio , 2009. +# Mikel Olasagasti Uranga , 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-0.10.13.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2010-03-07 13:12+0200\n" +"Last-Translator: Mikel Olasagasti Uranga \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not read from CD." +msgstr "Ezin izan da CDtik irakurri." + +msgid "Could not open CD device for reading." +msgstr "Ezin izan da CD gailua ireki irakurtzeko." + +msgid "Disc is not an Audio CD." +msgstr "Ez da Audio CD disko bat." + +msgid "Could not open DVD" +msgstr "Ezin izan da DVDa ireki" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Ezin izan da DVDko %d. titulua ireki" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Huts egin du DVDko %2$d. tituluaren %1$d. kapitulura joatean" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Ezin izan da DVDko %d. titulua ireki. Elementu honek ez ditu onartzen titulu " +"interaktiboak" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Ezin izan da DVDa ireki" + +msgid "This stream contains no data." +msgstr "Korronte honek ez du daturik." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Huts egin du TwoLAME kodetzailea konfiguratzean. Begiratu kodetze-" +#~ "parametroak ondo dauden." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Ez da onartzen '%2$s' propietatearentzat eskatutako %1$d kbit/s-ko bit-" +#~ "emaria. Bit-emaria aldatu egin da, eta orain %3$d kbit/s-koa da." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Huts egin du TwoLAME kodetzailea konfiguratzean. Begiratu kodetze-" +#~ "parametroak ondo dauden." + +#~ msgid "Internal data stream error." +#~ msgstr "Datu-korrontearen barne-errorea." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Huts egin du LAME kodetzailea konfiguratzean. Begiratu kodetze-" +#~ "parametroak ondo dauden." + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "Ezin izan da CDtik irakurri." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Ezin izan da DVDko %d. titulua ireki" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000000..5426e0d5a3 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,102 @@ +# This file is distributed under the same license as the gst-plugins-ugly package. +# Finnish messages for gst-plugins-ugly. +# Copyright (C) 2007 Ilkka Tuohela. +# Copyright (C) 2008-2009 Tommi Vainikainen. +# Suomennos: http://gnome.fi/ +# +# Ilkka Tuohela , 2007. +# Tommi Vainikainen , 2008-2009. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.10.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2009-03-10 20:41+0200\n" +"Last-Translator: Tommi Vainikainen \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.11.2\n" + +msgid "Could not read from CD." +msgstr "Lukeminen CD:ltä ei onnistunut." + +msgid "Could not open CD device for reading." +msgstr "CD-laitetta ei voitu avata luettavaksi." + +msgid "Disc is not an Audio CD." +msgstr "Levy ei ole ääni-CD." + +msgid "Could not open DVD" +msgstr "DVD:tä ei voitu avata" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "DVD:n ohjelmaa %d ei voitu avata" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Ei voitu siirtyä kappaleeseen %d DVD:n ohjelmassa %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"DVD:n ohjelmaa %d ei voitu avata. Tämä elementti ei tue interaktiivisia " +"ohjelmia" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "DVD:tä ei voitu avata" + +msgid "This stream contains no data." +msgstr "Virta ei sisällä tietoa." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "TwoLAME-kodekkia ei voitu määritellä. Tarkista kodekkiasetuksesi." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Pyydetty bittinopeus %d kb/s ominaisuudelle \"%s\" ei ole sallittu. " +#~ "Bittinopeus asetettiin arvoon %d kb/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "TwoLAME-kodekkia ei voitu määritellä. Tarkista kodekkiasetuksesi." + +#~ msgid "Internal data stream error." +#~ msgstr "Sisäinen tietovirtavirhe." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "LAME-kodekkia ei voitu määritellä. Tarkista kodekkiasetuksesi." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "DVD:llä on virheellisiä ohjelmatietoja." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Ohjelmatietoja ei voitu lukea DVD:ltä." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "DVD-laitetta \"%s\" ei voitu avata." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "PGC-pohjaista siirtymistä ei voitu asettaa." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Tiedosto on salattu eikä sitä voi toistaa." diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000000..18dee2b0e8 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,82 @@ +# Translation of gst-plugins-ugly to French +# Copyright (C) 2003-2011 GStreamer core team +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Claude Paroz , 2008-2011. +# Stéphane Aulery , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.7.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2015-12-27 01:51+0100\n" +"Last-Translator: Stéphane Aulery \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not read from CD." +msgstr "Impossible de lire le CD." + +msgid "Could not open CD device for reading." +msgstr "Impossible d’ouvrir le lecteur de CD." + +msgid "Disc is not an Audio CD." +msgstr "Le disque n’est pas un CD audio." + +msgid "Could not open DVD" +msgstr "Impossible d’ouvrir le DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Impossible d’ouvrir le DVD intitulé %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Impossible d’aller au chapitre %d du DVD intitulé %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Impossible d’ouvrir le DVD intitulé %d. Les titres interactifs ne sont pas " +"pris en charge par cet élément" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Impossible de lire le DVD. Il se peut que le DVD soit chiffré et qu’aucune " +"bibliothèque de déchiffrement de DVD de ne soit installée." + +msgid "Could not read DVD." +msgstr "Impossible de lire le DVD." + +msgid "This stream contains no data." +msgstr "Ce flux ne contient aucune données." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "La configuration de l’encodeur audio mp3 LAME a échoué. Vérifiez vos " +#~ "paramètres d’encodage." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Le débit de transfert demandé de %d kbit/s pour la propriété « %s » n’est " +#~ "pas autorisé. Le débit de transfert a été défini à %d kbits/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "La configuration de l’encodeur TwoLAME a échoué. Vérifiez vos paramètres " +#~ "d’encodage." + +#~ msgid "Internal data stream error." +#~ msgstr "Erreur du flux de données interne." diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000000..840995075d --- /dev/null +++ b/po/fur.po @@ -0,0 +1,79 @@ +# Friulian messages for gst-plugins-ugly-1.10.0. +# This file is put in the public domain. +# Fabio Tomat , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.10.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2016-11-30 16:23+0100\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not read from CD." +msgstr "Impussibil lei dal CD." + +msgid "Could not open CD device for reading." +msgstr "Impussibil vierzi il dispositîf CD par lei." + +msgid "Disc is not an Audio CD." +msgstr "Il disc nol è un CD Audio." + +msgid "Could not open DVD" +msgstr "Impussibil vierzi il DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Impussibil vierzi il titul DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "No si è rivâts a lâ al cjapitul %d dal titul DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Impussibil vierzi il titul DVD %d. I titui interatîfs no son supuartâts di " +"chest element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Impussibil lei il DVD. Al podarès jessi par vie che il DVD al è cifrât e une " +"librarie di decifradure no je instalade." + +msgid "Could not read DVD." +msgstr "Impussibil lei il DVD." + +msgid "This stream contains no data." +msgstr "Il flus nol conten dâts." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "No si è rivâts a configurâ il codificadôr audio mp3 LAME. Controle i " +#~ "parametris di codifiche." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Il bitrate domandât (%d kbit/s) pe proprietât '%s' nol è permetût. Il " +#~ "bitrate al è stât cambiât a %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "No si è rivâts a configurâ il codificadôr TwoLAME. Controle i parametris " +#~ "di codifiche." diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000000..a70d68d512 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,84 @@ +# Galician translation of gst-plugins-ugly. +# Copyright (C) 2009 gst-plugins-ugly's COPYRIGHT HOLDER +# This file is distributed under the same license as the gst-plugins-ugly package. +# Fran Diéguez , 2009, 2010. +# Fran Dieguez , 2012. +# Francisco Diéguez , 2012. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-15 03:47+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: Galician \n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +msgid "Could not read from CD." +msgstr "Non foi posíbel ler desde o CD." + +msgid "Could not open CD device for reading." +msgstr "Non foi posíbel abrir o dispositivo de CD para a súa lectura." + +msgid "Disc is not an Audio CD." +msgstr "O disco non é un CD de son." + +msgid "Could not open DVD" +msgstr "Non foi posíbel abrir o DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Non foi posíbel abrir o título %d do DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Produciuse un erro ao ir ao capítulo %d do título %d do DVD" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Non foi posíbel abrir o título %d de DVD. Este elemento non é compatíbel cos " +"títulos interactivos" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Non foi posíbel ler o DVD. Isto pode ser porque o DVD está cifrado e non ten " +"instalada unha biblioteca de descifrado de DVD." + +msgid "Could not read DVD." +msgstr "Non foi posíbel ler o DVD" + +msgid "This stream contains no data." +msgstr "Este fluxo non contén datos." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Produciuse un erro ao configurar o codificador LAME mp3. Comprobe os seus " +#~ "parámetros de codificación." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Non se permite o bitrate solicitado %d kbit/s para a propiedade '%s'. O " +#~ "bitrate cambiouse a %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Produciuse un fallo ao configurar o codificador TwoLAME. Comprobe os seus " +#~ "parámetros de codificación." + +#~ msgid "Internal data stream error." +#~ msgstr "Erro de fluxo de datos interno." diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000000..3ca13002fe --- /dev/null +++ b/po/hr.po @@ -0,0 +1,86 @@ +# Translation of gst-plugins-ugly messages to Croatian. +# This file is put in the public domain. +# Copyright (C) 2004-2010, 2019 GStreamer core team. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Tomislav Krznar , 2012. +# Božidar Putanec , 2016, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-1.15.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2019-02-03 13:14-0800\n" +"Last-Translator: Božidar Putanec \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.2.1\n" + +msgid "Could not read from CD." +msgstr "Nije moguće čitati CD." + +msgid "Could not open CD device for reading." +msgstr "CD uređaj nije moguće otvoriti za čitanje." + +msgid "Disc is not an Audio CD." +msgstr "Disk nije Audio CD." + +msgid "Could not open DVD" +msgstr "DVD nije moguće otvoriti" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nije moguće otvoriti DVD naslov %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nije uspjelo otvoriti poglavlje %d DVD naslova %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nije moguće otvoriti DVD naslov %d. Ovaj element ne podržava interaktivne " +"naslove" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD nije moguće čitati. DVD je možda je šifriran a biblioteka za " +"dešifriranje\n" +"nije instalirana." + +msgid "Could not read DVD." +msgstr "DVD nije moguće čitati." + +msgid "This stream contains no data." +msgstr "Ovaj protok ne sadrži podatke." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Konfiguracija LAME mp3 audiokodera nije uspjela. Provjerite parametre " +#~ "kodiranja." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Tražena brzina (bitrate) %d kbit/s za svojstvo „%s“ nije dopuštena. " +#~ "Brzina (bitrate) je promijenjena u %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Konfiguracija TwoLAME kodera nije uspjela. Provjerite parametre kodiranja." + +#~ msgid "Internal data stream error." +#~ msgstr "Interna greška toka (stream) podataka." diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000000..ed48784d81 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,94 @@ +# Hungarian translation of gst-plugins-ugly +# This file is distributed under the same license as the gst-plugins-ugly package. +# Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. +# +# Gabor Kelemen , 2007, 2008, 2009, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-11-30 15:02+0100\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not read from CD." +msgstr "A CD nem olvasható." + +msgid "Could not open CD device for reading." +msgstr "Nem nyitható meg a CD eszköz olvasásra." + +msgid "Disc is not an Audio CD." +msgstr "A lemez nem hang CD." + +msgid "Could not open DVD" +msgstr "A DVD nem nyitható meg" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nem nyitható meg a(z) %d. DVD cím" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "A(z) $%2d. DVD cím $%1d. fejezetére ugrás meghiúsult" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nem nyitható meg a(z) %d. DVD cím. Ez az elem nem támogatja az interaktív " +"címeket." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Nem olvasható a DVD. Ezt az okozhatja, hogy a DVD titkosított, és a DVD-" +"visszafejtő programkönyvtár nincs telepítve." + +msgid "Could not read DVD." +msgstr "Nem olvasható a DVD." + +msgid "This stream contains no data." +msgstr "Ez az adatfolyam nem tartalmaz adatokat." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "A LAME MP3 hangkódoló beállítása meghiúsult. Ellenőrizze a kódolás " +#~ "beállításait." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "A kért %d kbit/s bitsebesség nem engedélyezett a(z) „%s” tulajdonsághoz. " +#~ "A bitsebesség módosítva %d kbit/s-re." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "A TwoLAME kódoló beállítása meghiúsult. Ellenőrizze a kódolás " +#~ "beállításait." + +#~ msgid "Internal data stream error." +#~ msgstr "Belső adatfolyam-hiba." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "A DVD címinformációi érvénytelenek." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "A DVD címinformációi nem olvashatók." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Nem nyitható meg a DVD eszköz („%s”)." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "A PGC alapú keresés beállítása meghiúsult." diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000000..79e3f50b5d --- /dev/null +++ b/po/id.po @@ -0,0 +1,90 @@ +# Indonesian translations for gst-plugins-ugly package. +# This file is put in the public domain. +# Andhika Padmawan , 2009-2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2013-11-09 15:57+0100\n" +"PO-Revision-Date: 2014-01-27 20:04+0700\n" +"Last-Translator: Andhika Padmawan \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ext/cdio/gstcdiocddasrc.c:199 +msgid "Could not read from CD." +msgstr "Tak dapat membaca dari CD." + +#: ext/cdio/gstcdiocddasrc.c:406 +msgid "Could not open CD device for reading." +msgstr "Tak dapat membuka divais CD untuk dibaca." + +#: ext/cdio/gstcdiocddasrc.c:413 +msgid "Disc is not an Audio CD." +msgstr "Cakram bukan CD Audio." + +#: ext/dvdread/dvdreadsrc.c:228 ext/dvdread/dvdreadsrc.c:235 +msgid "Could not open DVD" +msgstr "Tak dapat membuka DVD" + +#: ext/dvdread/dvdreadsrc.c:242 ext/dvdread/dvdreadsrc.c:618 +#: ext/dvdread/dvdreadsrc.c:625 +#, c-format +msgid "Could not open DVD title %d" +msgstr "Tak dapat membuka judul DVD %d" + +#: ext/dvdread/dvdreadsrc.c:248 +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Gagal pergi ke bab %d dari judul DVD %d" + +#: ext/dvdread/dvdreadsrc.c:632 +#, c-format +msgid "Could not open DVD title %d. Interactive titles are not supported by this element" +msgstr "Tak dapat membuka judul DVD %d. Judul interaktif tidak didukung oleh elemen ini" + +#: ext/dvdread/dvdreadsrc.c:985 +msgid "Could not read DVD. This may be because the DVD is encrypted and a DVD decryption library is not installed." +msgstr "Tak dapat membaca DVD. Hal ini karena DVD terenkripsi dan pustaka dekripsi DVD tidak diinstal." + +#: ext/dvdread/dvdreadsrc.c:988 +msgid "Could not read DVD." +msgstr "Tak dapat membaca DVD." + +#: ext/lame/gstlamemp3enc.c:394 +msgid "Failed to configure LAME mp3 audio encoder. Check your encoding parameters." +msgstr "Gagal mengatur penyandi audio mp3 LAME. Cek parameter penyandian anda." + +#: ext/lame/gstlamemp3enc.c:426 ext/twolame/gsttwolamemp2enc.c:486 +#, c-format +msgid "The requested bitrate %d kbit/s for property '%s' is not allowed. The bitrate was changed to %d kbit/s." +msgstr "Bitrasi %d kbit/s yang diminta untuk properti '%s' tidak diizinkan. Bitrasi diubah ke %d kbit/s." + +#: ext/twolame/gsttwolamemp2enc.c:411 +msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +msgstr "Gagal mengatur penyandi TwoLAME. Cek parameter penyandian anda." + +#: gst/asfdemux/gstasfdemux.c:412 +msgid "This stream contains no data." +msgstr "Arus ini tidak berisi data." + +#: gst/asfdemux/gstasfdemux.c:419 gst/asfdemux/gstasfdemux.c:1971 +msgid "Internal data stream error." +msgstr "Galat arus data internal." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Informasi judul tidak sah pada DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Tak dapat membaca informasi judul untuk DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Gagal membuka divais DVD '%s'." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Gagal mengatur pencarian berbasis PGC." diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000000..2298788d20 --- /dev/null +++ b/po/it.po @@ -0,0 +1,98 @@ +# Italian translation for gst-plugins-ugly package of GStreamer project. +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 GStreamer core team +# This file is distributed under the same license as the gst-plugins-ugly package. +# Luca Ferretti , 2007, 2008, 2009.Luca Ferretti , 2009. +# Sebastiano Pistore ", 2017. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.10.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2017-09-15 09:56+0200\n" +"Last-Translator: Sebastiano Pistore \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 2.0.3\n" + +msgid "Could not read from CD." +msgstr "Impossibile leggere dal CD." + +msgid "Could not open CD device for reading." +msgstr "Impossibile aprire il dispositivo CD in lettura." + +msgid "Disc is not an Audio CD." +msgstr "Il disco non è un CD audio." + +msgid "Could not open DVD" +msgstr "Impossibile aprire il DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Impossibile aprire il titolo %d del DVD" + +# go --> open (più comune in italiano) +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Apertura del capitolo %d del titolo %d del DVD non riuscita" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Impossibile aprire il titolo %d del DVD. I titoli interattivi non sono " +"supportati da questo elemento" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Impossibile leggere il DVD. Questo potrebbe essere dovuto al fatto che il " +"DVD è crittografato ed all'assenza nel sistema di una libreria di decodifica " +"DVD." + +msgid "Could not read DVD." +msgstr "Impossibile leggere il DVD." + +# NEW +msgid "This stream contains no data." +msgstr "Questo flusso non contiene dati." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Configurazione dell'encoder LAME mp3 non riuscita. Verificare i parametri " +#~ "di codifica." + +# NEW +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Il bitrate richiesto di %d kbit/s per la proprietà «%s» non è consentito. " +#~ "Il bitrate è stato cambiato a %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Configurazione dell'encoder TwoLAME non riuscita. Verificare i parametri " +#~ "di codifica." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Informazioni del titolo non valide sul DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Impossibile leggere le informazioni del titolo per il DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Apertura del device DVD «%s» non riuscita." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Impostazione del posizionamento basato su PGC non riuscita." + +#~ msgid "Internal data stream error." +#~ msgstr "Errore interno dello stream di dati." diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000000..7c6d48a130 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,94 @@ +# Japanese translation of gst-plugins-ugly +# Copyright (C) 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Makoto Kato , 2009-2011 +# Takeshi Hamasaki , 2012 +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-22 19:42+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +msgid "Could not read from CD." +msgstr "CDを読むことができません。" + +msgid "Could not open CD device for reading." +msgstr "読み込み用にCDデバイスを開くことができません。" + +msgid "Disc is not an Audio CD." +msgstr "ディスクは音声CDではありません。" + +msgid "Could not open DVD" +msgstr "DVDを開くことができません" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "DVDタイトル %d を開くことができません" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "DVDタイトル %2$d のチャプター %1$d へ移動できません" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"DVDタイトル %d を開くことができません。この要素はインタラクティブタイトルをサ" +"ポートしていません。" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVDを読み込むことができませんでした。DVDが暗号化されているかDVDを解読するライ" +"ブラリがインストールされていないからかもしれません。" + +msgid "Could not read DVD." +msgstr "DVDを読み込むことができません。" + +msgid "This stream contains no data." +msgstr "このストリームはデータを含んでいません。" + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "LAME MP3 音声エンコーダーの構成に失敗しました。エンコーディングパラメータ" +#~ "をチェックしてください。" + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "要求されたビットレート %d kbit/s はプロパティ '%s' では許可されません。そ" +#~ "のためビットレートは %d kbit/s へ変更されました。" + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "TwoLAMEエンコーダーの構成に失敗しました。エンコード用のパラメータをチェッ" +#~ "クしてください。" + +#~ msgid "Internal data stream error." +#~ msgstr "内部データストリームエラー。" + +#~ msgid "Invalid title information on DVD." +#~ msgstr "DVD上のタイトル情報が不正です。" + +#~ msgid "Could not read title information for DVD." +#~ msgstr "DVDからタイトル情報を読み込むことができません。" + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "DVDデバイス '%s' を開くことができません。" + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "プログラム・チェーン (PGC) のシークに失敗しました。" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000000..59263df87b --- /dev/null +++ b/po/lt.po @@ -0,0 +1,103 @@ +# translation of gst-plugins-ugly-0.10.7.2 to Lithuanian +# This file is put in the public domain. +# +# Gintautas Miliauskas , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-0.10.7.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2008-05-14 02:52+0300\n" +"Last-Translator: Gintautas Miliauskas \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "Nepavyko perskaityti DVD įrašo informacijos." + +#, fuzzy +msgid "Could not open CD device for reading." +msgstr "Nepavyko atverti %d DVD įrašo" + +msgid "Disc is not an Audio CD." +msgstr "" + +msgid "Could not open DVD" +msgstr "Nepavyko atverti DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nepavyko atverti %d DVD įrašo" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nepavyko peršokti į %2$d DVD įrašo %1$d dalį" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nepavyko atverti %d DVD įrašo. Šis elementas nepalaiko interaktyvių įrašų" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Nepavyko atverti DVD" + +msgid "This stream contains no data." +msgstr "Šiame sraute nėra duomenų." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Nepavyko sukonfigūruoti LAME kodavimo programos. Patikrinkite kodavimo " +#~ "parametrus." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Pageidautas bitų dažnis %d kbit/s savybei „%s“ neleidžiamas. Bitų dažnis " +#~ "pakeistas į %d kbit/s." + +#, fuzzy +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nepavyko sukonfigūruoti LAME kodavimo programos. Patikrinkite kodavimo " +#~ "parametrus." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nepavyko sukonfigūruoti LAME kodavimo programos. Patikrinkite kodavimo " +#~ "parametrus." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Netaisyklinga DVD įrašo informacija." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Nepavyko perskaityti DVD įrašo informacijos." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Nepavyko atverti DVD įrenginio „%s“." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Nepavyko nustatyti PGC paieškos." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Šis failas užšifruotas ir negali būti parodytas." diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000000..b0bee10eb1 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,95 @@ +# Latvain translation of gst-plugins +# This file is put in the public domain. +# Arvis Lācis , 2009. +# Rihards Prieditis , 2011. +# Rūdolfs Mazurs , 2014. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2014-04-20 16:24+0300\n" +"Last-Translator: Rihards Prieditis \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" +"X-Generator: Lokalize 1.5\n" + +msgid "Could not read from CD." +msgstr "Nevarēja nolasīt no CD." + +msgid "Could not open CD device for reading." +msgstr "Nevarēja atvērt CD ierīci lasīšanai." + +msgid "Disc is not an Audio CD." +msgstr "Disks nav Audio CD." + +msgid "Could not open DVD" +msgstr "Nevarēja atvērt DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nevarēja atvērt DVD nosaukumu %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Neizdevās pāriet uz %d nodaļu DVD nosaukumā %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nevarēja atvērt DVD nosaukumu %d. Šis elements nenodrošina interaktīvos " +"nosaukumus." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Nevarēja nolasīt DVD. Iespējams, ka DVD ir šifrēts un DVD atšifrēšanas " +"bibliotēka nav instalēta." + +msgid "Could not read DVD." +msgstr "Nevarēja nolasīt DVD." + +msgid "This stream contains no data." +msgstr "Šī straume nesatur datus." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Neizdevās konfigurēt LAME mp3 audio kodētāju. Pārbaudiet savus kodēšanas " +#~ "parametrus." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Pieprasītais straumēšanas ātrums %d kbiti/s nepieciešamajai īpašībai “%s” " +#~ "nav atļauts. Straumēšanas ātrums tika mainīts uz %d kbitiem/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Neizdevās konfigurēt TwoLAME kodētāju. Pārbaudiet savus kodēšanas " +#~ "parametrus." + +#~ msgid "Internal data stream error." +#~ msgstr "Iekšēja datu plūsmas kļūda." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Nederīga DVD virsraksta informācija." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Nevarēja nolasīt virsrakstu informāciju no DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Neizdevās atvērt DVD ierīci \"%s\"." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Neizdevās uzstādīt PCG balstīto meklēšanu." diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000000..2657c017cc --- /dev/null +++ b/po/meson.build @@ -0,0 +1,3 @@ +i18n = import('i18n') + +i18n.gettext('gst-plugins-ugly-1.0', preset: 'glib') diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000000..df644d858d --- /dev/null +++ b/po/ms.po @@ -0,0 +1,94 @@ +# translation of gst-plugins-ugly-0.10.11.2.po to Malay +# This file is put in the public domain. +# +# Muhammad Najmi bin Ahmad Zabidi , 2009. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-0.10.11.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2009-07-16 15:07+0800\n" +"Last-Translator: Muhammad Najmi bin Ahmad Zabidi \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +msgid "Could not read from CD." +msgstr "Tidak dapat baca dari CD." + +msgid "Could not open CD device for reading." +msgstr "Tidak dapat buka peranti CD untuk baca." + +msgid "Disc is not an Audio CD." +msgstr "Cakera bukan CD Audio" + +msgid "Could not open DVD" +msgstr "Tidak dapat buka DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Tidak dapat buka tajuk %d DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Gagal untuk ke bab %d pata tajuk DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Gagal buka tajuk %d DVD. Tajuk interaktrif tidak disokong oleh elemen ini" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Tidak dapat buka DVD" + +msgid "This stream contains no data." +msgstr "Aliran ini tiada data." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Gagal mengkonfigur pengenkod TwoLAME. Periksa parameter pengenkod anda." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Kadarbit %d yang diminta untuk properti '%s' tidak dibenarkan. Kadarbit " +#~ "telah ditukar ke %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Gagal mengkonfigur pengenkod TwoLAME. Periksa parameter pengenkod anda." + +#~ msgid "Internal data stream error." +#~ msgstr "Ralat aliran data dalaman." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "Gagal mengkonfigur pengekod LAME. Periksa parameter pengenkod anda." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Maklumat tajuk pada DVD tidak sah." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Tidak dapat baca maklumat tajuk pada DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Gagal membuka peranti DVD %s'." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Gagal untuk menetapkan carian berasaskan PGC." diff --git a/po/mt.po b/po/mt.po new file mode 100644 index 0000000000..e782f136ba --- /dev/null +++ b/po/mt.po @@ -0,0 +1,99 @@ +# Maltese translation for gst-plugins-ugly. +# This file is distributed under the same license as the gst-plugins-ugly package. +# NAME OF AUTHOR , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-0.10.9.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2008-11-13 18:18+0100\n" +"Last-Translator: Michel Bugeja \n" +"Language-Team: Maltese \n" +"Language: mt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Maltese\n" +"X-Poedit-Country: Malta\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not read from CD." +msgstr "Ma nistax naqra mis-CD." + +msgid "Could not open CD device for reading." +msgstr "Ma nistax niftaħ is-CD biex naqra." + +msgid "Disc is not an Audio CD." +msgstr "Id-diska mijhiex CD tal-awdjo." + +msgid "Could not open DVD" +msgstr "Ma nistax niftaħ DVD." + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Ma nistax niftaħ titlu %d tad-DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Problema biex immur kapitlu %d mit-titlu %d tad-DVD" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Ma nistax niftaħ titlu %d tad-DVD. Titli nterattivi mhux issapportjati minn " +"dan l-element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Ma nistax niftaħ DVD." + +msgid "This stream contains no data." +msgstr "L-istream ma fiha l-ebda data." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Problema biex nissetja LAME encoder. Iċċekkja l-parametri tal-encoding." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Mhux permess il-bitrate %d kbit/s rikjesta għal '%s'. Għalhekk il-bitrate " +#~ "ġiet mibdula għal %d kbit/s." + +#, fuzzy +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Problema biex nissetja LAME encoder. Iċċekkja l-parametri tal-encoding." + +#~ msgid "Internal data stream error." +#~ msgstr "Problema interna fid-data stream." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Problema biex nissetja LAME encoder. Iċċekkja l-parametri tal-encoding." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "L-informazzjoni tat-titlu tad-DVD mhux validu." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Ma nistax naqra l-informazzjoni tat-titlu tad-DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Problema biex niftaħ l-apparat tad-DVD '%s'." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Problema biex nissettja tfittxija bbażata fuq PGC." diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000000..8f41f95dcf --- /dev/null +++ b/po/nb.po @@ -0,0 +1,91 @@ +# Norwegian bokmaal translation of gst-plugins-ugly. +# This file is put in the public domain. +# +# Kjartan Maraas , 2004-2007. +# Johnny A. Solbu , 2012 +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-21 21:38+0100\n" +"Last-Translator: Johnny A. Solbu \n" +"Language-Team: Norwegian Bokmaal \n" +"Language: nb_NO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +msgid "Could not read from CD." +msgstr "Kunne ikke lese fra CD." + +msgid "Could not open CD device for reading." +msgstr "Kunne ikke åpne CD-enheten for lesing." + +msgid "Disc is not an Audio CD." +msgstr "Disken er ikke en lyd-CD." + +msgid "Could not open DVD" +msgstr "Kunne ikke åpne DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Kunne ikke åpne DVD-tittel %d." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Klarte ikke å gå til kapittel %d på DVD tittel %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Kunne ikke åpne DVD-tittel %d. Interaktive titler er ikke støttet av dette " +"elementet" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Kunne ikke lese DVD-en. Dette kan være fordi DVD-en er kryptert DVD-" +"dekrypteringsbiblioteket ikke er installert." + +msgid "Could not read DVD." +msgstr "Kunne ikke lese DVD" + +msgid "This stream contains no data." +msgstr "Denne strømmen inneholde ikke data." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "Kunne ikke konfigurere LAME-koder. Sjekk parametere for kodingen." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Forespurt bitrate %d kbit/s for egenskap «%s» er ikke tillatt. Bitraten " +#~ "ble endret til %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Kunne ikke konfigurere TwoLAME-enkoder. Sjekk parameterene for kodingen." + +#~ msgid "Internal data stream error." +#~ msgstr "Intern feil i datastrøm." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Denne filen er kryptert og kan ikke spilles av." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Ugyldig tittelinformasjon på DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Kunne ikke åpne DVD-enhet «%s»." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Kunne ikke sette PGC-basert søking." diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000000..7a69672be0 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,95 @@ +# translation of gst-plugins-ugly-1.10.0.nl.po to Dutch +# Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc. +# +# This file is distributed under the same license as the gst-plugins-ugly package. +# Freek de Kruijf , 2007, 2008, 2009, 2011, 2012, 2014, 2017. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.10.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2017-10-24 23:30+0100\n" +"Last-Translator: Freek de Kruijf \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not read from CD." +msgstr "Kan niet van de cd lezen." + +msgid "Could not open CD device for reading." +msgstr "Kan het CD-apparaat niet openen voor lezen." + +msgid "Disc is not an Audio CD." +msgstr "De schrijf is geen audio-CD" + +msgid "Could not open DVD" +msgstr "Kan DVD niet openen" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Kan DVD-titel %d niet openen" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Kan niet naar hoofdstuk %d van DVD-titel %d gaan" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Kan de DVD-titel %d niet openen. Interactieve titels worden door dit element " +"niet ondersteund" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Kon dvd niet lezen. Dit kan veroorzaakt zijn omdat de dvd versleuteld is en " +"een bibliotheek voor ontcijferen van een dvd niet is geïnstalleerd." + +msgid "Could not read DVD." +msgstr "Kon dvd niet lezen" + +msgid "This stream contains no data." +msgstr "Deze stroom bevat geen gegevens." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Instellen van de LAME mp3-encoder is mislukt. Controleer uw parameters " +#~ "voor codering." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "De gevraagde bitsnelheid %d kbits/s voor eigenschap '%s' is niet " +#~ "toegestaan. De bitsnelheid is gewijzigd in %d kbits/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Kan de TwoLAME-encoder niet configureren. Controleer uw " +#~ "encodingparameters." + +#~ msgid "Internal data stream error." +#~ msgstr "Fout met interne gegevensstroom." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Ongeldige titelinformatie op de DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Kan de titelinformatie van de DVD niet lezen." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Kan het DVD-apparaat '%s' niet openen." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Kan op PGC gebaseerd zoeken niet instellen." diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000000..ec93527e95 --- /dev/null +++ b/po/or.po @@ -0,0 +1,255 @@ +# Oriya translation of gst-plugins-0.8.3.pot. +# Copyright (C) 2004, Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-0.8.3 package. +# Gora Mohanty , 2004. +# $Id$ +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-0.8.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2004-09-27 13:32+0530\n" +"Last-Translator: Gora Mohanty \n" +"Language-Team: Oriya \n" +"Language: or\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ." + +msgid "Could not open CD device for reading." +msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Disc is not an Audio CD." +msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇ ନାହିଁ." + +msgid "Could not open DVD" +msgstr "" + +#, fuzzy, c-format +msgid "Could not open DVD title %d" +msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ." + +msgid "This stream contains no data." +msgstr "" + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "\"%s\" ଫାଇଲ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "\"%s\" ଫାଇଲ ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "No filename specified." +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଉଲ୍ଲେଖିତ ହୋଇ ନାହିଁ." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "ନିବେଶ ଧ୍ବନି ନାହିଁ ବା ଅବୈଧ ଅଛି. ଏ.ଭି.ଆଇ. ଧାରା ଭ୍ରଷ୍ଟ ହୋଇଯିବ." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ରକୁ %d ହର୍ଜରେ ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରେ ଲେଖିହେଲା ନାହିଁ." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "\"%s\" ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ର ପୂର୍ବରୁ ଅନ୍ଯ କାରିକା ଦ୍ବାରା ବ୍ଯବହାର କରାଯାଉଛି." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ବ୍ଯବହାର କରିହେଲା ନାହିଁ, ତାହାର ଅନୁମତି ଦେଖନ୍ତୁ." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଅବସ୍ଥିତ ନାହିଁ." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." + +#~ msgid "Volume" +#~ msgstr "ପ୍ରବଳତା" + +#~ msgid "Bass" +#~ msgstr "ଅନୁଚ୍ଚ ସ୍ବର" + +#~ msgid "Treble" +#~ msgstr "ଉଚ୍ଚ ସ୍ବର" + +#~ msgid "Synth" +#~ msgstr "ସିନ୍ଥେସାଇଜର" + +#~ msgid "PCM" +#~ msgstr "ପି.ସି.ଏମ." + +#~ msgid "Speaker" +#~ msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" + +#~ msgid "Line-in" +#~ msgstr "ଲାଇନ-ଇନ" + +#~ msgid "Microphone" +#~ msgstr "ମାଇକ୍ରୋଫୋନ୍" + +#~ msgid "CD" +#~ msgstr "ସି.ଡି." + +#~ msgid "Mixer" +#~ msgstr "ମିଶ୍ରଣ ଯନ୍ତ୍ର" + +#~ msgid "PCM-2" +#~ msgstr "ପି.ସି.ଏମ.-୨" + +#~ msgid "Record" +#~ msgstr "ଅନୁଲିପିକରଣ" + +#~ msgid "In-gain" +#~ msgstr "ନିବେଶ-ବୃଦ୍ଧି" + +#~ msgid "Out-gain" +#~ msgstr "ନିର୍ଗମ-ବୃଦ୍ଧି" + +#~ msgid "Line-1" +#~ msgstr "ଲାଇନ-୧" + +#~ msgid "Line-2" +#~ msgstr "ଲାଇନ-୨" + +#~ msgid "Line-3" +#~ msgstr "ଲାଇନ-୩" + +#~ msgid "Digital-1" +#~ msgstr "ସାଂଖ୍ଯିକ-୧" + +#~ msgid "Digital-2" +#~ msgstr "ସାଂଖ୍ଯିକ-୨" + +#~ msgid "Digital-3" +#~ msgstr "ସାଂଖ୍ଯିକ-୩" + +#~ msgid "Phone-in" +#~ msgstr "ଫୋନ-ନିବେଶ" + +#~ msgid "Phone-out" +#~ msgstr "ଫୋନ-ନିର୍ଗମ" + +#~ msgid "Video" +#~ msgstr "ଭିଡିଓ" + +#~ msgid "Radio" +#~ msgstr "ରେଡିଓ" + +#~ msgid "Monitor" +#~ msgstr "ପ୍ରଦର୍ଶିକା" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ: %s." + +#~ msgid "No filename given" +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." + +#~ msgid "No device specified." +#~ msgstr "କୌଣସି ଯନ୍ତ୍ର ଉଲ୍ଲେଖିତ କରାଯାଇ ନାହିଁ." + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ଓ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Device is open." +#~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇଚ୍ଛି." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "%s ଉପାଦାନ ମିଳିଲା ନାହିଁ. ପୁନଃପ୍ରଦର୍ଶନ ପାଇଁ ଏହି ଉପାଦାନଟି ଆବଶ୍ଯକ. ଦୟା କରି ସଠିକ ପ୍ଲଗ୍ଇନ୍ " +#~ "ସ୍ଥାପିତ କରନ୍ତୁ, ଓ 'gst-inspect %s' ଚଳାଇ ଯାଞ୍ଚ କରନ୍ତୁ କି ଏହା କାର୍ଯ୍ଯକାରୀ ଅଛି" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "କୌଣସି ବ୍ଯବହାରଯୋଗ୍ଯ ରଙ୍ଗକ୍ଷେତ୍ର ଉପାଦାନ ମିଳିଲା ନାହିଁ.\n" +#~ "ଦୟା କରି ଗୋଟିଏ ଉପାଦାନ ସ୍ଥାପିତ କରି ପୁନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ." diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000000..5748aa5d6a --- /dev/null +++ b/po/pl.po @@ -0,0 +1,79 @@ +# Polish translation for gst-plugins-ugly. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Jakub Bogusz , 2007-2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-11-28 19:34+0100\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not read from CD." +msgstr "Odczyt z CD nie powiódł się." + +msgid "Could not open CD device for reading." +msgstr "Nie udało się otworzyć urządzenia CD do odczytu." + +msgid "Disc is not an Audio CD." +msgstr "Płyta nie jest płytą CD Audio." + +msgid "Could not open DVD" +msgstr "Nie udało się otworzyć DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nie udało się otworzyć tytułu DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nie udało się przemieścić do rozdziału %d tytułu DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nie udało się otworzyć tytułu DVD %d. Interaktywne tytułu nie są obsługiwane " +"przez ten element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Nie udało się odczytać DVD. Powodem może być to, że płyta jest zaszyfrowana, " +"a biblioteka odszyfrowująca nie została zainstalowana." + +msgid "Could not read DVD." +msgstr "Nie udało się odczytać DVD." + +msgid "This stream contains no data." +msgstr "Ten strumień nie zawiera danych." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Nie udało się skonfigurować kodera dźwięku mp3 LAME. Proszę sprawdzić " +#~ "parametry kodowania." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Żądana prędkość bitowa %d kbit/s dla właściwości '%s' nie jest dozwolona. " +#~ "Prędkość bitowa zmieniona na %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nie udało się skonfigurować kodera TwoLAME. Proszę sprawdzić parametry " +#~ "kodowania." + +#~ msgid "Internal data stream error." +#~ msgstr "Błąd wewnętrzny strumienia danych." diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000000..586f64286f --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,98 @@ +# Brazilian Portuguese translation of gst-plugins-ugly. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Copyright (C) 2007-2013 Free Software Foundation, Inc. +# Raphael Higino , 2007. +# Fabrício Godoy , 2008-2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-1.7.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2015-12-28 19:54-0200\n" +"Last-Translator: Fabrício Godoy \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Could not read from CD." +msgstr "Não foi possível ler as informações do CD." + +msgid "Could not open CD device for reading." +msgstr "Não foi possível abrir o dispositivo de CD para leitura." + +msgid "Disc is not an Audio CD." +msgstr "O disco não é um CD de áudio." + +msgid "Could not open DVD" +msgstr "Não foi possível abrir o DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Não foi possível abrir o título %d do DVD" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Falha ao avançar para o capítulo %d do título %d do DVD" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Não foi possível abrir o título %d do DVD. Não há suporte a títulos " +"interativos por este elemento" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Não foi possível ler o DVD. O motivo pode ser que o DVD está criptografado e " +"uma biblioteca de descriptografia de DVD não está instalada." + +msgid "Could not read DVD." +msgstr "Não foi possível ler o DVD." + +msgid "This stream contains no data." +msgstr "Este fluxo não contém dados." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Falha ao configurar o codificador de áudio MP3 LAME. Verifique seus " +#~ "parâmetros de codificação." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "A taxa de bits, %d kbits/s, requisitada pela propriedade \"%s\" não é " +#~ "permitida. A taxa de bits foi alterada para %d kbits/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Falha ao configurar o codificador TwoLAME. Verifique seus parâmetros de " +#~ "codificação." + +#~ msgid "Internal data stream error." +#~ msgstr "Erro interno no fluxo de dados." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "As informações de título no DVD são inválidas." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Não foi possível ler as informações de título do DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Falha ao abrir o dispositivo de DVD \"%s\"." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Falha ao definir busca baseada em PGC." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Este arquivo está criptografado e não pôde ser reproduzido." diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000000..34b9ec0133 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,85 @@ +# Romanian translation for gst-plugins-ugly +# This file is distributed under the same license as the gst-plugins-ugly package. +# Lucian Adrian Grijincu , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.14.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2010-08-16 03:32+0300\n" +"Last-Translator: Lucian Adrian Grijincu \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);;\n" +"X-Generator: Virtaal 0.6.1\n" + +msgid "Could not read from CD." +msgstr "Nu s-a putut citi de pe CD." + +msgid "Could not open CD device for reading." +msgstr "Nu s-a putut deschide dispozitivul CD pentru citire." + +msgid "Disc is not an Audio CD." +msgstr "Discul nu este un CD audio." + +msgid "Could not open DVD" +msgstr "Nu s-a putut deschide DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nu s-a putut deschide titlul DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nu s-a putut sări la capitolul %d al titlului DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nu s-a putut deschide titlul DVD %d. Titlurile interactive nu sunt suportate " +"de acest element" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "Nu s-a putut deschide DVD" + +msgid "This stream contains no data." +msgstr "Fluxul acesta nu conține date." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Nu s-a putut configura codorul TwoLAME. Verificați parametrii de codare." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Rata de biți solicitată de %d kbiți/s pentru proprietatea „%s” nu este " +#~ "permisă. Rata de biți a fost modificată la %d kbiți/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nu s-a putut configura codorul TwoLAME. Verificați parametrii de codare." + +#~ msgid "Internal data stream error." +#~ msgstr "Eroare internă a fluxului de date." + +#, fuzzy +#~ msgid "" +#~ "Failed to configure LAMEMP3ENC encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nu s-a putut configura codorul LAME. Verificați parametrii de codare." diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000000..3655689dc0 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,98 @@ +# Translation for gst-plugins-ugly messages to Russian +# This file is put in the public domain. +# +# Артём Попов , 2009. +# Pavel Maryanov , 2009. +# Yuri Kozlov , 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-01 13:38+0400\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Could not read from CD." +msgstr "Не удалось прочесть CD." + +msgid "Could not open CD device for reading." +msgstr "Не удалось открыть CD-устройство для чтения." + +msgid "Disc is not an Audio CD." +msgstr "Диск не в формате аудио-CD." + +msgid "Could not open DVD" +msgstr "Не удалось открыть DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Не удалось открыть DVD-раздел %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Ошибка перехода к эпизоду %d DVD-раздела %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Не удалось открыть DVD-раздел %d. Интерактивные разделы не поддерживаются " +"этим элементом" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Не удалось прочесть DVD. Это могло произойти из-за того, что DVD закодирован " +"и не установлена библиотека декодирования DVD." + +msgid "Could not read DVD." +msgstr "Не удалось прочесть DVD." + +msgid "This stream contains no data." +msgstr "Поток не содержит данных." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Не удалось настроить аудио-кодировщик mp3 LAME. Проверьте параметры " +#~ "кодирования." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Запрошенный битрейт в %d кбит/с для свойства «%s» недопустим. Битрейт был " +#~ "изменён на %d кбит/с." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Не удалось настроить кодировщик TwoLAME. Проверьте параметры кодирования." + +#~ msgid "Internal data stream error." +#~ msgstr "Внутренняя ошибка потока данных." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Неверные сведения о разделах на DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Не удалось прочесть сведения о разделах для DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Ошибка при открытии DVD-устройства «%s»." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Не удалось включить PGC-позиционирование." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Файл зашифрован и не может быть воспроизведён." diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000000..77a169903a --- /dev/null +++ b/po/sk.po @@ -0,0 +1,289 @@ +# Czech translations of gst-plugins. +# Copyright (C) 2004 gst-plugins' COPYRIGHT HOLDER +# This file is put in the public domain. +# Peter Tuhársky , 2007, 2009, 2010, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2014-01-30 10:28+0100\n" +"Last-Translator: Peter Tuharsky \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Poedit-Language: Slovak\n" +"X-Poedit-Country: SLOVAKIA\n" + +msgid "Could not read from CD." +msgstr "Nepodarilo sa čítať z CD." + +msgid "Could not open CD device for reading." +msgstr "Nepodarilo sa otvoriť zariadenie CD na čítanie." + +msgid "Disc is not an Audio CD." +msgstr "Tento disk nie je zvukové CD." + +msgid "Could not open DVD" +msgstr "Nepodarilo sa otvoriť DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Nepodarilo sa otvoriť DVD titul %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Nepodarilo sa preskočiť na kapitolu %d pre DVD titul %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Nepodarilo sa otvoriť DVD titul %d. Interaktívne tituly nie sú podporované " +"týmto prvkom" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Nepodarilo sa čítať DVD. Možno je DVD šifrované a nie je nainštalovaná " +"dešifrovacia knižnica." + +msgid "Could not read DVD." +msgstr "Nepodarilo sa čítať DVD." + +msgid "This stream contains no data." +msgstr "Tento prúd neobsahuje žiadne údaje." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Nepodarilo sa nastaviť LAME mp3 enkodér. Skontrolujte svoje kódovacie " +#~ "nastavenia, prosím." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Požadovaná bitová rýchlosť %d kbit/s pre vlastnosť '%s' nie je dovolená. " +#~ "Bitová rýchlosť bola nastavená na %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Nepodarilo sa nastaviť TwoLAME enkodér. Skontrolujte svoje kódovacie " +#~ "nastavenia, prosím." + +#~ msgid "Internal data stream error." +#~ msgstr "Vnútorná chyba prúdu údajov." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "Chybný titul na DVD." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "Nepodarilo sa načítať informáciu o titule DVD." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "Nepodarilo sa otvoriť DVD zariadenie '%s'." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "Nepodarilo sa nastaviť preskočenie na báze PGC. " + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Tento súbor je šifrovaný a nedá sa prehrať." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Nemohu otevřít soubor \"%s\" pro zápis." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Chyba při zavírání souboru \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Nemohu otevřít soubor \"%s\" pro čtení." + +#~ msgid "No filename specified." +#~ msgstr "Nezadán název souboru." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "Žádný nebo neplatný vstup zvuku, proud AVI bude poškozen." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "Nemohu otevřít zařízení zvuku \"%s\" pro zápis." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Nemohu otevřít řídicí zařízení \"%s\" pro zápis." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Nemohu nastavit zařízení zvuku \"%s\"." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Nemohu nastavit zařízení zvuku \"%s\" na %d Hz." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "Nemohu zavřít zařízení zvuku \"%s\"." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "Nemohu zavřít řídicí zařízení \"%s\"." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Nemohu otevřít zařízení videa \"%s\" pro zápis." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Nemohu zavřít zařízení videa \"%s\"." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "Nemohu zapisovat do zařízení \"%s\"." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "Zařízení OSS \"%s\" již používá jiný program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Nemohu přistupovat k zařízení \"%s\", zkontrolujte jeho oprávnění." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Zařízení \"%s\" neexistuje." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Nemohu otevřít zažízení \"%s\" pro zápis." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Nemohu otevřít zažízení \"%s\" pro čtení." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Vaše zařízení OSS nebylo možné správně najít" + +#~ msgid "Volume" +#~ msgstr "Hlasitost" + +#~ msgid "Bass" +#~ msgstr "Basy" + +#~ msgid "Treble" +#~ msgstr "Výšky" + +#~ msgid "Synth" +#~ msgstr "Synth" + +#~ msgid "PCM" +#~ msgstr "PCM" + +#~ msgid "Speaker" +#~ msgstr "Reproduktor" + +#~ msgid "Line-in" +#~ msgstr "Line-in" + +#~ msgid "Microphone" +#~ msgstr "Mikrofon" + +#~ msgid "CD" +#~ msgstr "CD" + +#~ msgid "Mixer" +#~ msgstr "Mixér" + +#~ msgid "PCM-2" +#~ msgstr "PCM-2" + +#~ msgid "Record" +#~ msgstr "Nahrávání" + +#~ msgid "In-gain" +#~ msgstr "Vstupní-zisk" + +#~ msgid "Out-gain" +#~ msgstr "Výstupní-zisk" + +#~ msgid "Line-1" +#~ msgstr "Line-1" + +#~ msgid "Line-2" +#~ msgstr "Line-2" + +#~ msgid "Line-3" +#~ msgstr "Line-3" + +#~ msgid "Digital-1" +#~ msgstr "Digitální-1" + +#~ msgid "Digital-2" +#~ msgstr "Digitální-2" + +#~ msgid "Digital-3" +#~ msgstr "Digitální-3" + +#~ msgid "Phone-in" +#~ msgstr "Telefon-in" + +#~ msgid "Phone-out" +#~ msgstr "Telefon-out" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "Radio" +#~ msgstr "Rádio" + +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "Reproduktor" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Nemohu otevřít soubor vfs \"%s\" pro čtení." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Nezadán název souboru" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Nemohu otevřít soubor vfs \"%s\" pro zápis: %s." + +#~ msgid "No filename given" +#~ msgstr "Nezadán název souboru" + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "Vaše zařízení OSS nebylo možné správně najít" + +#~ msgid "No device specified." +#~ msgstr "Nezadáno zařízení." + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "Nemohu otevřít zařízení \"%s\" pro čtení a zápis." + +#~ msgid "Device is open." +#~ msgstr "Zařízení je otevřeno." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "Zařízení \"%s\" není zachytávací zařízení." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "Nemohu od zařízení \"%s\" získat vyrovnávací paměti." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "Nemohu od zařízení \"%s\" získat dost vyrovnávacích pamětí." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "Element %s nelze najít. Tento element je pro přehrávání nutný. " +#~ "Nainstalujte prosím potřebný modul a ověřte, že funguje, spuštěním 'gst-" +#~ "inspect %s'" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "Nenalezen použitelný element colorspace.\n" +#~ "Nainstalujte prosím nějaký a restartujte." diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000000..32f4366536 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,84 @@ +# Slovenian translation for gst-plugins-ugly. +# Copyright (C) 2009 - 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Matej Urbančič , 2009. +# Klemen Košir , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 0.10.17.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-03-26 22:48+0100\n" +"Last-Translator: Klemen Košir \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" + +msgid "Could not read from CD." +msgstr "S CD-ja ni mogoče brati." + +msgid "Could not open CD device for reading." +msgstr "Naprave CD ni mogoče odpreti za branje." + +msgid "Disc is not an Audio CD." +msgstr "Disk ni zvočni CD." + +msgid "Could not open DVD" +msgstr "DVD-ja ni mogoče odpreti" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "DVD naslova %d ni mogoče odpreti." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Napaka med odpiranjem poglavja %d DVD naslova %d." + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "DVD naslova %d ni mogoče odpreti. Interaktivni naslovi niso podprti." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD-ja ni mogoče prebrati. Verjetno je DVD šifriran, knjižnica za " +"dešifriranje pa ni nameščena." + +msgid "Could not read DVD." +msgstr "DVD-ja ni mogoče prebrati." + +msgid "This stream contains no data." +msgstr "Pretok ne vsebuje podatkov." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Napaka med nastavljanjem zvočnega kodirnika mp3 LAME. Preverite parametre " +#~ "kodiranja." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Zahtevana bitna hitrost %d kbit/s za lastnost \"%s\" ni dovoljena. Bitna " +#~ "hitrost je bila spremenjena na %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Napaka med nastavljanjem kodirnika TwoLAME. Preverite parametre kodiranja." + +#~ msgid "Internal data stream error." +#~ msgstr "Notranja napaka pretoka podatkov." + +#~ msgid "Failed to configure LAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Napaka med nastavljanjem kodirnika LAME. Preverite parametre kodiranja." diff --git a/po/sq.po b/po/sq.po new file mode 100644 index 0000000000..2cecc8b8c0 --- /dev/null +++ b/po/sq.po @@ -0,0 +1,256 @@ +# Përkthimi i mesazheve të gst-plugins në shqip. +# Copyright (C) 2004 Free Software Foundation, Inc. +# Laurent Dhima , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.8.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2004-08-07 20:29+0200\n" +"Last-Translator: Laurent Dhima \n" +"Language-Team: Albanian \n" +"Language: sq\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#, fuzzy +msgid "Could not read from CD." +msgstr "I pamundur shkrimi tek file \"%s\"." + +msgid "Could not open CD device for reading." +msgstr "I pamundur hapja e dispozitivit CD për lexim." + +#, fuzzy +msgid "Disc is not an Audio CD." +msgstr "Dispozitivi nuk është hapur." + +msgid "Could not open DVD" +msgstr "" + +#, fuzzy, c-format +msgid "Could not open DVD title %d" +msgstr "E pamundur mbyllja e file vfs \"%s\"." + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#, fuzzy +msgid "Could not read DVD." +msgstr "I pamundur shkrimi tek file \"%s\"." + +msgid "This stream contains no data." +msgstr "" + +#, fuzzy +#~ msgid "Could not read title information for DVD." +#~ msgstr "I pamundur shkrimi tek file \"%s\"." + +#, fuzzy +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "E pamundur mbyllja e file vfs \"%s\"." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "E pamundur hapja e file \"%s\" në shkrim." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Gabim gjatë mbylljes së file \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "E pamundur hapja e file \"%s\" për lexim." + +#~ msgid "No filename specified." +#~ msgstr "Nuk është përcaktuar emri i file." + +#~ msgid "No or invalid input audio, AVI stream will be corrupt." +#~ msgstr "Input audio i gabuar ose mungon, stream AVI mund të jetë i dëmtuar." + +#~ msgid "Could not open audio device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit të kontrollit \"%s\" për shkrim." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "I pamundur konfigurimi i dispozitivit të zërit \"%s\"." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "I pamundur rregullimi i dispozitivit audio \"%s\" në %d Hz." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"." + +#~ msgid "Could not close control device \"%s\"." +#~ msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit video \"%s\" për shkrim." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "E pamundur mbyllja e dispozitivit video \"%s\"." + +#~ msgid "Could not write to device \"%s\"." +#~ msgstr "I pamundur shkrimi në dispozitivin \"%s\"." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "" +#~ "Dispozitivi OSS \"%s\" është duke u përdorur nga një tjetër program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "" +#~ "E pamundur futja në dispozitivin \"%s\", kontrollo të drejtat e tij." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Dispozitivi \"%s\" nuk ekziston." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për shkrim." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" + +#~ msgid "Volume" +#~ msgstr "Volumi" + +#~ msgid "Bass" +#~ msgstr "Bas" + +#~ msgid "Treble" +#~ msgstr "Treble" + +#~ msgid "Synth" +#~ msgstr "Sintetizuesi" + +#~ msgid "PCM" +#~ msgstr "PCM" + +#~ msgid "Speaker" +#~ msgstr "Zë folës" + +#~ msgid "Line-in" +#~ msgstr "Linja-hyrje" + +#~ msgid "Microphone" +#~ msgstr "Mikrofoni" + +#~ msgid "CD" +#~ msgstr "CD" + +#~ msgid "Mixer" +#~ msgstr "Kontrolli i volumit" + +#~ msgid "PCM-2" +#~ msgstr "PCM-2" + +#~ msgid "Record" +#~ msgstr "Regjistrimi" + +#~ msgid "In-gain" +#~ msgstr "In-gain" + +#~ msgid "Out-gain" +#~ msgstr "Out-gain" + +#~ msgid "Line-1" +#~ msgstr "Linja-1" + +#~ msgid "Line-2" +#~ msgstr "Linja-2" + +#~ msgid "Line-3" +#~ msgstr "Linja-3" + +#~ msgid "Digital-1" +#~ msgstr "Dixhitale-1" + +#~ msgid "Digital-2" +#~ msgstr "Dixhitale-2" + +#~ msgid "Digital-3" +#~ msgstr "Dixhitale-3" + +#~ msgid "Phone-in" +#~ msgstr "Phone-hyrja" + +#~ msgid "Phone-out" +#~ msgstr "Phone-dalja" + +#~ msgid "Video" +#~ msgstr "Video" + +#~ msgid "Radio" +#~ msgstr "Radio" + +#~ msgid "Monitor" +#~ msgstr "Ekrani" + +#, fuzzy +#~ msgid "PC Speaker" +#~ msgstr "Zë folës" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "E pamundur hapja e file vfs \"%s\" për lexim." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Nuk është dhënë asnjë emër file" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "E pamundur hapja e file vfs \"%s\" për shkrim: %s." + +#~ msgid "No filename given" +#~ msgstr "Nuk është dhënë asnjë emër file" + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" + +#~ msgid "No device specified." +#~ msgstr "Nuk është përcaktuar asnjë dispozitiv." + +#~ msgid "Could not open device \"%s\" for reading and writing." +#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim dhe shkrim." + +#~ msgid "Device is open." +#~ msgstr "Dispozitivi është i hapur." + +#~ msgid "Device \"%s\" is not a capture device." +#~ msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje." + +#~ msgid "Could not get buffers from device \"%s\"." +#~ msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +#~ msgid "Could not get enough buffers from device \"%s\"." +#~ msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "E pamundur gjetja e elementit %s. Ky element është thelbësor për " +#~ "playback. Ju lutem instaloni plug-in e duhur dhe kontrollo funksionimin " +#~ "duke ekzekutuar 'gst-inspect %s'" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "Nuk arrin të gjehet asnjë element ngjyra e hapësirës.\n" +#~ "Ju lutem instaloni një dhe rinisni." diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000000..4eb1483b81 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,80 @@ +# Serbian translation of gst-plugins +# This file is put in the public domain. +# Мирослав Николић , 2011, 2013. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-1.1.4\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2013-10-03 22:30+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Project-Style: gnome\n" + +msgid "Could not read from CD." +msgstr "Не могу да читам ЦД." + +msgid "Could not open CD device for reading." +msgstr "Не могу да отворим ЦД уређај ради читања." + +msgid "Disc is not an Audio CD." +msgstr "Диск није Звучни ЦД." + +msgid "Could not open DVD" +msgstr "Не могу да отворим ДВД" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Не могу да отворим ДВД наслов „%d“" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Нисам успео да стигнем до поглавља „%d“ ДВД наслова „%d“" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Не могу да отворим ДВД наслов „%d“. Овај елемент не подржава међудејствене " +"наслове" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Не могу да читам ДВД. Можда зато што је ДВД шифрован а библиотека за " +"дешифровање ДВД-а није инсталирана." + +msgid "Could not read DVD." +msgstr "Не могу да читам ДВД." + +msgid "This stream contains no data." +msgstr "Овај ток не садржи податке." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Нисам успео да подесим енкодер звука ЛАМЕ мп3. Проверите ваше параметре " +#~ "кодирања." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Тражени проток података од %d kbit/s за „%s“ није допуштен. Проток " +#~ "података је постављен на %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Нисам успео да подесим ДваЛАМЕ енкодер. Проверите ваше параметре кодирања." + +#~ msgid "Internal data stream error." +#~ msgstr "Унутрашња грешка тока података." diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000000..e843c4a2ad --- /dev/null +++ b/po/sv.po @@ -0,0 +1,76 @@ +# Swedish translation for gst-plugins-ugly. +# Copyright (C) 2007, 2008, 2009, 2014, 2015, 2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Daniel Nylander , 2007, 2008, 2009. +# Sebastian Rasmussen , 2014, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.15.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-01-17 02:02+0000\n" +"PO-Revision-Date: 2019-01-17 02:02+0000\n" +"Last-Translator: Sebastian Rasmussen \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 1.8.6\n" + +#: ext/cdio/gstcdiocddasrc.c:199 +msgid "Could not read from CD." +msgstr "Kunde inte läsa från cd." + +#: ext/cdio/gstcdiocddasrc.c:406 +msgid "Could not open CD device for reading." +msgstr "Kunde inte öppna cd-enheten för läsning." + +#: ext/cdio/gstcdiocddasrc.c:413 +msgid "Disc is not an Audio CD." +msgstr "Skivan är inte en ljud-cd." + +#: ext/dvdread/dvdreadsrc.c:231 ext/dvdread/dvdreadsrc.c:238 +msgid "Could not open DVD" +msgstr "Kunde inte öppna dvd" + +#: ext/dvdread/dvdreadsrc.c:245 ext/dvdread/dvdreadsrc.c:622 +#: ext/dvdread/dvdreadsrc.c:629 +#, c-format +msgid "Could not open DVD title %d" +msgstr "Kunde inte öppna dvd-titel %d" + +#: ext/dvdread/dvdreadsrc.c:251 +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Misslyckades med att gå till kapitel %d för dvd-titel %d" + +#: ext/dvdread/dvdreadsrc.c:636 +#, c-format +msgid "Could not open DVD title %d. Interactive titles are not supported by this element" +msgstr "Kunde inte öppna dvd-titel %d. Interaktiva titlar stöds inte av det här elementet" + +#: ext/dvdread/dvdreadsrc.c:991 +msgid "Could not read DVD. This may be because the DVD is encrypted and a DVD decryption library is not installed." +msgstr "Kunde ej läsa dvd. Detta kan vara för att dvd:n är krypterad och ett dvd-avkrypteringsbibliotek inte är installerat." + +#: ext/dvdread/dvdreadsrc.c:994 +msgid "Could not read DVD." +msgstr "Kunde inte läsa dvd." + +#: gst/asfdemux/gstasfdemux.c:446 gst/asfdemux/gstasfdemux.c:454 +msgid "This stream contains no data." +msgstr "Den här strömmen innehåller inget data." + +#~ msgid "Failed to configure LAME mp3 audio encoder. Check your encoding parameters." +#~ msgstr "Misslyckades med att konfigurera LAME mp3 ljudkodare. Kontrollera dina kodningsparametrar." + +#~ msgid "The requested bitrate %d kbit/s for property '%s' is not allowed. The bitrate was changed to %d kbit/s." +#~ msgstr "Den begärda bitfrekvensen %d kbit/s för egenskapen \"%s\" tillåts inte. Bitfrekvensen ändrades till %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "Misslyckades med att konfigurera TwoLAME-kodaren. Kontrollera dina kodningsparametrar." + +#~ msgid "Internal data stream error." +#~ msgstr "Fel i intern dataström." diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 0000000000..cd8db03cd9 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,64 @@ +# Tamil messages for gst-plugins-ugly. +# This file is put in the public domain. +# List of contributors follow: +# Poorajith , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.15.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-01-17 02:02+0000\n" +"PO-Revision-Date: 2019-02-06 01:10+0530\n" +"Last-Translator: Arun Isaac \n" +"Language-Team: Tamil \n" +"Language: ta\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ext/cdio/gstcdiocddasrc.c:199 +msgid "Could not read from CD." +msgstr "குறுவட்டைப் படிக்க இயலவில்லை." + +#: ext/cdio/gstcdiocddasrc.c:406 +msgid "Could not open CD device for reading." +msgstr "குறுவட்டுக் கருவியைப் படிப்பதற்காகத் திறக்க இயலவில்லை." + +#: ext/cdio/gstcdiocddasrc.c:413 +msgid "Disc is not an Audio CD." +msgstr "இவ்வட்டு ஒலி குறுவட்டல்ல." + +#: ext/dvdread/dvdreadsrc.c:231 ext/dvdread/dvdreadsrc.c:238 +msgid "Could not open DVD" +msgstr "இறுவட்டைத் திறக்க இயல்வில்லை" + +#: ext/dvdread/dvdreadsrc.c:245 ext/dvdread/dvdreadsrc.c:622 +#: ext/dvdread/dvdreadsrc.c:629 +#, c-format +msgid "Could not open DVD title %d" +msgstr "%d என்ற இறுவட்டுத் தலைப்பைத் திறக்க இயலவில்லை" + +#: ext/dvdread/dvdreadsrc.c:251 +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "இறுவட்டுத் தலைப்பு %2$d யில் %1$d என்ற அத்தியாயத்திற்குச் செல்ல இயலவில்லை" + +#: ext/dvdread/dvdreadsrc.c:636 +#, c-format +msgid "Could not open DVD title %d. Interactive titles are not supported by this element" +msgstr "%d என்ற இறுவட்டுத் தலைப்பைத் திறக்க இயலவில்லை. ஊடாட்ட தலைப்புகளுக்கு இவ்வுறுப்பில் ஆதரவில்லை" + +#: ext/dvdread/dvdreadsrc.c:991 +msgid "Could not read DVD. This may be because the DVD is encrypted and a DVD decryption library is not installed." +msgstr "" +"இறுவட்டைப் படிக்க இயலவில்லை. இது இறுவட்டு மறையாக்கப்பட்டிருந்து அதனை மறைவிலக்க\n" +"தேவையான நிரலகம் நிறுவப்படாததால் இருக்கலாம்." + +#: ext/dvdread/dvdreadsrc.c:994 +msgid "Could not read DVD." +msgstr "இறுவட்டைப் படிக்க இயலவில்லை." + +#: gst/asfdemux/gstasfdemux.c:446 gst/asfdemux/gstasfdemux.c:454 +msgid "This stream contains no data." +msgstr "இத்தரவுத்தொடரில் எத்தரவுமில்லை." diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000000..679622cfb2 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,92 @@ +# translation of gst-plugins-ugly-1.0.3.po to Turkish +# This file is put in the public domain. +# Server Acim , 2009. +# Server Acim , 2013. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly-1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-12-01 01:19+0200\n" +"Last-Translator: Server Acim \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +msgid "Could not read from CD." +msgstr "CD okuyamıyor." + +msgid "Could not open CD device for reading." +msgstr "Okumak için CD aygıtını açamıyor." + +msgid "Disc is not an Audio CD." +msgstr "Bu disk bir Ses CD'si değil." + +msgid "Could not open DVD" +msgstr "DVD açılamıyor" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "DVD başlığı açılamıyor %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Bu dosyalara okunamadı:bölüm %d ve DVD başlığı %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"DVD başlığı açılamadı %d. Bu öğede etkileşimli Interactive başlıklar " +"desteklenmiyor" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD okunamıyor. Bunun sebebi, DVD'nin şifrelenmiş olması veya DVD şifre " +"çzöme kitaplığının kurulu olmaması olabilir." + +msgid "Could not read DVD." +msgstr "DVD okunamıyor." + +msgid "This stream contains no data." +msgstr "Akış veri içermiyor." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "LAME mp3 kodlayıcı yapılandırılamadı. Kodlama parametrelerinizi " +#~ "denetleyiniz." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "İstenen bit oranı %d kbit/s bu özellik için '%s' onaylanmadı. Bu yüzden " +#~ "bit oranı şuna dönüştürüldü %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "TwoLAME kodlayıcı yapılandırılamadı. Kodlama parametrelerinizi " +#~ "denetleyiniz." + +#~ msgid "Internal data stream error." +#~ msgstr "İç veri akış hatası." + +#~ msgid "Invalid title information on DVD." +#~ msgstr "DVD'de geçersiz başlık bilgisi." + +#~ msgid "Could not read title information for DVD." +#~ msgstr "DVD'deki başlık bilgisi okunamıyor." + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "DVD aygıtı açılamadı '%s'." + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "PGC tabanlı arama ayarlanamadı." diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000000..881905a113 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,87 @@ +# Ukrainian translation to gst-plugins-ugly. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# +# Maxim V. Dziumanenko , 2007. +# Yuri Chornoivan , 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.0.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2012-11-28 20:25+0200\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 1.5\n" + +msgid "Could not read from CD." +msgstr "Не вдалося прочитати дані з компакт-диска." + +msgid "Could not open CD device for reading." +msgstr "Не вдалося відкрити носій для читання." + +msgid "Disc is not an Audio CD." +msgstr "Диск не записано у форматі Audio CD." + +msgid "Could not open DVD" +msgstr "Не вдалося відкрити DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Не вдалося відкрити частину DVD %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Не вдалося перейти до розділу %d частини DVD %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Не вдалося відкрити заголовок DVD %d. Інтерактивні заголовки не " +"підтримуються цим елементом" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Не вдалося прочитати DVD. Причиною може бути те, що DVD зашифровано, а " +"бібліотеку розшифрування DVD не встановлено." + +msgid "Could not read DVD." +msgstr "Не вдалося прочитати DVD." + +msgid "This stream contains no data." +msgstr "Потік не містить даних." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Помилка при налаштовуванні кодера LAME для звукових даних у форматі MP3. " +#~ "Перевірте параметри кодування." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Запитана бітова швидкість %d кбіт/с для властивості «%s» є неприпустимою. " +#~ "Бітову швидкість змінено на %d кбіт/с." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Помилка при налаштовуванні кодувальника TwoLAME. Перевірте параметри " +#~ "кодування." + +#~ msgid "Internal data stream error." +#~ msgstr "Помилка внутрішнього потоку даних." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Файл зашифрований та не може бути відтворений." diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000000..57fd8c48ed --- /dev/null +++ b/po/vi.po @@ -0,0 +1,84 @@ +# Vietnamese translation for GST Plugins Ugly. +# Copyright © 2014 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Clytie Siddall , 2007-2010. +# Trần Ngọc Quân , 2012-2014. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.3.90\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2014-06-30 09:20+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Language-Team-Website: \n" +"X-Generator: LocFactoryEditor 1.8\n" +"X-Poedit-SourceCharset: UTF-8\n" + +msgid "Could not read from CD." +msgstr "Không thể đọc từ đĩa CD." + +msgid "Could not open CD device for reading." +msgstr "Không thể mở thiết bị đĩa CD để đọc." + +msgid "Disc is not an Audio CD." +msgstr "Đây không phải là một đĩa CD âm nhạc." + +msgid "Could not open DVD" +msgstr "Không thể mở đĩa DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "Không thể mở đĩa DVD tên %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "Gặp lỗi khi nhảy đến chương %d của đĩa DVD tên %d" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "" +"Không thể mở đĩa DVD tên %d. Phần tử này không hỗ trợ tiêu đề tương tác." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"Không thể đọc đĩa DVD. Nguyên nhân có thể là DVD đã bị mã hóa và thư viện " +"giải mã DVD chưa được cài đặt." + +msgid "Could not read DVD." +msgstr "Không thể đọc đĩa DVD." + +msgid "This stream contains no data." +msgstr "Luồng này không chứa dữ liệu." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "" +#~ "Gặp lỗi khi cấu hình bộ giải mã âm thanh mp3 của LAME. Hãy kiểm tra các " +#~ "tham số giải mã." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "" +#~ "Không cho phép tỷ lệ đã yêu cầu %d kbit/giây cho thuộc tính “%s” nên tỷ " +#~ "lệ bit bị thay đổi thành %d kbit/g." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "" +#~ "Gặp lỗi khi cấu hình bộ biên mã TwoLAME. Hãy kiểm tra lại các tham số " +#~ "giải mã." + +#~ msgid "Internal data stream error." +#~ msgstr "Lỗi luồng dữ liệu nội bộ." diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000000..be611e4cec --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,86 @@ +# Chinese (simplified) translation for gst-plugins-ugly. +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-ugly package. +# Wenzheng Hu , 2007. +# LI Daobing , 2008, 2009. +# Wylmer Wang , 2011. +# Mingye Wang , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-ugly 1.5.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2019-02-26 11:48+0000\n" +"PO-Revision-Date: 2015-08-28 15:36+0800\n" +"Last-Translator: Mingye Wang \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.4\n" + +msgid "Could not read from CD." +msgstr "无法读取 CD。" + +msgid "Could not open CD device for reading." +msgstr "无法打开以读方式打开 CD 设备。" + +msgid "Disc is not an Audio CD." +msgstr "盘类型不是音频 CD。" + +msgid "Could not open DVD" +msgstr "无法打开 DVD" + +#, c-format +msgid "Could not open DVD title %d" +msgstr "无法打开 DVD 标题 %d" + +#, c-format +msgid "Failed to go to chapter %d of DVD title %d" +msgstr "跳转到章节 %d, DVD 标题 %d 失败" + +#, c-format +msgid "" +"Could not open DVD title %d. Interactive titles are not supported by this " +"element" +msgstr "无法打开 DVD 标题 %d. 这个元素不支持互动标题" + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "无法读取 DVD。可能 DVD 光盘已加密,但 DVD 解密库没有安装。" + +msgid "Could not read DVD." +msgstr "无法读取 DVD。" + +msgid "This stream contains no data." +msgstr "这个串流中没有包含数据." + +#~ msgid "" +#~ "Failed to configure LAME mp3 audio encoder. Check your encoding " +#~ "parameters." +#~ msgstr "配置 LAME mp3 编码器失败. 请检查你的编码参数." + +#~ msgid "" +#~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " +#~ "bitrate was changed to %d kbit/s." +#~ msgstr "不允许的比特率 %d kbit/s 于 '%s'. 比特率已改变成 %d kbit/s." + +#~ msgid "Failed to configure TwoLAME encoder. Check your encoding parameters." +#~ msgstr "设置 TwoLAME 编码器失败. 请检查你的编码参数." + +#~ msgid "Internal data stream error." +#~ msgstr "内部数据流错误。" + +#~ msgid "Invalid title information on DVD." +#~ msgstr "无效的 DVD 标题信息。" + +#~ msgid "Could not read title information for DVD." +#~ msgstr "无法读取为 DVD 读取标题信息。" + +#~ msgid "Failed to open DVD device '%s'." +#~ msgstr "无法打开 DVD 设备 '%s'。" + +#~ msgid "Failed to set PGC based seeking." +#~ msgstr "设置基于 PGC 的定位失败。" diff --git a/scripts/dist-translations.py b/scripts/dist-translations.py new file mode 100755 index 0000000000..65148d6ecd --- /dev/null +++ b/scripts/dist-translations.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2020 Tim-Philipp Müller +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301, USA. + +import os +import subprocess +import shutil +import tempfile + +if __name__ == "__main__": + dist_root = os.environ['MESON_DIST_ROOT'] + build_root = os.environ['MESON_BUILD_ROOT'] + source_root = os.environ['MESON_SOURCE_ROOT'] + pwd = os.environ['PWD'] + tmpdir = tempfile.gettempdir() + + module = os.path.basename(os.path.normpath(source_root)) + + # Generate pot file + print('Generating pot file ...') + subprocess.run(['ninja', '-C', build_root, module + '-1.0-pot'], check=True) + + # Dist pot file in tarball + print('Copying pot file into dist staging directory ...') + pot_src = os.path.join(source_root, 'po', module + '-1.0.pot') + dist_po_dir = os.path.join(dist_root, 'po') + shutil.copy2(pot_src, dist_po_dir) diff --git a/scripts/extract-release-date-from-doap-file.py b/scripts/extract-release-date-from-doap-file.py new file mode 100755 index 0000000000..f09b60e9d0 --- /dev/null +++ b/scripts/extract-release-date-from-doap-file.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# +# extract-release-date-from-doap-file.py VERSION DOAP-FILE +# +# Extract release date for the given release version from a DOAP file +# +# Copyright (C) 2020 Tim-Philipp Müller +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +# Boston, MA 02110-1301, USA. + +import sys +import xml.etree.ElementTree as ET + +if len(sys.argv) != 3: + sys.exit('Usage: {} VERSION DOAP-FILE'.format(sys.argv[0])) + +release_version = sys.argv[1] +doap_fn = sys.argv[2] + +tree = ET.parse(doap_fn) +root = tree.getroot() + +namespaces = {'doap': 'http://usefulinc.com/ns/doap#'} + +for v in root.findall('doap:release/doap:Version', namespaces=namespaces): + if v.findtext('doap:revision', namespaces=namespaces) == release_version: + release_date = v.findtext('doap:created', namespaces=namespaces) + if release_date: + print(release_date) + sys.exit(0) + +sys.exit('Could not find a release with version {} in {}'.format(release_version, doap_fn)) diff --git a/scripts/meson.build b/scripts/meson.build new file mode 100644 index 0000000000..f5d9106271 --- /dev/null +++ b/scripts/meson.build @@ -0,0 +1,4 @@ +# dist scripts +if not meson.is_subproject() + meson.add_dist_script('dist-translations.py') +endif diff --git a/tests/check/elements/amrnbenc.c b/tests/check/elements/amrnbenc.c new file mode 100644 index 0000000000..3875e80a76 --- /dev/null +++ b/tests/check/elements/amrnbenc.c @@ -0,0 +1,144 @@ +/* + * GStreamer + * + * unit test for amrnbenc + * + * Copyright (C) 2006 Thomas Vander Stichele + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#define SRC_CAPS "audio/x-raw, format = (string)" GST_AUDIO_NE (S16) ", " \ + "layout = (string) interleaved, channels = (int) 1, rate = (int) 8000" +#define SINK_CAPS "audio/AMR" + +static GstPad *srcpad, *sinkpad; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS) + ); + +static void +buffer_unref (void *buffer, void *user_data) +{ + gst_buffer_unref (GST_BUFFER (buffer)); +} + +static GstElement * +setup_amrnbenc (void) +{ + GstElement *amrnbenc; + GstCaps *caps; + GstBus *bus; + + GST_DEBUG ("setup_amrnbenc"); + + amrnbenc = gst_check_setup_element ("amrnbenc"); + srcpad = gst_check_setup_src_pad (amrnbenc, &srctemplate); + sinkpad = gst_check_setup_sink_pad (amrnbenc, &sinktemplate); + gst_pad_set_active (srcpad, TRUE); + gst_pad_set_active (sinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (amrnbenc, bus); + + fail_unless (gst_element_set_state (amrnbenc, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set to playing"); + + caps = gst_caps_from_string (SRC_CAPS); + gst_check_setup_events (srcpad, amrnbenc, caps, GST_FORMAT_TIME); + gst_caps_unref (caps); + + buffers = NULL; + return amrnbenc; +} + +static void +cleanup_amrnbenc (GstElement * amrnbenc) +{ + GstBus *bus; + + /* free encoded buffers */ + g_list_foreach (buffers, buffer_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + bus = GST_ELEMENT_BUS (amrnbenc); + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + + GST_DEBUG ("cleanup_amrnbenc"); + gst_pad_set_active (srcpad, FALSE); + gst_pad_set_active (sinkpad, FALSE); + gst_check_teardown_src_pad (amrnbenc); + gst_check_teardown_sink_pad (amrnbenc); + gst_check_teardown_element (amrnbenc); +} + +/* push a random block of audio of the given size */ +static void +push_data (gint size, GstFlowReturn expected_return) +{ + GstBuffer *buffer; + GstFlowReturn res; + + buffer = gst_buffer_new_and_alloc (size); + /* make valgrind happier */ + gst_buffer_memset (buffer, 0, 0, size); + + res = gst_pad_push (srcpad, buffer); + fail_unless (res == expected_return, + "pushing audio returned %d (%s) not %d (%s)", res, + gst_flow_get_name (res), expected_return, + gst_flow_get_name (expected_return)); +} + +GST_START_TEST (test_enc) +{ + GstElement *amrnbenc; + + amrnbenc = setup_amrnbenc (); + push_data (1000, GST_FLOW_OK); + + cleanup_amrnbenc (amrnbenc); +} + +GST_END_TEST; + +static Suite * +amrnbenc_suite () +{ + Suite *s = suite_create ("amrnbenc"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_enc); + return s; +} + +GST_CHECK_MAIN (amrnbenc); diff --git a/tests/check/elements/mpeg2dec.c b/tests/check/elements/mpeg2dec.c new file mode 100644 index 0000000000..1c8030fd98 --- /dev/null +++ b/tests/check/elements/mpeg2dec.c @@ -0,0 +1,1971 @@ +/* GStreamer + * + * unit test for mpeg2dec + * + * Copyright (c) 2006 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include + +/* For ease of programming we use globals to keep refs for our floating + * src and sink pads we create; otherwise we always have to do get_pad, + * get_peer, and then remove references in every test function */ +static GstPad *mysrcpad, *mysinkpad; + +/* mpeg2 video created with gst-launch-0.10 videotestsrc num-buffers=32 pattern=blue ! "video/x-raw,format=(string)I420,width=176,height=144,framerate=(fraction)25/1" ! ffenc_mpeg2video ! filesink location=test.mpg +*/ + +static const guint8 test_stream1[] = { + 0x00, 0x00, 0x01, 0xb3, 0x0b, 0x00, 0x90, 0x13, + 0xff, 0xff, 0xe0, 0x28, 0x00, 0x00, 0x01, 0xb5, + 0x14, 0x8a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xb8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, + 0x01, 0xb5, 0x8f, 0xff, 0xf3, 0x41, 0x80, 0x00, + 0x00, 0x01, 0x01, 0x13, 0xf8, 0xe5, 0x29, 0x4b, + 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x88, 0x00, 0x00, 0x01, 0x02, 0x13, 0xf8, 0xe5, + 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x03, 0x13, + 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, + 0x04, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, + 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, + 0x00, 0x01, 0x05, 0x13, 0xf8, 0xe5, 0x29, 0x4b, + 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x88, 0x00, 0x00, 0x01, 0x06, 0x13, 0xf8, 0xe5, + 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x07, 0x13, + 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, + 0x08, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, + 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, + 0x00, 0x01, 0x09, 0x13, 0xf8, 0xe5, 0x29, 0x4b, + 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x88, 0x00, 0x00, 0x01, 0x00, 0x00, 0x57, 0xff, + 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, + 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x97, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x00, 0x00, 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, + 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, + 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x57, 0xff, + 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, + 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x97, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x00, 0x01, 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, + 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, + 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x57, 0xff, + 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, + 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x97, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x00, 0x02, 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, + 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, + 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x03, 0x57, 0xff, + 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, + 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, + 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x97, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0xb3, 0x0b, 0x00, 0x90, 0x13, 0xff, 0xff, 0xe0, + 0x28, 0x00, 0x00, 0x01, 0xb5, 0x14, 0x8a, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb8, 0x00, + 0x08, 0x07, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xb5, 0x8f, + 0xff, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, + 0x01, 0x02, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, + 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, + 0x00, 0x00, 0x01, 0x03, 0x13, 0xf8, 0xe5, 0x29, + 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x88, 0x00, 0x00, 0x01, 0x04, 0x13, 0xf8, + 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x05, + 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, + 0x01, 0x06, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, + 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, + 0x00, 0x00, 0x01, 0x07, 0x13, 0xf8, 0xe5, 0x29, + 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x88, 0x00, 0x00, 0x01, 0x08, 0x13, 0xf8, + 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x09, + 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x97, 0xff, 0xfb, + 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, + 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0xd7, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x17, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, + 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, + 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x97, 0xff, 0xfb, + 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, + 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0xd7, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x02, 0x17, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, + 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, + 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x97, 0xff, 0xfb, + 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, + 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0xd7, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x03, 0x17, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, + 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, + 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xb3, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x97, 0xff, 0xfb, + 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, + 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, + 0xb3, 0x80, 0x00, 0x00, 0x01, 0xb3, 0x0b, 0x00, + 0x90, 0x13, 0xff, 0xff, 0xe0, 0x28, 0x00, 0x00, + 0x01, 0xb5, 0x14, 0x8a, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xb8, 0x00, 0x08, 0x22, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xff, 0xf8, + 0x00, 0x00, 0x01, 0xb5, 0x8f, 0xff, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x13, 0xf8, 0xe5, + 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x02, 0x13, + 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, + 0x03, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, + 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, + 0x00, 0x01, 0x04, 0x13, 0xf8, 0xe5, 0x29, 0x4b, + 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x88, 0x00, 0x00, 0x01, 0x05, 0x13, 0xf8, 0xe5, + 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x06, 0x13, + 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, + 0x07, 0x13, 0xf8, 0xe5, 0x29, 0x4b, 0xf7, 0xfb, + 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x88, 0x00, + 0x00, 0x01, 0x08, 0x13, 0xf8, 0xe5, 0x29, 0x4b, + 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x88, 0x00, 0x00, 0x01, 0x09, 0x13, 0xf8, 0xe5, + 0x29, 0x4b, 0xf7, 0xfb, 0xca, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x88, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x57, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x02, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x03, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x06, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xb3, 0x80, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xb3, 0x80, +}; + +static const guint test_stream_sizes[] = { + 497, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 497, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 497, 90 +}; + +/* mpeg2 video created with gst-launch-0.10 videotestsrc num-buffers=32 pattern=blue ! "video/x-raw,format=(string)I420,width=183,height=217,framerate=(fraction)25/1" ! ffenc_mpeg2video ! filesink location=test.mpg +*/ + +static const guint8 test_stream2[] = { + 0x00, 0x00, 0x01, 0xb3, 0x0b, 0x70, 0xd9, 0x13, + 0xff, 0xff, 0xe0, 0x28, 0x00, 0x00, 0x01, 0xb5, + 0x14, 0x8a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xb8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, + 0x01, 0xb5, 0x8f, 0xff, 0xf3, 0x41, 0x80, 0x00, + 0x00, 0x01, 0x01, 0x23, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x02, 0x23, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x03, 0x23, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x04, 0x23, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x05, 0x23, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x06, 0x23, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x07, 0x23, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x08, 0x23, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x09, 0x23, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x0a, 0x23, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x0b, 0x23, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x0c, 0x23, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x0d, 0x23, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x0e, 0x23, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x57, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x1a, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x1a, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x1a, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x1a, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x1a, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x1a, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x1a, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x1a, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x1a, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x1a, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x1a, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x1a, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x1a, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x1a, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x97, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x57, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x97, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x01, + 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x57, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x97, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x02, + 0xd7, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x17, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x57, 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, + 0x81, 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x09, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x97, 0xff, 0xfb, 0x80, + 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, + 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0xb3, 0x0b, + 0x70, 0xd9, 0x13, 0xff, 0xff, 0xe0, 0x28, 0x00, + 0x00, 0x01, 0xb5, 0x14, 0x8a, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xb8, 0x00, 0x08, 0x07, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xff, + 0xf8, 0x00, 0x00, 0x01, 0xb5, 0x8f, 0xff, 0xf3, + 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x13, 0xf9, + 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, + 0x00, 0x00, 0x01, 0x02, 0x13, 0xf9, 0x45, 0x29, + 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, + 0x01, 0x03, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, + 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x04, + 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x20, 0x00, 0x00, 0x01, 0x05, 0x13, 0xf9, + 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, + 0x00, 0x00, 0x01, 0x06, 0x13, 0xf9, 0x45, 0x29, + 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, + 0x01, 0x07, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, + 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x08, + 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x20, 0x00, 0x00, 0x01, 0x09, 0x13, 0xf9, + 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, + 0x00, 0x00, 0x01, 0x0a, 0x13, 0xf9, 0x45, 0x29, + 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, + 0x01, 0x0b, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, + 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x0c, + 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x20, 0x00, 0x00, 0x01, 0x0d, 0x13, 0xf9, + 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, + 0x00, 0x00, 0x01, 0x0e, 0x13, 0xf9, 0x45, 0x29, + 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x97, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0xd7, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x17, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x97, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x01, 0xd7, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x02, 0x17, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x02, 0x97, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x02, 0xd7, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x03, 0x17, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x57, 0xff, 0xfb, 0x80, 0x00, + 0x00, 0x01, 0xb5, 0x81, 0x1f, 0xf3, 0x41, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x02, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x03, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x04, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x05, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x08, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x09, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0a, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0b, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x0c, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0d, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0e, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x03, 0x97, + 0xff, 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, + 0x1f, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x08, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0xb3, 0x0b, 0x70, 0xd9, 0x13, 0xff, 0xff, + 0xe0, 0x28, 0x00, 0x00, 0x01, 0xb5, 0x14, 0x8a, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb8, + 0x00, 0x08, 0x22, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xb5, + 0x8f, 0xff, 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, + 0x01, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x02, 0x13, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x03, 0x13, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x04, 0x13, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x05, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x06, 0x13, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x07, 0x13, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x08, 0x13, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x09, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x0a, 0x13, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x0b, 0x13, 0xf9, 0x45, + 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, + 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, + 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, + 0x00, 0x01, 0x0c, 0x13, 0xf9, 0x45, 0x29, 0x4b, + 0xf7, 0x0b, 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, + 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, + 0x94, 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, + 0x48, 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, + 0x88, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, + 0x0d, 0x13, 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, + 0xcd, 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, + 0x8b, 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, + 0xb9, 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, + 0x94, 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x20, 0x00, 0x00, 0x01, 0x0e, 0x13, + 0xf9, 0x45, 0x29, 0x4b, 0xf7, 0x0b, 0xcd, 0xb9, + 0x4a, 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, + 0xa5, 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, + 0x52, 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, + 0x22, 0x2e, 0x52, 0x94, 0x88, 0xb9, 0x4a, 0x52, + 0x22, 0xe5, 0x29, 0x48, 0x8b, 0x94, 0xa5, 0x22, + 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x57, 0xff, + 0xfb, 0x80, 0x00, 0x00, 0x01, 0xb5, 0x81, 0x1f, + 0xf3, 0x41, 0x80, 0x00, 0x00, 0x01, 0x01, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x02, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x03, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x04, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x05, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x06, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, + 0x07, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, + 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x08, + 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, + 0x85, 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x09, 0x12, + 0x70, 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, + 0xe6, 0xc0, 0x00, 0x00, 0x01, 0x0a, 0x12, 0x70, + 0xa1, 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, + 0xc0, 0x00, 0x00, 0x01, 0x0b, 0x12, 0x70, 0xa1, + 0xfc, 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, + 0x00, 0x00, 0x01, 0x0c, 0x12, 0x70, 0xa1, 0xfc, + 0xa2, 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, + 0x00, 0x01, 0x0d, 0x12, 0x70, 0xa1, 0xfc, 0xa2, + 0x94, 0xa5, 0xfb, 0x85, 0xe6, 0xc0, 0x00, 0x00, + 0x01, 0x0e, 0x12, 0x70, 0xa1, 0xfc, 0xa2, 0x94, + 0xa5, 0xfb, 0x85, 0xe6, 0xc0 +}; + +static const guint test_stream2_sizes[] = { + 803, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 803, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 803, 228 +}; + + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " + "systemstream=(boolean)false, " "mpegversion=(int)2") + ); + +GstElement * +setup_mpeg2dec () +{ + GstElement *mpeg2dec; + GstCaps *caps; + + GST_DEBUG ("setup_mpeg2dec"); + mpeg2dec = gst_check_setup_element ("mpeg2dec"); + mysrcpad = gst_check_setup_src_pad (mpeg2dec, &srctemplate); + mysinkpad = gst_check_setup_sink_pad (mpeg2dec, &sinktemplate); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + caps = gst_caps_new_simple ("video/mpeg", + "systemstream", G_TYPE_BOOLEAN, FALSE, + "mpegversion", G_TYPE_INT, 2, NULL); + gst_check_setup_events (mysrcpad, mpeg2dec, caps, GST_FORMAT_TIME); + gst_caps_unref (caps); + + return mpeg2dec; +} + +void +cleanup_mpeg2dec (GstElement * mpeg2dec) +{ + GST_DEBUG ("cleanup_mpeg2dec"); + gst_element_set_state (mpeg2dec, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (mpeg2dec); + gst_check_teardown_sink_pad (mpeg2dec); + gst_check_teardown_element (mpeg2dec); +} + +GST_START_TEST (test_decode_stream1) +{ + GstElement *mpeg2dec; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + int i, num_buffers; + GstCaps *out_caps, *caps; + guint offset = 0; + GstVideoInfo info; + + mpeg2dec = setup_mpeg2dec (); + + fail_unless (gst_element_set_state (mpeg2dec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + gst_element_set_bus (mpeg2dec, bus); + + for (i = 0; i < G_N_ELEMENTS (test_stream_sizes); i++) { + inbuffer = + gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, + (guint8 *) test_stream1 + offset, test_stream_sizes[i], 0, + test_stream_sizes[i], NULL, NULL); + offset += test_stream_sizes[i]; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_ref (inbuffer); + /* should decode the buffer without problems */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + + gst_buffer_unref (inbuffer); + } + + num_buffers = g_list_length (buffers); + + /* should be 30 buffers, one per decoded frame */ + fail_unless_equals_int (num_buffers, 30); + + /* each buffer should have these caps */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_I420, 176, 144); + GST_VIDEO_INFO_PAR_N (&info) = GST_VIDEO_INFO_PAR_D (&info) = 1; + GST_VIDEO_INFO_FPS_N (&info) = 25; + GST_VIDEO_INFO_FPS_D (&info) = 1; + GST_VIDEO_INFO_FPS_D (&info) = 1; + GST_VIDEO_INFO_CHROMA_SITE (&info) = GST_VIDEO_CHROMA_SITE_MPEG2; + gst_video_colorimetry_from_string (&GST_VIDEO_INFO_COLORIMETRY (&info), + "2:0:0:0"); + GST_VIDEO_INFO_MULTIVIEW_MODE (&info) = GST_VIDEO_MULTIVIEW_MODE_MONO; + + out_caps = gst_video_info_to_caps (&info); + + caps = gst_pad_get_current_caps (mysinkpad); + GST_LOG ("output caps %" GST_PTR_FORMAT, caps); + fail_unless (gst_caps_is_equal_fixed (caps, out_caps), "Incorrect out caps"); + gst_caps_unref (caps); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + /* I420 with 176x144 should have this size if nothing else was negotiated */ + fail_unless_equals_int (gst_buffer_get_size (outbuffer), 38016); + + buffers = g_list_remove (buffers, outbuffer); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + gst_caps_unref (out_caps); + g_list_free (buffers); + buffers = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (mpeg2dec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_mpeg2dec (mpeg2dec); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_stream2) +{ + GstElement *mpeg2dec; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + int i, num_buffers; + GstCaps *out_caps; + GstCaps *caps; + guint offset = 0; + GstVideoInfo info; + + mpeg2dec = setup_mpeg2dec (); + + fail_unless (gst_element_set_state (mpeg2dec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + gst_element_set_bus (mpeg2dec, bus); + + for (i = 0; i < G_N_ELEMENTS (test_stream2_sizes); i++) { + inbuffer = + gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, + (guint8 *) test_stream2 + offset, test_stream2_sizes[i], 0, + test_stream2_sizes[i], NULL, NULL); + offset += test_stream2_sizes[i]; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_ref (inbuffer); + /* should decode the buffer without problems */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + + gst_buffer_unref (inbuffer); + } + + + num_buffers = g_list_length (buffers); + + /* should be 30 buffers, one per decoded frame */ + fail_unless_equals_int (num_buffers, 30); + + /* each buffer should have these caps */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_I420, 183, 217); + GST_VIDEO_INFO_PAR_N (&info) = GST_VIDEO_INFO_PAR_D (&info) = 1; + GST_VIDEO_INFO_FPS_N (&info) = 25; + GST_VIDEO_INFO_FPS_D (&info) = 1; + GST_VIDEO_INFO_FPS_D (&info) = 1; + GST_VIDEO_INFO_CHROMA_SITE (&info) = GST_VIDEO_CHROMA_SITE_MPEG2; + gst_video_colorimetry_from_string (&GST_VIDEO_INFO_COLORIMETRY (&info), + "2:0:0:0"); + GST_VIDEO_INFO_MULTIVIEW_MODE (&info) = GST_VIDEO_MULTIVIEW_MODE_MONO; + + out_caps = gst_video_info_to_caps (&info); + + caps = gst_pad_get_current_caps (mysinkpad); + GST_LOG ("output caps %" GST_PTR_FORMAT, caps); + GST_LOG ("expected caps %" GST_PTR_FORMAT, out_caps); + fail_unless (gst_caps_is_equal_fixed (caps, out_caps), "Incorrect out caps"); + gst_caps_unref (caps); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + /* I420 with 183x217 must have this size */ + fail_unless_equals_int (gst_buffer_get_size (outbuffer), 60168); + + buffers = g_list_remove (buffers, outbuffer); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + gst_caps_unref (out_caps); + g_list_free (buffers); + buffers = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (mpeg2dec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_mpeg2dec (mpeg2dec); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_garbage) +{ + GstElement *mpeg2dec; + GstBuffer *inbuffer; + GstBus *bus; + int i, num_buffers; + guint32 *tmpbuf; + + mpeg2dec = setup_mpeg2dec (); + + fail_unless (gst_element_set_state (mpeg2dec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + /* initialize the buffer with something that is no mpeg2 */ + tmpbuf = g_new (guint32, 4096); + for (i = 0; i < 4096; i++) { + tmpbuf[i] = i; + } + inbuffer = gst_buffer_new_wrapped (tmpbuf, 4096 * sizeof (guint32)); + + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_ref (inbuffer); + + gst_element_set_bus (mpeg2dec, bus); + + /* should be possible to push without problems but nothing gets decoded */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + + gst_buffer_unref (inbuffer); + + num_buffers = g_list_length (buffers); + + /* should be 0 buffers as decoding should've been impossible */ + fail_unless_equals_int (num_buffers, 0); + + g_list_free (buffers); + buffers = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (mpeg2dec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_mpeg2dec (mpeg2dec); +} + +GST_END_TEST; +Suite * +mpeg2dec_suite (void) +{ + Suite *s = suite_create ("mpeg2dec"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_decode_stream1); + tcase_add_test (tc_chain, test_decode_stream2); + tcase_add_test (tc_chain, test_decode_garbage); + + return s; +} + +GST_CHECK_MAIN (mpeg2dec); diff --git a/tests/check/elements/x264enc.c b/tests/check/elements/x264enc.c new file mode 100644 index 0000000000..27f8fdf2f3 --- /dev/null +++ b/tests/check/elements/x264enc.c @@ -0,0 +1,416 @@ +/* GStreamer + * + * unit test for x264enc + * + * Copyright (C) <2008> Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +/* For ease of programming we use globals to keep refs for our floating + * src and sink pads we create; otherwise we always have to do get_pad, + * get_peer, and then remove references in every test function */ +static GstPad *mysrcpad, *mysinkpad; + +#define VIDEO_CAPS_STRING "video/x-raw, " \ + "width = (int) 384, " \ + "height = (int) 288, " \ + "framerate = (fraction) 25/1" + +#define H264_CAPS_STRING "video/x-h264, " \ + "width = (int) 384, " \ + "height = (int) 288, " \ + "framerate = (fraction) 25/1" + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_STRING)); + +static void cleanup_x264enc (GstElement * x264enc); + +static GstElement * +setup_x264enc (const gchar * profile, const gchar * stream_format, + GstVideoFormat input_format) +{ + GstPadTemplate *sink_tmpl, *tmpl; + GstElement *x264enc; + GstCaps *caps, *tmpl_caps; + + GST_DEBUG ("setup_x264enc"); + + caps = gst_caps_from_string (H264_CAPS_STRING); + gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile, + "stream-format", G_TYPE_STRING, stream_format, NULL); + sink_tmpl = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); + gst_caps_unref (caps); + + x264enc = gst_check_setup_element ("x264enc"); + mysrcpad = gst_check_setup_src_pad (x264enc, &srctemplate); + mysinkpad = gst_check_setup_sink_pad_from_template (x264enc, sink_tmpl); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + caps = gst_caps_from_string (VIDEO_CAPS_STRING); + gst_caps_set_simple (caps, "format", G_TYPE_STRING, + gst_video_format_to_string (input_format), NULL); + + tmpl = gst_element_get_pad_template (x264enc, "sink"); + tmpl_caps = gst_pad_template_get_caps (tmpl); + + if (gst_caps_can_intersect (caps, tmpl_caps)) { + gst_check_setup_events (mysrcpad, x264enc, caps, GST_FORMAT_TIME); + } else { + cleanup_x264enc (x264enc); + x264enc = NULL; + } + + gst_caps_unref (tmpl_caps); + gst_caps_unref (caps); + gst_object_unref (sink_tmpl); + + return x264enc; +} + +static void +cleanup_x264enc (GstElement * x264enc) +{ + GST_DEBUG ("cleanup_x264enc"); + gst_element_set_state (x264enc, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (x264enc); + gst_check_teardown_sink_pad (x264enc); + gst_check_teardown_element (x264enc); +} + +static void +check_caps (GstCaps * caps, const gchar * profile, gint profile_id) +{ + GstStructure *s; + const GValue *sf, *avcc, *pf; + const gchar *stream_format; + const gchar *caps_profile; + + fail_unless (caps != NULL); + + GST_INFO ("caps %" GST_PTR_FORMAT, caps); + s = gst_caps_get_structure (caps, 0); + fail_unless (s != NULL); + fail_if (!gst_structure_has_name (s, "video/x-h264")); + sf = gst_structure_get_value (s, "stream-format"); + fail_unless (sf != NULL); + fail_unless (G_VALUE_HOLDS_STRING (sf)); + stream_format = g_value_get_string (sf); + fail_unless (stream_format != NULL); + if (strcmp (stream_format, "avc") == 0) { + GstMapInfo map; + GstBuffer *buf; + + avcc = gst_structure_get_value (s, "codec_data"); + fail_unless (avcc != NULL); + fail_unless (GST_VALUE_HOLDS_BUFFER (avcc)); + buf = gst_value_get_buffer (avcc); + fail_unless (buf != NULL); + gst_buffer_map (buf, &map, GST_MAP_READ); + fail_unless_equals_int (map.data[0], 1); + fail_unless (map.data[1] == profile_id, + "Expected profile ID %#04x, got %#04x", profile_id, map.data[1]); + gst_buffer_unmap (buf, &map); + } else if (strcmp (stream_format, "byte-stream") == 0) { + fail_if (gst_structure_get_value (s, "codec_data") != NULL); + } else { + fail_if (TRUE, "unexpected stream-format in caps: %s", stream_format); + } + + pf = gst_structure_get_value (s, "profile"); + fail_unless (pf != NULL); + fail_unless (G_VALUE_HOLDS_STRING (pf)); + caps_profile = g_value_get_string (pf); + fail_unless (caps_profile != NULL); + fail_unless (!strcmp (caps_profile, profile)); +} + +static const GstVideoFormat formats_420_8[] = + { GST_VIDEO_FORMAT_I420, GST_VIDEO_FORMAT_YV12, GST_VIDEO_FORMAT_NV12, + GST_VIDEO_FORMAT_UNKNOWN +}; + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +static const GstVideoFormat formats_420_10[] = + { GST_VIDEO_FORMAT_I420_10LE, GST_VIDEO_FORMAT_UNKNOWN }; +static const GstVideoFormat formats_422[] = + { GST_VIDEO_FORMAT_Y42B, GST_VIDEO_FORMAT_I422_10LE, + GST_VIDEO_FORMAT_UNKNOWN +}; + +static const GstVideoFormat formats_444[] = + { GST_VIDEO_FORMAT_Y444, GST_VIDEO_FORMAT_Y444_10LE, + GST_VIDEO_FORMAT_UNKNOWN +}; +#else +static const GstVideoFormat formats_420_10[] = + { GST_VIDEO_FORMAT_I420_10BE, GST_VIDEO_FORMAT_UNKNOWN }; +static const GstVideoFormat formats_422[] = + { GST_VIDEO_FORMAT_Y42B, GST_VIDEO_FORMAT_I422_10BE, + GST_VIDEO_FORMAT_UNKNOWN +}; + +static const GstVideoFormat formats_444[] = + { GST_VIDEO_FORMAT_Y444, GST_VIDEO_FORMAT_Y444_10BE, + GST_VIDEO_FORMAT_UNKNOWN +}; +#endif + +static void +test_video_profile (const gchar * profile, gint profile_id, + const GstVideoFormat input_formats[], gint input_format_index) +{ + GstVideoFormat input_format = input_formats[input_format_index]; + GstElement *x264enc; + GstBuffer *inbuffer, *outbuffer; + int i, num_buffers; + GstVideoInfo vinfo; + GstCaps *caps; + + fail_unless (gst_video_info_set_format (&vinfo, input_format, 384, 288)); + + x264enc = setup_x264enc (profile, "avc", input_format); + if (x264enc == NULL) { + g_printerr ("WARNING: input format '%s' not supported\n", + gst_video_format_to_string (input_format)); + return; + } + + fail_unless (gst_element_set_state (x264enc, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* check that we only accept input formats compatible with the output caps */ + caps = gst_pad_peer_query_caps (mysrcpad, NULL); + for (i = 0; i < gst_caps_get_size (caps); i++) { + GstStructure *s = gst_caps_get_structure (caps, i); + const GValue *v, *vi; + guint vlen, j = 0; + + v = gst_structure_get_value (s, "format"); + + if (G_VALUE_TYPE (v) == G_TYPE_STRING) { + vlen = 1; + vi = v; + } else if (G_VALUE_TYPE (v) == GST_TYPE_LIST) { + vlen = gst_value_list_get_size (v); + fail_unless (vlen > 0, "Got empty format list"); + vi = gst_value_list_get_value (v, 0); + } else { + fail ("Bad format in structure: %" GST_PTR_FORMAT, s); + g_assert_not_reached (); + } + + while (TRUE) { + const gchar *str = g_value_get_string (vi); + GstVideoFormat format = gst_video_format_from_string (str); + int k; + + for (k = 0;; k++) { + fail_unless (input_formats[k] != GST_VIDEO_FORMAT_UNKNOWN, + "Bad format: %s", str); + if (input_formats[k] == format) + break; + } + + if (++j < vlen) + vi = gst_value_list_get_value (v, j); + else + break; + } + } + gst_caps_unref (caps); + + /* corresponds to buffer for the size mentioned in the caps */ + inbuffer = gst_buffer_new_and_alloc (GST_VIDEO_INFO_SIZE (&vinfo)); + + /* makes valgrind's memcheck happier */ + gst_buffer_memset (inbuffer, 0, 0, -1); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + + /* send eos to have all flushed if needed */ + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + num_buffers = g_list_length (buffers); + fail_unless (num_buffers == 1); + + /* check output caps */ + { + GstCaps *outcaps; + + outcaps = gst_pad_get_current_caps (mysinkpad); + check_caps (outcaps, profile, profile_id); + gst_caps_unref (outcaps); + } + + /* validate buffers */ + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + switch (i) { + case 0: + { + gint nsize, npos, j, type, next_type; + GstMapInfo map; + const guint8 *data; + gsize size; + + gst_buffer_map (outbuffer, &map, GST_MAP_READ); + data = map.data; + size = map.size; + + npos = 0; + j = 0; + /* need SPS first */ + next_type = 7; + /* loop through NALs */ + while (npos < size) { + fail_unless (size - npos >= 4); + nsize = GST_READ_UINT32_BE (data + npos); + fail_unless (nsize > 0); + fail_unless (npos + 4 + nsize <= size); + type = data[npos + 4] & 0x1F; + /* check the first NALs, disregard AU (9), SEI (6) */ + if (type != 9 && type != 6) { + fail_unless (type == next_type); + switch (type) { + case 7: + /* SPS */ + next_type = 8; + break; + case 8: + /* PPS */ + next_type = 5; + break; + default: + break; + } + j++; + } + npos += nsize + 4; + } + gst_buffer_unmap (outbuffer, &map); + /* should have reached the exact end */ + fail_unless (npos == size); + break; + } + default: + break; + } + + buffers = g_list_remove (buffers, outbuffer); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + cleanup_x264enc (x264enc); + g_list_free (buffers); + buffers = NULL; +} + +GST_START_TEST (test_video_baseline) +{ + gint i; + + for (i = 0; formats_420_8[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("constrained-baseline", 0x42, formats_420_8, i); +} + +GST_END_TEST; + +GST_START_TEST (test_video_main) +{ + gint i; + + for (i = 0; formats_420_8[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("main", 0x4d, formats_420_8, i); +} + +GST_END_TEST; + +GST_START_TEST (test_video_high) +{ + gint i; + + for (i = 0; formats_420_8[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("high", 0x64, formats_420_8, i); +} + +GST_END_TEST; + +GST_START_TEST (test_video_high10) +{ + gint i; + + for (i = 0; formats_420_10[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("high-10", 0x6e, formats_420_10, i); +} + +GST_END_TEST; + +GST_START_TEST (test_video_high422) +{ + gint i; + + for (i = 0; formats_422[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("high-4:2:2", 0x7A, formats_422, i); +} + +GST_END_TEST; + +GST_START_TEST (test_video_high444) +{ + gint i; + + for (i = 0; formats_444[i] != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("high-4:4:4", 0xF4, formats_444, i); +} + +GST_END_TEST; + +Suite * +x264enc_suite (void) +{ + Suite *s = suite_create ("x264enc"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_video_baseline); + tcase_add_test (tc_chain, test_video_main); + tcase_add_test (tc_chain, test_video_high); + tcase_add_test (tc_chain, test_video_high10); + tcase_add_test (tc_chain, test_video_high422); + tcase_add_test (tc_chain, test_video_high444); + + return s; +} + +GST_CHECK_MAIN (x264enc); diff --git a/tests/check/elements/xingmux.c b/tests/check/elements/xingmux.c new file mode 100644 index 0000000000..b1fa51067e --- /dev/null +++ b/tests/check/elements/xingmux.c @@ -0,0 +1,154 @@ +/* GStreamer + * + * Copyright (C) 2008 Sebastian Dröge + * + * xingmux.c: Unit test for the xingmux element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +#include "xingmux_testdata.h" + +/* For ease of programming we use globals to keep refs for our floating + * src and sink pads we create; otherwise we always have to do get_pad, + * get_peer, and then remove references in every test function */ +GstPad *mysrcpad, *mysinkpad; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1," "layer = (int) 3") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1," "layer = (int) 3") + ); + +GstElement * +setup_xingmux () +{ + GstElement *xingmux; + GstCaps *caps; + + GST_DEBUG ("setup_xingmux"); + xingmux = gst_check_setup_element ("xingmux"); + mysrcpad = gst_check_setup_src_pad (xingmux, &srctemplate); + mysinkpad = gst_check_setup_sink_pad (xingmux, &sinktemplate); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); + gst_check_setup_events (mysrcpad, xingmux, caps, GST_FORMAT_TIME); + gst_caps_unref (caps); + + return xingmux; +} + +void +cleanup_xingmux (GstElement * xingmux) +{ + GST_DEBUG ("cleanup_xingmux"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (xingmux); + gst_check_teardown_sink_pad (xingmux); + gst_check_teardown_element (xingmux); +} + +GST_START_TEST (test_xing_remux) +{ + GstElement *xingmux; + GstBuffer *inbuffer; + GList *it; + const guint8 *verify_data; + + xingmux = setup_xingmux (); + + fail_unless (gst_element_set_state (xingmux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_xing)); + gst_buffer_fill (inbuffer, 0, test_xing, sizeof (test_xing)); + + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 93); + + verify_data = test_xing; + for (it = buffers; it != NULL; it = it->next) { + GstBuffer *outbuffer = (GstBuffer *) it->data; + GstMapInfo map; + + gst_buffer_map (outbuffer, &map, GST_MAP_READ); + + if (it == buffers) { + gint j; + + /* Empty Xing header, should be the same as input data until the "Xing" marker + * and zeroes afterwards. */ + fail_unless (memcmp (map.data, test_xing, 25) == 0); + for (j = 26; j < map.size; j++) + fail_unless (map.data[j] == 0); + verify_data += map.size; + } else if (it->next != NULL) { + /* Should contain the raw MP3 data without changes */ + fail_unless (memcmp (map.data, verify_data, map.size) == 0); + verify_data += map.size; + } else { + /* Last buffer is the rewrite of the first buffer and should be exactly the same + * as the old Xing header we had */ + fail_unless (memcmp (test_xing, map.data, map.size) == 0); + } + gst_buffer_unmap (outbuffer, &map); + } + + /* cleanup */ + cleanup_xingmux (xingmux); +} + +GST_END_TEST; + +Suite * +xingmux_suite (void) +{ + Suite *s = suite_create ("xingmux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_xing_remux); + + return s; +} + +GST_CHECK_MAIN (xingmux); diff --git a/tests/check/elements/xingmux_testdata.h b/tests/check/elements/xingmux_testdata.h new file mode 100644 index 0000000000..2319ee222c --- /dev/null +++ b/tests/check/elements/xingmux_testdata.h @@ -0,0 +1,4777 @@ +static const guint8 test_xing[] = { +0xff, 0xfb, 0x30, 0xc4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x69, 0x6e, +0x67, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x5c, 0x00, 0x00, 0x95, 0x2e, 0x00, 0x03, 0x06, +0x09, 0x0c, 0x0f, 0x11, 0x14, 0x17, 0x1a, 0x1d, +0x1f, 0x1f, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x30, +0x33, 0x36, 0x39, 0x3b, 0x3b, 0x3e, 0x41, 0x44, +0x47, 0x49, 0x4c, 0x4f, 0x52, 0x55, 0x57, 0x57, +0x5a, 0x5d, 0x60, 0x63, 0x65, 0x68, 0x6b, 0x6e, +0x71, 0x73, 0x73, 0x76, 0x79, 0x7c, 0x7f, 0x81, +0x84, 0x87, 0x8a, 0x8d, 0x8f, 0x8f, 0x92, 0x95, +0x98, 0x9b, 0x9d, 0xa0, 0xa3, 0xa6, 0xa9, 0xab, +0xab, 0xae, 0xb1, 0xb4, 0xb7, 0xb9, 0xbc, 0xbf, +0xc2, 0xc5, 0xc7, 0xc7, 0xca, 0xcd, 0xd0, 0xd3, +0xd5, 0xd8, 0xdb, 0xde, 0xe1, 0xe3, 0xe3, 0xe6, +0xe9, 0xec, 0xef, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd, +0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xfb, 0x90, 0xc4, +0x00, 0x03, 0x8f, 0xd4, 0x59, 0x42, 0x6d, 0xe1, +0x27, 0x02, 0xde, 0x92, 0x67, 0x09, 0xed, 0x25, +0x29, 0x00, 0x00, 0x0a, 0x70, 0xcc, 0x4b, 0x4c, +0xac, 0xbc, 0xcc, 0x4a, 0xcc, 0xbd, 0x24, 0xd7, +0xce, 0xcc, 0xca, 0xa8, 0xf5, 0x2b, 0x8d, 0x80, +0xa8, 0xfd, 0x43, 0x9a, 0xc1, 0xcb, 0x43, 0x30, +0x10, 0xd0, 0x06, 0x91, 0x6a, 0x0e, 0xbb, 0xd9, +0x7b, 0x5c, 0x72, 0x1c, 0x87, 0x20, 0x0c, 0x02, +0x00, 0x80, 0x60, 0x50, 0x2b, 0x15, 0x8a, 0xc5, +0x62, 0xb2, 0x74, 0x68, 0xd1, 0xa0, 0x40, 0x81, +0x02, 0x04, 0x08, 0x18, 0x04, 0xc1, 0xf0, 0x7c, +0x1f, 0x07, 0xc1, 0x00, 0x40, 0x10, 0x04, 0x01, +0x30, 0x7c, 0x1f, 0x07, 0xc1, 0xf0, 0x40, 0x10, +0x04, 0x01, 0x03, 0x22, 0x70, 0xff, 0xe6, 0x4b, +0x87, 0xff, 0x97, 0x07, 0xc1, 0xfb, 0xbf, 0xc1, +0x00, 0x40, 0x10, 0x0c, 0x27, 0xfc, 0xb8, 0x3e, +0x0f, 0x83, 0xe1, 0xf0, 0x40, 0x10, 0x04, 0x01, +0x04, 0x89, 0xc1, 0xf0, 0x7e, 0xe2, 0x80, 0x80, +0x34, 0x60, 0x02, 0x05, 0x06, 0x08, 0xa0, 0xa0, +0x60, 0xba, 0x0f, 0x06, 0x11, 0xa0, 0xf8, 0x61, +0x0e, 0x25, 0x06, 0x51, 0xab, 0x64, 0x67, 0xb4, +0x1b, 0x66, 0x12, 0x01, 0x3a, 0x60, 0xf0, 0x0a, +0x26, 0x06, 0x20, 0x90, 0x70, 0x53, 0x1a, 0x38, +0x80, 0x12, 0x86, 0x3c, 0x51, 0x87, 0x0c, 0x61, +0x41, 0x18, 0x10, 0x00, 0x10, 0x05, 0xc1, 0x2f, +0x0a, 0x0e, 0xa4, 0x4a, 0x82, 0xaa, 0x55, 0x8a, +0xbb, 0x56, 0x15, 0x87, 0x33, 0xa6, 0x74, 0xe5, +0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x06, 0x04, +0x41, 0x10, 0x44, 0x11, 0x14, 0x8a, 0x45, 0x22, +0x91, 0x48, 0xa8, 0x54, 0x2a, 0x15, 0x13, 0x22, +0x44, 0x88, 0x89, 0x0a, 0x14, 0x28, 0x50, 0xa1, +0x42, 0x85, 0x0a, 0x24, 0x48, 0x91, 0x22, 0x44, +0x89, 0x12, 0x25, 0x41, 0x41, 0x41, 0x41, 0x42, +0x82, 0x82, 0x82, 0x82, 0x41, 0x41, 0x41, 0x41, +0x42, 0x82, 0x82, 0x82, 0x82, 0x41, 0x41, 0x41, +0x41, 0x42, 0x82, 0x82, 0x82, 0x82, 0x41, 0x41, +0x41, 0x41, 0x42, 0x82, 0x82, 0x82, 0x82, 0x41, +0x41, 0x41, 0x41, 0x42, 0x82, 0x82, 0x82, 0x82, +0x41, 0x41, 0x41, 0x41, 0x42, 0x82, 0x82, 0x82, +0x82, 0x41, 0x41, 0x41, 0x41, 0x42, 0x82, 0x82, +0x82, 0x82, 0x41, 0x41, 0x41, 0x41, 0x42, 0x95, +0x32, 0x88, 0xad, 0x32, 0xe4, 0xdc, 0x34, 0x09, +0x55, 0x36, 0xd6, 0x8e, 0x30, 0xf8, 0x87, 0xdd, +0x36, 0x72, 0xfd, 0x01, 0x36, 0x47, 0x87, 0xab, +0x30, 0xe7, 0xc2, 0x26, 0x30, 0x42, 0x80, 0x71, +0x30, 0x0e, 0xc0, 0x94, 0x36, 0xa3, 0x8c, 0xe3, +0x3b, 0x43, 0x5f, 0xa1, 0x8c, 0x50, 0x07, 0x43, +0x67, 0x16, 0x5d, 0xe2, 0x17, 0xf6, 0xbf, 0xdd, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xbf, 0xff, 0xe9, 0x30, 0x05, 0xc0, 0x37, 0x30, +0x1e, 0x80, 0x9e, 0x30, 0x3d, 0x41, 0x33, 0x30, +0x73, 0x82, 0x72, 0x31, 0x0c, 0xff, 0xfb, 0x92, +0xc4, 0x2a, 0x83, 0xc8, 0x60, 0x25, 0x16, 0x0e, +0xff, 0x82, 0x81, 0x27, 0x85, 0x22, 0xc1, 0xff, +0xec, 0x90, 0xc7, 0x7f, 0x36, 0xd8, 0xb9, 0x6d, +0x36, 0xaf, 0xc7, 0x81, 0x31, 0x13, 0x02, 0xaa, +0x30, 0x83, 0x41, 0xbb, 0x30, 0x49, 0x41, 0x3b, +0x30, 0x44, 0x81, 0x14, 0x30, 0x45, 0x41, 0xd5, +0x3a, 0xf8, 0xf3, 0x22, 0x06, 0x47, 0xf6, 0xb8, +0xff, 0xc3, 0x94, 0x99, 0x9c, 0xed, 0xfa, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xd6, 0x32, 0x84, 0xae, 0x32, 0xd8, 0xe3, +0x33, 0xed, 0x5e, 0x36, 0x9a, 0xa1, 0x30, 0xf0, +0xc8, 0x12, 0x36, 0x3e, 0x3e, 0x9e, 0x36, 0x14, +0xc7, 0xe2, 0x30, 0xdf, 0x02, 0x3d, 0x30, 0x3d, +0xc0, 0x84, 0x30, 0x12, 0x00, 0x87, 0x36, 0xfb, +0x60, 0xe4, 0x1a, 0x73, 0x62, 0x20, 0x4c, 0x56, +0x04, 0x43, 0x57, 0x1a, 0x5a, 0xb0, 0xe7, 0x52, +0x3d, 0x3f, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xa0, 0xc0, 0x26, 0x00, 0xe0, 0xc0, +0x97, 0x02, 0xbc, 0xc1, 0x22, 0x05, 0x50, 0xc2, +0x23, 0x0a, 0xdc, 0xc4, 0xea, 0x21, 0x18, 0xe0, +0x01, 0xfd, 0x18, 0xdf, 0x3e, 0x21, 0x28, 0xc5, +0x05, 0x0b, 0xec, 0xc2, 0x60, 0x07, 0xe0, 0xc1, +0x4e, 0x05, 0xb8, 0xc1, 0x35, 0x05, 0x1c, 0xc1, +0x34, 0x08, 0xa0, 0xf1, 0x2a, 0x8c, 0xac, 0x35, +0x00, 0x0c, 0xed, 0xd8, 0x87, 0xe9, 0xec, 0x3d, +0x5f, 0xea, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, +0xf7, 0xd7, 0xff, 0xff, 0xff, 0xf5, 0x26, 0x20, +0xa6, 0xa2, 0x99, 0x97, 0x1c, 0x9b, 0xd5, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x32, 0x20, 0x97, +0x32, 0x64, 0xc6, 0x33, 0x41, 0x39, 0x35, 0x86, +0x5a, 0x30, 0xca, 0x87, 0x43, 0x35, 0x4a, 0xf8, +0x53, 0x35, 0x27, 0x07, 0x17, 0x30, 0xbb, 0x42, +0x04, 0x30, 0x30, 0x80, 0x81, 0x30, 0x11, 0xc0, +0x68, 0x36, 0x42, 0xcc, 0xe0, 0x36, 0x03, 0x56, +0x9a, 0x00, 0x44, 0x54, 0xd6, 0x75, 0x67, 0x94, +0x12, 0xeb, 0xfa, 0x0c, 0x02, 0xf0, 0x0b, 0xcc, +0x09, 0xe0, 0x29, 0x0c, 0x12, 0xd0, 0x51, 0xcc, +0x23, 0x00, 0xa7, 0x0c, 0x50, 0x91, 0xff, 0x4e, +0x0c, 0x0f, 0x42, 0xcd, 0xff, 0xb2, 0x00, 0xcc, +0x52, 0x00, 0xb9, 0x8c, 0x26, 0x90, 0x7d, 0x4c, +0x14, 0xd0, 0x5c, 0xcc, 0x12, 0xc0, 0x53, 0x0c, +0x12, 0x90, 0x8d, 0xce, 0xf6, 0xc4, 0xc9, 0x83, +0x90, 0x7d, 0x9c, 0x3f, 0xf0, 0xe5, 0x25, 0xff, +0xfb, 0x92, 0xc4, 0xaa, 0x83, 0xc8, 0x18, 0x23, +0x16, 0x0e, 0xff, 0x82, 0x81, 0x2d, 0x85, 0x22, +0x81, 0xff, 0xec, 0x90, 0xbe, 0x5b, 0xbf, 0xff, +0xf6, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, +0xfa, 0x3f, 0xd1, 0xf6, 0xe8, 0x4c, 0x41, 0x4d, +0x45, 0x33, 0x2e, 0x39, 0x37, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x32, +0x1c, 0x98, 0x32, 0x50, 0xcb, 0x33, 0x25, 0x3e, +0x35, 0x4a, 0x6b, 0x30, 0xc3, 0x47, 0x6c, 0x35, +0x19, 0x39, 0x9a, 0x34, 0xf6, 0xc7, 0x42, 0x30, +0xb2, 0x82, 0x17, 0x30, 0x2c, 0x40, 0x90, 0x30, +0x14, 0x80, 0x5d, 0x36, 0x7a, 0xa0, 0xe1, 0x15, +0x33, 0x59, 0x19, 0x40, 0x44, 0xa4, 0xd5, 0x75, +0xa7, 0x56, 0x1c, 0xea, 0xfa, 0x7f, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x18, 0x07, +0x00, 0x12, 0x18, 0x14, 0xa0, 0x4d, 0x98, 0x26, +0x80, 0x9c, 0x18, 0x47, 0xa1, 0x41, 0x98, 0xa4, +0x83, 0xd7, 0x1c, 0x2e, 0xfd, 0x5c, 0x1c, 0x15, +0x83, 0xdc, 0x18, 0xa7, 0x21, 0x68, 0x98, 0x4d, +0x80, 0xf7, 0x18, 0x29, 0x00, 0xba, 0x18, 0x24, +0xa0, 0xaa, 0x98, 0x23, 0xc1, 0x21, 0x1d, 0x95, +0xa1, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, +0xc8, 0x23, 0x18, 0x0e, 0xff, 0x82, 0x81, 0x33, +0x05, 0x62, 0x81, 0xff, 0xec, 0x90, 0x92, 0x87, +0xa0, 0xe3, 0x3b, 0x76, 0x21, 0xfa, 0x7b, 0x0f, +0x56, 0x8f, 0xab, 0xfd, 0x54, 0x7f, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xd4, 0x98, +0x82, 0x9a, 0x8a, 0x66, 0x5c, 0x72, 0x6e, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0x32, 0x18, 0x99, 0x32, 0x44, 0xce, 0x33, +0x01, 0x47, 0x35, 0x16, 0x78, 0x30, 0xba, 0x87, +0x97, 0x34, 0xe5, 0x7a, 0xcf, 0x34, 0xc3, 0x87, +0x6d, 0x30, 0xaa, 0x42, 0x26, 0x30, 0x27, 0x00, +0xa1, 0x30, 0x17, 0x40, 0x4e, 0x36, 0xb2, 0x7c, +0xe1, 0xf4, 0x43, 0x5b, 0x97, 0x80, 0xc4, 0x94, +0xd6, 0x75, 0x67, 0x86, 0x13, 0xeb, 0xfa, 0x3f, +0xe8, 0x30, 0x10, 0x40, 0x1b, 0x30, 0x2b, 0x00, +0x90, 0x30, 0x4f, 0x41, 0x2b, 0x30, 0x92, 0x02, +0x68, 0x31, 0x4f, 0xc7, 0x5f, 0x38, 0x88, 0xb8, +0x4d, 0x38, 0x54, 0xc7, 0x6b, 0x31, 0x54, 0x02, +0xba, 0x30, 0x9c, 0xc1, 0xeb, 0x30, 0x51, 0x41, +0x79, 0x30, 0x46, 0x81, 0x5a, 0x30, 0x44, 0xc2, +0x4f, 0x3a, 0xbb, 0x93, 0x22, 0x10, 0x41, 0xf6, +0x70, 0xed, 0xc6, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xc7, 0xe4, 0x23, 0x18, 0x0e, 0xff, 0x82, +0x81, 0x2f, 0x05, 0x22, 0x81, 0xff, 0xec, 0x90, +0x29, 0x2d, 0xf2, 0xdd, 0xfe, 0x8f, 0xfb, 0x6f, +0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xd1, +0xfe, 0x8f, 0xb7, 0x42, 0x62, 0x0a, 0x6a, 0x29, +0x99, 0x71, 0xc9, 0xbd, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x32, 0x14, 0x98, 0x32, 0x30, +0xd3, 0x32, 0xe5, 0x4c, 0x34, 0xda, 0x85, 0x30, +0xb2, 0x47, 0xbc, 0x34, 0xae, 0xbb, 0xf0, 0x34, +0x8e, 0xc7, 0x94, 0x30, 0xa1, 0x02, 0x37, 0x30, +0x21, 0xc0, 0xae, 0x30, 0x19, 0x80, 0x43, 0x36, +0xea, 0x58, 0xe2, 0x93, 0x53, 0x5d, 0x16, 0xc0, +0xc4, 0xe4, 0xd5, 0x75, 0xa4, 0x2b, 0x67, 0x52, +0x0c, 0x05, 0x60, 0x05, 0x0c, 0x0d, 0x10, 0x27, +0x4c, 0x17, 0x40, 0x51, 0x0c, 0x2a, 0xb0, 0xa8, +0x4c, 0x61, 0x82, 0x02, 0x0e, 0x79, 0xbf, 0x50, +0x8e, 0x6a, 0x82, 0x06, 0x0c, 0x62, 0x90, 0xc1, +0xcc, 0x2d, 0x20, 0x8a, 0x8c, 0x17, 0x20, 0x6c, +0x8c, 0x13, 0xb0, 0x65, 0x4c, 0x12, 0xc0, 0xac, +0x8e, 0xf3, 0x68, 0xc9, 0xc5, 0xcb, 0xb8, 0xc3, +0xdd, 0x87, 0xfe, 0x5f, 0x60, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xc7, 0x00, 0x23, 0x18, 0x0e, +0xff, 0x82, 0x81, 0x36, 0x85, 0x62, 0x81, 0xff, +0xec, 0x90, 0xfa, 0xb2, 0x5f, 0x7f, 0xaf, 0xaa, +0x8f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xff, +0xef, 0xff, 0x7f, 0xa9, 0x31, 0x05, 0x35, 0x14, +0xcc, 0xb8, 0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x32, 0x08, 0x9b, +0x32, 0x1c, 0xd4, 0x32, 0xc1, 0x53, 0x34, 0x9e, +0x90, 0x30, 0xa9, 0x87, 0xe1, 0x34, 0x76, 0x7c, +0xff, 0x34, 0x57, 0x87, 0xb9, 0x30, 0x98, 0x42, +0x46, 0x30, 0x1c, 0x00, 0xbd, 0x30, 0x1c, 0x40, +0x34, 0x37, 0x22, 0x34, 0xe3, 0x72, 0x43, 0x5f, +0x95, 0x01, 0x45, 0x14, 0xba, 0x75, 0x67, 0xb0, +0x15, 0x67, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, +0x80, 0xbe, 0x00, 0x39, 0x81, 0xac, 0x04, 0x71, +0x82, 0xfa, 0x09, 0x99, 0x85, 0x6c, 0x14, 0x01, +0x8c, 0x66, 0x3d, 0x29, 0xd0, 0x8d, 0xd2, 0x39, +0xce, 0x9e, 0x3d, 0xc9, 0x8c, 0x80, 0x17, 0x51, +0x85, 0xae, 0x11, 0x19, 0x82, 0xda, 0x0d, 0xa9, +0x82, 0x60, 0x0c, 0xd1, 0x82, 0x3e, 0x15, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, 0xa8, 0x23, +0x18, 0x0e, 0xff, 0x82, 0xa1, 0x3a, 0x05, 0x22, +0x41, 0xff, 0xec, 0x90, 0xf9, 0xd8, 0xf0, 0x99, +0x20, 0xc1, 0x77, 0xd8, 0x63, 0xb7, 0x0c, 0x4b, +0x2d, 0xb9, 0x6f, 0x91, 0xfb, 0xbd, 0x5d, 0x74, +0xff, 0xff, 0xff, 0xff, 0xef, 0x5b, 0x5d, 0xff, +0xff, 0x77, 0xfb, 0xbd, 0x69, 0x88, 0x29, 0xa8, +0xa6, 0x65, 0xc7, 0x26, 0xea, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x32, +0x04, 0x9a, 0x32, 0x08, 0xd7, 0x32, 0xa5, 0x58, +0x34, 0x52, 0x9d, 0x30, 0xa0, 0x48, 0x02, 0x34, +0x3b, 0xbd, 0xfa, 0x34, 0x1e, 0xc7, 0xda, 0x30, +0x8e, 0x02, 0x55, 0x30, 0x16, 0xc0, 0xca, 0x30, +0x1e, 0x80, 0x25, 0x37, 0x5a, 0x00, 0xe4, 0x11, +0x53, 0x60, 0x13, 0xc1, 0x45, 0x24, 0xb9, 0x75, +0xa4, 0x21, 0x76, 0x7a, 0x01, 0xc0, 0x78, 0x18, +0x20, 0x20, 0x4b, 0x98, 0x37, 0xc0, 0xa6, 0x18, +0x65, 0x21, 0x5b, 0x98, 0xe5, 0xc4, 0x21, 0x1d, +0xd2, 0xbf, 0x6c, 0x1d, 0xae, 0xc4, 0x2e, 0x18, +0xe7, 0x61, 0x9b, 0x98, 0x68, 0x41, 0x35, 0x18, +0x33, 0x80, 0xfc, 0x18, 0x2a, 0x20, 0xef, 0x98, +0x27, 0x01, 0x98, 0x1b, 0x02, 0x0c, 0x62, 0x91, +0x09, 0x67, 0x16, 0x1d, 0xac, 0x3f, 0xf1, 0xbb, +0x0f, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc8, +0x54, 0x25, 0x18, 0x0e, 0xff, 0x82, 0xa1, 0x3f, +0x05, 0x22, 0x41, 0xff, 0xec, 0x90, 0x53, 0xa1, +0xef, 0xbf, 0xd7, 0xfe, 0xef, 0xff, 0x5f, 0xd9, +0xfb, 0xff, 0xdf, 0x5a, 0x3e, 0xff, 0x57, 0x7f, +0xfb, 0xdd, 0xd4, 0x98, 0x82, 0x9a, 0x8a, 0x66, +0x5c, 0x72, 0x6f, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x31, 0xf8, 0x9b, 0x31, 0xf4, 0xd8, 0x32, +0x79, 0x5f, 0x34, 0x16, 0xa6, 0x30, 0x96, 0x88, +0x23, 0x33, 0xff, 0x7e, 0xe3, 0x33, 0xe3, 0x07, +0xfb, 0x30, 0x84, 0x42, 0x62, 0x30, 0x10, 0x00, +0xd9, 0x30, 0x20, 0xc0, 0x14, 0x37, 0x81, 0xdc, +0xe4, 0xb0, 0x23, 0x62, 0x92, 0x01, 0xc5, 0x54, +0xba, 0x79, 0x64, 0x41, 0x06, 0xdb, 0x5a, 0x46, +0x81, 0x06, 0x30, 0x41, 0x80, 0x86, 0x30, 0x71, +0xc1, 0x37, 0x30, 0xcd, 0x02, 0x8c, 0x31, 0xd2, +0x47, 0xc9, 0x3b, 0xce, 0xbb, 0x2b, 0x3b, 0x86, +0x47, 0xe5, 0x31, 0xd3, 0x83, 0x14, 0x30, 0xd1, +0x42, 0x61, 0x30, 0x65, 0xc1, 0xf9, 0x30, 0x50, +0x81, 0xe4, 0x30, 0x49, 0xc3, 0x3b, 0x35, 0xac, +0x2c, 0xc4, 0x82, 0x22, 0xd5, 0xae, 0x46, 0xb6, +0xfa, 0x4b, 0x2d, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xc6, 0xa8, 0x23, 0x18, 0x0e, 0xff, 0x82, +0xa1, 0x46, 0x85, 0x22, 0x01, 0xff, 0xf0, 0x90, +0xb8, 0xae, 0x47, 0xe3, 0x7d, 0x5d, 0x76, 0xfd, +0x8f, 0xf7, 0x7f, 0x7f, 0xfb, 0xbf, 0xb1, 0xd5, +0x7f, 0xf5, 0xf7, 0x7f, 0xbb, 0xd6, 0x98, 0x82, +0x9a, 0x8a, 0x66, 0x5c, 0x72, 0x6e, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x31, 0xf4, 0x9a, 0x31, 0xe0, +0xdd, 0x32, 0x55, 0x62, 0x33, 0xca, 0xb1, 0x30, +0x8c, 0xc8, 0x3e, 0x33, 0xbf, 0xbf, 0xb8, 0x33, +0xa5, 0x48, 0x18, 0x30, 0x79, 0x82, 0x6f, 0x30, +0x09, 0x40, 0xe4, 0x30, 0x23, 0x00, 0x03, 0x37, +0xa9, 0xa8, 0xe5, 0x4f, 0x13, 0x63, 0x10, 0xc2, +0x0a, 0xc9, 0x72, 0xf3, 0x48, 0x42, 0xec, 0xf4, +0x18, 0x14, 0x40, 0x03, 0x98, 0x27, 0x20, 0x45, +0x98, 0x42, 0x00, 0xa5, 0x18, 0x76, 0xe1, 0x5d, +0x99, 0x0d, 0x44, 0x28, 0x1e, 0xcf, 0x7f, 0x86, +0x1e, 0xa5, 0x44, 0x3a, 0x19, 0x0d, 0xa1, 0xaf, +0x98, 0x77, 0xc1, 0x56, 0x18, 0x39, 0x41, 0x22, +0x18, 0x2c, 0x61, 0x18, 0x98, 0x27, 0x81, 0xdf, +0x18, 0x18, 0x40, 0x9c, 0x18, 0x05, 0x20, 0x15, +0x82, 0x00, 0x04, 0x02, 0x6e, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xc6, 0xc8, 0x23, 0x18, 0x0e, +0xff, 0x82, 0xa1, 0x46, 0x85, 0x22, 0x01, 0xff, +0xf0, 0x90, 0x15, 0x01, 0x2f, 0x1e, 0xe5, 0x03, +0x76, 0xab, 0xce, 0xb3, 0x7c, 0x77, 0xf4, 0xaa, +0x95, 0xaf, 0xb7, 0xa6, 0xff, 0xec, 0xfb, 0xaa, +0xfa, 0xb7, 0x3e, 0x84, 0x7a, 0x9f, 0xd0, 0x9e, +0xff, 0xa7, 0x7f, 0xa9, 0x31, 0x05, 0x35, 0x14, +0xcc, 0xb8, 0xe4, 0xde, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x31, 0x98, 0x85, +0x31, 0x84, 0xbe, 0x31, 0xd9, 0x37, 0x33, 0x06, +0x60, 0x30, 0x71, 0x87, 0x51, 0x33, 0x10, 0x78, +0x9d, 0x32, 0xfa, 0x07, 0x31, 0x30, 0x60, 0xc2, +0x2a, 0x30, 0x00, 0x00, 0xcf, 0x1e, 0x03, 0xf8, +0xdb, 0x05, 0x13, 0x83, 0xb0, 0x0d, 0x5e, 0x30, +0x0c, 0x22, 0xa9, 0x27, 0x96, 0x7b, 0x02, 0x26, +0x05, 0x58, 0x03, 0x46, 0x09, 0xf0, 0x0e, 0xc6, +0x10, 0xc8, 0x25, 0xe6, 0x1e, 0x00, 0x51, 0x06, +0x44, 0x18, 0xf7, 0x67, 0xb8, 0xc7, 0x51, 0x27, +0xae, 0x28, 0xfc, 0x66, 0x44, 0x00, 0x66, 0x86, +0x1e, 0x08, 0x53, 0xe6, 0x0e, 0x18, 0x48, 0xa6, +0x0a, 0x80, 0x46, 0xc6, 0x09, 0x38, 0x79, 0x26, +0xb1, 0x9e, 0x98, 0x90, 0x58, 0x0d, 0x02, 0xa9, +0x43, 0x2b, 0x7d, 0x23, 0x13, 0xf6, 0x3a, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, 0xa4, 0x23, +0x18, 0x0e, 0xff, 0x82, 0xa1, 0x7a, 0x87, 0xa1, +0xc1, 0xff, 0xb4, 0x98, 0x05, 0xd8, 0xcf, 0x1b, +0xfe, 0xb6, 0xa3, 0xec, 0x7f, 0xff, 0xeb, 0xfd, +0x8d, 0xeb, 0xda, 0xea, 0xfe, 0x87, 0x7d, 0x75, +0x9c, 0xe9, 0x59, 0xf1, 0xd7, 0x74, 0x2d, 0x31, +0x05, 0x35, 0x14, 0xcc, 0xb8, 0xe4, 0xde, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x31, +0x94, 0x82, 0x31, 0x70, 0xc1, 0x31, 0xb5, 0x3a, +0x32, 0xc2, 0x69, 0x30, 0x68, 0x47, 0x64, 0x32, +0xd3, 0xb9, 0x38, 0x32, 0xbf, 0x47, 0x44, 0x30, +0x56, 0x82, 0x35, 0x10, 0x01, 0xb4, 0x10, 0x08, +0x61, 0xb7, 0x48, 0x87, 0x08, 0x57, 0x9a, 0xc0, +0x56, 0x1c, 0x46, 0x54, 0x2f, 0x34, 0xee, 0x75, +0x18, 0x1a, 0x00, 0x1b, 0x98, 0x2f, 0x20, 0x39, +0x98, 0x4e, 0x00, 0x9e, 0x18, 0x8a, 0xe1, 0x55, +0x99, 0x39, 0x84, 0x0f, 0x1f, 0xec, 0x7e, 0xa7, +0x1f, 0xbb, 0x44, 0x29, 0x19, 0x38, 0xe1, 0xbc, +0x98, 0x89, 0x01, 0x77, 0x18, 0x3f, 0x41, 0x4c, +0x18, 0x2d, 0xe1, 0x46, 0x98, 0x27, 0x02, 0x2f, +0x18, 0x17, 0x40, 0xb8, 0x18, 0x04, 0xe0, 0x1b, +0x83, 0x00, 0x08, 0x03, 0x2c, 0x26, 0x82, 0x4e, +0x39, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, +0x4c, 0x25, 0x1a, 0x0e, 0xff, 0x82, 0xa9, 0x69, +0x85, 0xa1, 0xc1, 0xff, 0xf0, 0x90, 0xc9, 0x43, +0xed, 0x49, 0x4d, 0x9d, 0xff, 0xd4, 0xea, 0xfd, +0xd5, 0xfd, 0xd8, 0xe7, 0x7d, 0x48, 0xff, 0x5f, +0xf4, 0xff, 0xe5, 0x5e, 0x96, 0xfc, 0xff, 0xf5, +0x7f, 0xfd, 0xdb, 0x4d, 0xfd, 0x17, 0xd3, 0xe8, +0xbf, 0xef, 0xfd, 0x07, 0xfd, 0x3a, 0x4f, 0xb2, +0xbf, 0xfe, 0x09, 0xa9, 0x4c, 0x41, 0x4d, 0x45, +0x33, 0x2e, 0x39, 0x37, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0x31, 0x88, 0x83, 0x31, 0x5c, 0xc0, 0x31, +0x91, 0x3f, 0x32, 0x7e, 0x6e, 0x30, 0x5e, 0x07, +0x79, 0x32, 0x95, 0x79, 0xc1, 0x32, 0x82, 0x07, +0x59, 0x30, 0x4c, 0x42, 0x3c, 0x30, 0x04, 0xc0, +0xe3, 0x30, 0x23, 0x40, 0x07, 0x37, 0x00, 0xec, +0xe1, 0xa9, 0xc3, 0x59, 0x89, 0x04, 0x89, 0x2a, +0x89, 0xed, 0x93, 0xe0, 0x44, 0xc0, 0xdb, 0x01, +0x20, 0xc1, 0x7e, 0x01, 0x60, 0xc2, 0x77, 0x04, +0x6c, 0xc4, 0x60, 0x09, 0xb0, 0xc9, 0xe3, 0x1d, +0x94, 0xff, 0xf0, 0xde, 0xe4, 0xfe, 0x65, 0x1e, +0x74, 0xc9, 0xd6, 0x0d, 0x18, 0xc4, 0x47, 0x0b, +0x7c, 0xc1, 0xef, 0x0a, 0x5c, 0xc1, 0x5a, 0x0a, +0x48, 0xc1, 0x1d, 0x11, 0xa4, 0xc0, 0xa7, 0x05, +0xd4, 0xc0, 0x20, 0x00, 0xe0, 0x2a, 0x00, 0x48, +0x0e, 0xc0, 0x9b, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xc6, 0x24, 0x25, 0x1a, 0x0e, 0xff, 0x82, +0xa9, 0xbb, 0xb3, 0x61, 0x81, 0xf6, 0x89, 0xb8, +0x89, 0x20, 0xe4, 0x29, 0x9e, 0x4a, 0x8f, 0x9c, +0xd7, 0xfd, 0x68, 0x27, 0xfb, 0x69, 0xff, 0x5d, +0xad, 0xff, 0xd9, 0xed, 0xfb, 0xbf, 0xff, 0xff, +0xa7, 0xcb, 0xdb, 0xd7, 0xfe, 0xfd, 0x2c, 0xdd, +0x7e, 0xba, 0xd6, 0xdf, 0xa7, 0xcf, 0xd4, 0x46, +0x8a, 0x06, 0x9f, 0xc6, 0x5f, 0x4a, 0xd3, 0x10, +0x53, 0x51, 0x4c, 0xcb, 0x8e, 0x4d, 0xea, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x31, 0x84, 0x82, 0x31, 0x40, +0xc3, 0x31, 0x6d, 0x40, 0x32, 0x32, 0x75, 0x30, +0x54, 0x47, 0x88, 0x32, 0x53, 0xba, 0x3a, 0x32, +0x42, 0x47, 0x6a, 0x30, 0x41, 0x02, 0x45, 0x30, +0x0b, 0x00, 0xec, 0x30, 0x24, 0x80, 0x16, 0x37, +0x28, 0xb8, 0xe1, 0xc8, 0xb3, 0x59, 0x07, 0xc4, +0x89, 0x4a, 0x85, 0xee, 0x93, 0x66, 0x58, 0xa9, +0xc8, 0x0c, 0x07, 0xc0, 0x0a, 0xcc, 0x0d, 0xd0, +0x06, 0x4c, 0x16, 0xe0, 0x21, 0x8c, 0x29, 0x30, +0x4f, 0xcc, 0x5d, 0xe0, 0xf9, 0x0e, 0x64, 0x37, +0x66, 0x8e, 0x55, 0x41, 0x02, 0x8c, 0x5d, 0x50, +0x71, 0xce, 0x7e, 0x67, 0x0d, 0x12, 0x5f, 0x0c, +0xb5, 0x5f, 0x4c, 0x8c, 0xa6, 0x0c, 0x4a, 0x34, +0x8c, 0x03, 0x05, 0xd2, 0xd1, 0xb9, 0xbe, 0x92, +0xb9, 0x7d, 0x8b, 0xff, 0x4f, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xc6, 0x78, 0x25, 0x1a, 0x0e, +0xff, 0x82, 0xa9, 0xb2, 0x2c, 0x21, 0x81, 0xf6, +0x89, 0xb8, 0x5e, 0xfa, 0x3a, 0x51, 0x51, 0xe4, +0xaa, 0x8e, 0xa5, 0x29, 0x20, 0x30, 0x71, 0x3f, +0xff, 0xff, 0xff, 0x7f, 0xff, 0xd5, 0xff, 0xef, +0xff, 0xfa, 0x93, 0x10, 0x53, 0x51, 0x4c, 0xcb, +0x8e, 0x4d, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x31, 0x70, 0x81, +0x31, 0x34, 0xc2, 0x31, 0x39, 0x43, 0x31, 0xee, +0x78, 0x30, 0x49, 0x07, 0x97, 0x32, 0x0f, 0x7a, +0xa3, 0x31, 0xff, 0x07, 0x79, 0x30, 0x35, 0xc2, +0x4c, 0x30, 0x10, 0xc0, 0xf7, 0x30, 0x26, 0x40, +0x25, 0x37, 0x40, 0x84, 0xe2, 0x27, 0x63, 0x5a, +0x86, 0x05, 0x89, 0x2a, 0xb9, 0xed, 0x93, 0xd8, +0x22, 0x60, 0x67, 0x80, 0xb4, 0x60, 0xac, 0x00, +0x2c, 0x61, 0x18, 0x81, 0x66, 0x61, 0xf1, 0x03, +0x50, 0x64, 0x64, 0x8a, 0x36, 0x7c, 0x75, 0x4c, +0xc2, 0x7b, 0xc4, 0x8a, 0xb2, 0x64, 0x5a, 0x04, +0xf8, 0x61, 0xdc, 0x84, 0xc2, 0x60, 0xcc, 0x84, +0x7e, 0x60, 0x82, 0x04, 0x84, 0x60, 0x61, 0x87, +0xd6, 0x66, 0x9a, 0x49, 0x83, 0x05, 0xc2, 0x30, +0x2a, 0xc0, 0x34, 0xb8, 0x02, 0x31, 0x3f, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0x46, 0x78, 0x25, +0x1a, 0x0e, 0xff, 0x82, 0xa9, 0x5a, 0x0c, 0xa2, +0x9d, 0xfe, 0x88, 0xe0, 0x7b, 0xa0, 0x1a, 0x99, +0xeb, 0x2f, 0xdc, 0x37, 0xad, 0x28, 0xbf, 0xfe, +0xff, 0xef, 0xff, 0x3b, 0xfe, 0xea, 0xbe, 0xb7, +0x7d, 0x3b, 0xbe, 0xfd, 0xdd, 0x0b, 0x4c, 0x41, +0x4d, 0x45, 0x33, 0x2e, 0x39, 0x37, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0x16, 0xc0, 0x80, 0x30, 0x11, 0x80, 0xc3, 0x30, +0x11, 0x41, 0x44, 0x30, 0x19, 0x02, 0x7d, 0x30, +0x3d, 0xc7, 0xa2, 0x31, 0xc6, 0xba, 0xfa, 0x36, +0xe1, 0x78, 0x63, 0x0a, 0x22, 0x55, 0x30, 0x58, +0x0f, 0xe3, 0x09, 0xe0, 0x30, 0x30, 0xeb, 0x01, +0x23, 0x11, 0x20, 0x63, 0x3b, 0x61, 0x11, 0xa4, +0xa5, 0x5a, 0xf7, 0x49, 0xad, 0xe6, 0xcf, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xd2, 0x60, 0x6a, 0x00, 0xd2, 0x18, +0x15, 0xf9, 0x84, 0x6c, 0x04, 0x71, 0x87, 0xce, +0x0b, 0x49, 0x91, 0xa4, 0x22, 0xf1, 0xf2, 0x6f, +0x05, 0x61, 0xef, 0xa0, 0x25, 0x11, 0x91, 0x7a, +0x12, 0x59, 0x87, 0x64, 0x12, 0x71, 0x83, 0x1c, +0x11, 0xd1, 0x81, 0xde, 0x12, 0x29, 0x81, 0x48, +0x1f, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, +0x7c, 0x25, 0x1a, 0x0e, 0xff, 0x82, 0xa9, 0x60, +0x85, 0xa1, 0xc1, 0xff, 0xf0, 0x90, 0x71, 0x95, +0x29, 0x46, 0x07, 0x17, 0x8a, 0x01, 0x16, 0x0d, +0xb8, 0x40, 0x72, 0xf9, 0xce, 0xb9, 0x92, 0xbf, +0x21, 0xec, 0x66, 0x60, 0x87, 0xea, 0xf7, 0xfd, +0x3f, 0xbb, 0xff, 0x7e, 0x5a, 0xbf, 0xcb, 0xff, +0xa7, 0xef, 0x74, 0x4d, 0xf6, 0x50, 0x98, 0x82, +0x9a, 0x8a, 0x66, 0x5c, 0x72, 0x6f, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x15, 0x80, 0x7f, 0x30, 0x10, 0x40, +0xc2, 0x30, 0x0e, 0x01, 0x47, 0x30, 0x14, 0x42, +0x80, 0x30, 0x31, 0x87, 0xad, 0x31, 0x7a, 0x7b, +0x41, 0x35, 0xb4, 0x79, 0x13, 0x06, 0xd2, 0x5a, +0x30, 0x6b, 0x10, 0x73, 0x0a, 0x50, 0x3d, 0x30, +0xee, 0x00, 0x53, 0x11, 0x50, 0x4c, 0x3b, 0x70, +0xa1, 0xe4, 0xd5, 0x5c, 0xf6, 0xc9, 0xec, 0x60, +0xde, 0xa3, 0x03, 0x74, 0x07, 0x43, 0x05, 0x88, +0x00, 0x33, 0x08, 0xec, 0x06, 0x93, 0x0f, 0xa8, +0x12, 0x43, 0x23, 0x6c, 0x39, 0x53, 0xe5, 0xc1, +0xa9, 0x33, 0xe0, 0x2c, 0x3e, 0x13, 0x23, 0x00, +0x21, 0x63, 0x0e, 0xbc, 0x23, 0xb3, 0x06, 0x0c, +0x23, 0x73, 0x03, 0x60, 0x24, 0x63, 0x02, 0x1c, +0x3f, 0x33, 0x1f, 0xd3, 0x40, 0x02, 0xe1, 0x90, +0x2a, 0xc8, 0x6e, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xc8, 0x7c, 0x27, 0x1a, 0x0f, 0xfb, 0x64, +0xa1, 0x58, 0x05, 0x61, 0xc1, 0xff, 0xf0, 0x90, +0x70, 0x44, 0xb2, 0x7e, 0xf6, 0x65, 0x5f, 0x60, +0xaf, 0x5b, 0xfd, 0x7d, 0x68, 0xfd, 0xbf, 0x6f, +0xff, 0xa3, 0x6b, 0xbf, 0xa9, 0xd4, 0xfd, 0x0e, +0xfa, 0xb7, 0x7d, 0xef, 0x8d, 0xbb, 0x5a, 0x62, +0x0a, 0x6a, 0x29, 0x99, 0x71, 0xc9, 0xba, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x24, 0x40, 0x00, 0x62, +0xf2, 0x51, 0x87, 0x0f, 0x66, 0x15, 0x6a, 0x18, +0x73, 0x56, 0x60, 0x2c, 0x8a, 0x5c, 0x61, 0x8b, +0x50, 0x70, 0x61, 0x7c, 0x8a, 0x34, 0x60, 0x0a, +0x03, 0x26, 0x60, 0x26, 0x01, 0x58, 0x60, 0x35, +0x00, 0x4c, 0x36, 0x64, 0x76, 0x43, 0x60, 0xee, +0x52, 0x62, 0x26, 0xa3, 0x27, 0xbd, 0x98, 0x5b, +0xdb, 0xf7, 0x7f, 0xa8, 0xc0, 0xe4, 0x02, 0x0c, +0xc1, 0x67, 0x00, 0x80, 0xc2, 0x3c, 0x00, 0xf8, +0xc3, 0xef, 0x03, 0x74, 0xc8, 0xe0, 0x0a, 0xe8, +0xf9, 0x9d, 0x4f, 0xb0, 0xf8, 0x32, 0x0c, 0x40, +0xc8, 0xc3, 0x07, 0x7c, 0xc3, 0xa6, 0x08, 0xa0, +0xc1, 0x74, 0x08, 0xc8, 0xcc, 0x39, 0x1c, 0xc6, +0x6f, 0xd8, 0xc2, 0x65, 0x30, 0x1a, 0x18, 0x90, +0x00, 0x8b, 0x6d, 0xb8, 0x41, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xc7, 0x10, 0x27, 0x1a, 0x0f, +0xfb, 0x64, 0xa1, 0x60, 0x85, 0xa1, 0xc1, 0xff, +0xf0, 0x90, 0x72, 0xf9, 0xcb, 0xfc, 0xfd, 0x7f, +0x3f, 0xf1, 0xfd, 0xff, 0xdb, 0xff, 0x7f, 0x5b, +0x02, 0xdd, 0x66, 0xaf, 0xff, 0xf5, 0xb2, 0xcc, +0x9f, 0xf6, 0x16, 0xa9, 0x9f, 0x4f, 0xb1, 0xfa, +0x7f, 0x3b, 0x27, 0xf6, 0x50, 0x98, 0x82, 0x9a, +0x8a, 0x66, 0x5c, 0x72, 0x6f, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x20, 0x00, 0x03, +0x14, 0x07, 0xd3, 0x0c, 0xcc, 0x23, 0x08, 0x14, +0x73, 0x07, 0xe8, 0x43, 0x01, 0x58, 0x7b, 0x93, +0x0c, 0xb7, 0xb9, 0xb3, 0x0c, 0x20, 0x79, 0xf3, +0x00, 0x08, 0x26, 0x43, 0x02, 0x44, 0x11, 0x53, +0x02, 0xc4, 0x05, 0x31, 0x2f, 0x21, 0xc6, 0x43, +0x40, 0xeb, 0x91, 0x11, 0x35, 0x5a, 0x9f, 0x29, +0x3d, 0x80, 0x8f, 0xb3, 0xe2, 0x73, 0x03, 0xac, +0x08, 0xe3, 0x05, 0xa8, 0x03, 0xd3, 0x08, 0xfc, +0x00, 0xb3, 0x0f, 0xc0, 0x08, 0xa3, 0x23, 0x94, +0x1c, 0x53, 0xe6, 0xd8, 0xc6, 0x53, 0xe1, 0x34, +0x22, 0xd3, 0x23, 0x08, 0x1a, 0x43, 0x0e, 0x7c, +0x21, 0x53, 0x05, 0x9c, 0x22, 0xd3, 0x02, 0xa8, +0x24, 0x63, 0x01, 0x14, 0x3f, 0x93, 0x05, 0xd3, +0xc5, 0x06, 0x04, 0xa0, 0x55, 0xb0, 0xdc, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0x47, 0x18, 0x25, +0x20, 0xce, 0x7f, 0x62, 0xa1, 0x70, 0x8f, 0x61, +0xc1, 0xfe, 0x89, 0x28, 0xe4, 0x93, 0x93, 0xf7, +0x8d, 0x86, 0xff, 0xa7, 0xa2, 0xee, 0xd7, 0xbf, +0xd6, 0x8f, 0xff, 0xff, 0x52, 0xb6, 0x69, 0xa1, +0x1b, 0x7e, 0x8f, 0xd9, 0x46, 0xfd, 0x28, 0x6a, +0x19, 0xe4, 0xd3, 0x10, 0x53, 0x51, 0x4c, 0xcb, +0x8e, 0x4d, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x30, +0x13, 0x40, 0x7a, 0x30, 0x0b, 0x00, 0xc3, 0x30, +0x04, 0xc1, 0x46, 0x30, 0x00, 0x02, 0x85, 0x30, +0x03, 0x47, 0xbc, 0x30, 0x5e, 0xbb, 0xac, 0x31, +0x5b, 0x7a, 0x23, 0x04, 0xf2, 0x69, 0x30, 0xa0, +0x11, 0xc3, 0x0b, 0x40, 0x5c, 0x30, 0xf5, 0x00, +0x30, 0x51, 0x18, 0x8b, 0xb8, 0x93, 0x27, 0x28, +0xc3, 0xe7, 0x20, 0xb7, 0x9b, 0x3a, 0xc8, 0x24, +0x80, 0xc0, 0x5e, 0x00, 0xdc, 0xc0, 0x99, 0x00, +0x58, 0x30, 0x1f, 0x13, 0x06, 0xfc, 0x00, 0x33, +0x10, 0x10, 0x03, 0x63, 0x69, 0xac, 0x11, 0x43, +0x67, 0x10, 0x07, 0x43, 0x0f, 0xcc, 0x09, 0x53, +0xca, 0x36, 0x8d, 0x1c, 0xec, 0x31, 0x9b, 0xec, +0x09, 0xc2, 0x2a, 0xa2, 0x0b, 0x00, 0x76, 0xa9, +0x06, 0xcc, 0x5d, 0xb7, 0x7b, 0xbf, 0xff, 0xff, +0x8c, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0x47, +0x10, 0x25, 0x1a, 0x4e, 0xff, 0x82, 0xa1, 0x5f, +0x05, 0x61, 0xc1, 0xff, 0xf0, 0x90, 0x43, 0x22, +0x97, 0xe8, 0x11, 0x5c, 0xaf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xa5, 0x31, 0x05, 0x35, 0x14, +0xcc, 0xb8, 0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x12, 0x00, 0x79, 0x30, 0x09, 0x40, +0xc0, 0x30, 0x01, 0x01, 0x47, 0x0b, 0x05, 0x0c, +0x60, 0x12, 0x8f, 0x7a, 0x60, 0x83, 0x77, 0x5e, +0x62, 0x2e, 0xf4, 0xa6, 0x11, 0x04, 0xd8, 0x61, +0x62, 0x24, 0x66, 0x17, 0x20, 0xce, 0x61, 0xec, +0x02, 0x40, 0x62, 0x33, 0x27, 0x73, 0x2b, 0x26, +0x51, 0x97, 0xb2, 0x47, 0x63, 0x06, 0xf5, 0x30, +0xc0, 0xd5, 0x02, 0x30, 0xc1, 0x40, 0x01, 0x64, +0xc1, 0xf9, 0x00, 0xc8, 0xc3, 0x72, 0x00, 0xac, +0xc7, 0xcb, 0x03, 0x38, 0xf2, 0xac, 0x23, 0x08, +0xf1, 0x6f, 0x01, 0x08, 0xc7, 0xa4, 0x04, 0x00, +0xf1, 0x96, 0xa4, 0xd1, 0xf7, 0x6c, 0xc6, 0x47, +0xe0, 0x93, 0x79, 0x30, 0x19, 0x23, 0x15, 0x09, +0x89, 0x00, 0x15, 0x3a, 0x7a, 0xe4, 0x94, 0x97, +0xef, 0x76, 0x5f, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x82, 0x46, 0xe8, 0x27, 0x1a, 0x0f, 0xfb, 0x64, +0xa1, 0x22, 0x0a, 0x63, 0x5d, 0xfe, 0x08, 0xe0, +0x7f, 0xfe, 0x3b, 0x77, 0x3b, 0xae, 0x9f, 0xdd, +0xee, 0xff, 0xff, 0xfd, 0xfb, 0xaa, 0xfd, 0xdf, +0x46, 0xef, 0xbf, 0xfa, 0xd3, 0x10, 0x53, 0x51, +0x4c, 0xcb, 0x8e, 0x4d, 0xd5, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x30, 0x11, 0x40, 0x76, 0x30, +0x07, 0x00, 0xc1, 0x11, 0x82, 0x8c, 0x60, 0x0b, +0x85, 0x0a, 0x60, 0x34, 0x0f, 0x78, 0x61, 0x6a, +0xf7, 0x40, 0x65, 0xa8, 0xf4, 0x86, 0x17, 0xa4, +0xde, 0x61, 0x80, 0x25, 0x06, 0x17, 0x80, 0xdc, +0x61, 0xee, 0x04, 0x26, 0x23, 0x00, 0x34, 0x1e, +0xe0, 0x4c, 0x9e, 0xad, 0x0f, 0x7c, 0x82, 0xde, +0x67, 0x3a, 0xcc, 0x0f, 0xc0, 0x2c, 0x4c, 0x17, +0x50, 0x1f, 0x8c, 0x24, 0x20, 0x1a, 0x4c, 0x3e, +0xf0, 0x25, 0x0c, 0x8e, 0x00, 0x81, 0xcf, 0x9a, +0x34, 0x7a, 0x4f, 0x83, 0x60, 0x64, 0x4c, 0x8b, +0x10, 0x38, 0xcc, 0x38, 0x00, 0x74, 0x0c, 0x13, +0xa0, 0x86, 0x8c, 0x05, 0x90, 0x90, 0x4c, 0x01, +0xf0, 0xfd, 0x8c, 0x53, 0x4e, 0x06, 0x0c, 0x47, +0x40, 0xca, 0x3a, 0xf4, 0x49, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0x46, 0xc4, 0x27, 0x1a, 0x0f, +0xfb, 0x64, 0xa1, 0x40, 0x8a, 0xa2, 0x05, 0xfe, +0x88, 0xe0, 0x65, 0xf4, 0x57, 0xdc, 0xf9, 0x47, +0xfa, 0x19, 0xa6, 0xdd, 0xe8, 0xba, 0x9d, 0x7e, +0xff, 0xf2, 0x9a, 0x7f, 0xfa, 0x34, 0xed, 0x6d, +0x9f, 0xdf, 0xd3, 0xf9, 0xeb, 0x7e, 0x7a, 0x94, +0xc4, 0x14, 0xd4, 0x53, 0x32, 0xe3, 0x93, 0x75, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x30, 0x10, 0x00, +0x73, 0x30, 0x05, 0x40, 0xbe, 0x11, 0x82, 0x8e, +0x60, 0x18, 0x05, 0x08, 0x60, 0x50, 0x8f, 0x72, +0x62, 0x27, 0x77, 0x02, 0x68, 0x86, 0xf4, 0x26, +0x1d, 0xc4, 0xe0, 0x61, 0xa2, 0x25, 0xe6, 0x18, +0x20, 0xf2, 0x61, 0xf0, 0x05, 0x86, 0x23, 0x20, +0x6a, 0x07, 0x73, 0x22, 0x4c, 0x56, 0xb7, 0xb2, +0x47, 0x39, 0x81, 0xfe, 0xaf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, +0x06, 0x08, 0x18, 0x17, 0x46, 0x0b, 0xb0, 0x12, +0x66, 0x12, 0x18, 0x11, 0xc6, 0x1f, 0x60, 0x1c, +0xa6, 0x46, 0xc8, 0x5e, 0x87, 0xcb, 0xe3, 0x18, +0x47, 0xc0, 0x88, 0x51, 0x06, 0x45, 0x30, 0x12, +0x86, 0x1b, 0xa8, 0x37, 0x26, 0x09, 0x58, 0x42, +0x66, 0x01, 0xc0, 0x47, 0xc6, 0x02, 0x30, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc6, 0xe8, 0x27, +0x1a, 0x0f, 0xfb, 0x64, 0xa1, 0x61, 0x05, 0x61, +0xc1, 0xff, 0xf0, 0x90, 0x7e, 0x66, 0x3e, 0xa6, +0x98, 0x04, 0x60, 0x30, 0x05, 0x5b, 0x4f, 0x5c, +0x7a, 0x92, 0x8e, 0xf3, 0xdd, 0x2e, 0xaf, 0x49, +0xde, 0x96, 0x73, 0xab, 0xfa, 0x91, 0xff, 0xff, +0xf2, 0xaa, 0xfd, 0xa8, 0xff, 0x31, 0xfb, 0xa8, +0xf4, 0xa7, 0x5b, 0x7c, 0x36, 0x98, 0x82, 0x9a, +0x8a, 0x66, 0x5c, 0x72, 0x6e, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0xf4, 0x70, 0x30, 0x30, 0xbd, 0x30, 0x09, 0x44, +0x31, 0x26, 0x83, 0x30, 0x35, 0x07, 0xb2, 0x31, +0x68, 0x7b, 0x50, 0x31, 0x62, 0x87, 0x9c, 0x30, +0x46, 0xc2, 0x71, 0x30, 0x37, 0x81, 0x34, 0x30, +0x31, 0x00, 0x80, 0x37, 0xc8, 0xec, 0xe3, 0x04, +0xc3, 0x5b, 0x01, 0x08, 0x89, 0xea, 0xb1, 0xef, +0x90, 0x4f, 0x83, 0x9e, 0xdf, 0xff, 0xd4, 0x60, +0x83, 0x01, 0x8a, 0x60, 0xbb, 0x81, 0x48, 0x61, +0x20, 0x01, 0x66, 0x61, 0xf4, 0x82, 0x58, 0x64, +0x68, 0x07, 0x92, 0x7c, 0xa2, 0xbd, 0xfe, 0x7b, +0xec, 0x06, 0xc6, 0x64, 0x4c, 0x80, 0x72, 0x61, +0xb3, 0x03, 0x40, 0x60, 0x8d, 0x04, 0x10, 0x60, +0x0a, 0x84, 0x76, 0x60, 0x34, 0x87, 0xdc, 0x65, +0x5a, 0x51, 0x81, 0x85, 0xe2, 0xa0, 0x45, 0x92, +0xf4, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc8, +0x6c, 0x27, 0x1a, 0x0f, 0xfb, 0x64, 0xa1, 0x5e, +0x05, 0x61, 0xc1, 0xff, 0xf0, 0x90, 0x47, 0x67, +0xe8, 0xaf, 0xf1, 0x38, 0x65, 0xbd, 0x63, 0x3d, +0x7c, 0xb7, 0xf6, 0xfd, 0xdf, 0xff, 0xef, 0xfd, +0x4d, 0xff, 0x59, 0xbe, 0x8f, 0x7f, 0xef, 0x77, +0xcb, 0x26, 0x20, 0xa6, 0xa2, 0x99, 0x97, 0x1c, +0x9b, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x00, 0x82, 0x60, 0x00, 0x61, 0xc2, 0x08, +0x34, 0xe8, 0x60, 0x36, 0x89, 0x8d, 0xb5, 0x06, +0x05, 0x38, 0xa4, 0xe6, 0x24, 0xd4, 0xfe, 0xa6, +0x24, 0x28, 0xa3, 0x26, 0x06, 0x90, 0x33, 0xc6, +0x04, 0xb8, 0x19, 0x66, 0x03, 0xf8, 0x0a, 0xa7, +0x3c, 0x48, 0x76, 0x67, 0x20, 0x2e, 0x72, 0x22, +0x06, 0xa7, 0x20, 0x9f, 0xb0, 0x09, 0xff, 0xee, +0xff, 0x5a, 0x10, 0x60, 0x85, 0x81, 0x9c, 0x60, +0xbc, 0x01, 0x6e, 0x61, 0x1f, 0x81, 0xa8, 0x61, +0xf2, 0x02, 0xe2, 0x64, 0x62, 0x89, 0x20, 0x7c, +0x7e, 0x49, 0x98, 0x7b, 0xc9, 0x88, 0x58, 0x64, +0x44, 0x00, 0x3e, 0x61, 0xac, 0x83, 0x0e, 0x60, +0x85, 0x84, 0x02, 0x42, 0x11, 0xb1, 0x81, 0x10, +0x1f, 0x59, 0x9a, 0xa9, 0x66, 0x0d, 0x17, 0x08, +0x80, 0xab, 0x29, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xc6, 0xfc, 0x25, 0x1a, 0x0e, 0xff, 0x82, +0x81, 0x55, 0x05, 0xa1, 0xc1, 0xff, 0xf0, 0x90, +0xf1, 0x8f, 0x58, 0xa3, 0xbc, 0xf7, 0x4b, 0xa3, +0xe7, 0x7d, 0x9c, 0x9d, 0xc9, 0xea, 0xff, 0xfa, +0x7e, 0x77, 0x47, 0xf6, 0x23, 0x6f, 0xd1, 0xf7, +0x68, 0xfd, 0x1a, 0x3c, 0xcd, 0x29, 0x88, 0x29, +0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xea, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x30, 0xcc, 0x6a, 0x04, 0x17, 0x26, +0x10, 0x28, 0x06, 0x39, 0xcf, 0xa6, 0x09, 0x80, +0xf4, 0x06, 0x3f, 0xff, 0x57, 0x86, 0x3e, 0xc0, +0xf1, 0x86, 0x0b, 0x78, 0x4e, 0x66, 0x07, 0xc0, +0x27, 0xc6, 0x06, 0x60, 0x12, 0x46, 0xf9, 0x28, +0x9c, 0x50, 0xec, 0x6b, 0x40, 0xa0, 0xd1, 0x2d, +0x56, 0x3c, 0xf2, 0x09, 0x78, 0x61, 0x82, 0x1c, +0x06, 0xb9, 0x82, 0xf2, 0x06, 0x41, 0x84, 0x78, +0x07, 0x99, 0x87, 0xbe, 0x0d, 0x71, 0x91, 0x6c, +0x2a, 0x59, 0xf1, 0x4b, 0x52, 0x49, 0xee, 0x74, +0x27, 0x59, 0x90, 0xee, 0x04, 0x01, 0x86, 0x90, +0x0b, 0x51, 0x81, 0xf0, 0x0f, 0xb1, 0x80, 0x30, +0x11, 0x89, 0x81, 0x4e, 0x1f, 0x11, 0x80, 0xfa, +0x0a, 0x41, 0x80, 0x24, 0x01, 0x78, 0x84, 0x00, +0x40, 0x6e, 0x8b, 0x22, 0x69, 0xff, 0xfb, 0x90, +0xc4, 0xff, 0x82, 0x47, 0x3c, 0x25, 0x20, 0xce, +0x7f, 0x62, 0xa1, 0x56, 0x05, 0x61, 0xc1, 0xff, +0xf0, 0x90, 0xf2, 0xc3, 0xed, 0x7f, 0x39, 0x3f, +0xff, 0x5b, 0xf5, 0x53, 0xf7, 0x75, 0xff, 0xdd, +0x67, 0xef, 0xfe, 0xc6, 0x7f, 0x9b, 0xf4, 0xf7, +0xfa, 0x97, 0xaf, 0xcb, 0x26, 0x20, 0xa6, 0xa2, +0x99, 0x97, 0x1c, 0x9b, 0xd5, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x30, 0x0b, 0x80, 0x69, +0x15, 0x02, 0xd8, 0xc0, 0x2d, 0x04, 0xfc, 0xc0, +0x86, 0x09, 0xe0, 0xc1, 0x5d, 0x1e, 0x4c, 0xc9, +0x14, 0xe9, 0x64, 0xe3, 0x9d, 0xe0, 0x4c, 0x65, +0x09, 0xc0, 0xc4, 0x1c, 0x50, 0xcc, 0x33, 0xc2, +0x6c, 0xc3, 0xe0, 0x16, 0x8c, 0x44, 0xc2, 0x2c, +0xec, 0xc6, 0xc5, 0x92, 0x15, 0x1b, 0xc9, 0x17, +0x96, 0x60, 0x7e, 0xdf, 0xe8, 0x30, 0x44, 0xc0, +0xe0, 0x30, 0x5e, 0x00, 0xd9, 0x30, 0x8e, 0xc1, +0x10, 0x30, 0xf5, 0x81, 0xeb, 0x32, 0x29, 0x45, +0xfa, 0x3e, 0x0e, 0xaf, 0x7c, 0x3d, 0xb5, 0x45, +0x9c, 0x32, 0x18, 0x80, 0xd1, 0x30, 0xce, 0x41, +0x4f, 0x30, 0x39, 0xc1, 0xed, 0x30, 0x0f, 0x42, +0x2a, 0x30, 0x30, 0x83, 0xdd, 0x30, 0x24, 0x01, +0x45, 0x30, 0x06, 0x40, 0x2e, 0x0b, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc6, 0x74, 0x25, 0x1a, +0x0e, 0xff, 0x82, 0xa9, 0x66, 0x07, 0xa1, 0xc1, +0xff, 0xb4, 0x98, 0x00, 0x0a, 0x0d, 0xe1, 0xa4, +0x9c, 0x78, 0xb4, 0xf3, 0xdb, 0xce, 0xdd, 0xe8, +0xee, 0x57, 0x5d, 0x1f, 0xfd, 0xff, 0xd3, 0x63, +0xff, 0xfb, 0xf7, 0x7a, 0xed, 0xff, 0xcc, 0x7e, +0xfd, 0xfd, 0x09, 0x88, 0x29, 0xa8, 0xa6, 0x65, +0xc7, 0x26, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x0a, +0x40, 0x64, 0x1d, 0x02, 0xcc, 0xc0, 0x38, 0x04, +0xe8, 0xc0, 0x99, 0x09, 0xcc, 0xc1, 0x84, 0x1e, +0x10, 0xca, 0x1d, 0xe7, 0x90, 0xe7, 0x99, 0xdc, +0x8c, 0x6e, 0xc9, 0xbc, 0xc4, 0x48, 0x51, 0x8c, +0x34, 0x82, 0x80, 0xc3, 0xe4, 0x19, 0x4c, 0x44, +0x02, 0x70, 0xec, 0x88, 0x84, 0x92, 0xd5, 0x03, +0xcf, 0x14, 0x97, 0xd7, 0x39, 0x66, 0x83, 0x05, +0x08, 0x10, 0xd3, 0x06, 0xcc, 0x10, 0xc3, 0x0a, +0x20, 0x15, 0xd3, 0x11, 0x64, 0x27, 0x23, 0x27, +0x10, 0x79, 0x53, 0xfe, 0x0f, 0xbc, 0x13, 0xf7, +0xb0, 0x72, 0xb3, 0x25, 0xd4, 0x14, 0x23, 0x0e, +0x68, 0x16, 0x03, 0x03, 0xc8, 0x22, 0x63, 0x01, +0xb0, 0x27, 0x53, 0x04, 0x04, 0x45, 0xe3, 0x02, +0xf4, 0x17, 0x23, 0x00, 0x98, 0x03, 0x90, 0x68, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc7, 0x20, +0x27, 0x1a, 0x0f, 0xfb, 0x64, 0x81, 0x61, 0x87, +0xa1, 0xc1, 0xff, 0xb4, 0x98, 0x01, 0x00, 0x64, +0x89, 0xb1, 0x34, 0xa6, 0x51, 0x3e, 0xce, 0xed, +0xce, 0x27, 0xd3, 0xd3, 0x4f, 0x65, 0xf4, 0xea, +0x21, 0xde, 0xdf, 0x5e, 0x53, 0x7f, 0xaf, 0xee, +0x44, 0x5c, 0xb6, 0xd7, 0x58, 0xaa, 0x5f, 0xf7, +0xd3, 0xf6, 0x58, 0xa4, 0x7b, 0xe8, 0x4c, 0x41, +0x4d, 0x45, 0x33, 0x2e, 0x39, 0x37, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0x30, 0x07, 0x00, 0x53, 0x0b, 0x01, 0x2c, 0x60, +0x1c, 0x82, 0x1e, 0x60, 0x49, 0x04, 0x3c, 0x60, +0xba, 0x8d, 0x0e, 0x64, 0xdd, 0x64, 0xbe, 0x73, +0x0e, 0xcf, 0x26, 0x34, 0x04, 0x38, 0x61, 0xf2, +0x23, 0xa6, 0x16, 0xe1, 0x22, 0x61, 0xa8, 0x0b, +0x86, 0x1d, 0x61, 0x2e, 0x72, 0xe3, 0xe2, 0xc6, +0x8b, 0x3e, 0x04, 0x97, 0xce, 0x60, 0x7f, 0xfe, +0x83, 0x04, 0x6c, 0x0f, 0x03, 0x05, 0xe0, 0x0f, +0x93, 0x08, 0xcc, 0x14, 0xa3, 0x0f, 0x10, 0x25, +0xb3, 0x21, 0xec, 0x74, 0x63, 0xdc, 0xe3, 0x93, +0x83, 0xd7, 0x5c, 0x6e, 0xa3, 0x20, 0xc0, 0x15, +0x93, 0x0c, 0x4c, 0x11, 0x53, 0x02, 0xfc, 0x1d, +0x53, 0x01, 0xe4, 0x21, 0xc3, 0x03, 0xd8, 0x3c, +0x93, 0x02, 0xc8, 0x13, 0xf3, 0x00, 0x94, 0x02, +0xc0, 0x60, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc7, 0x10, 0x27, 0x1a, 0x0f, 0xfb, 0x64, 0xa1, +0x8a, 0x07, 0x61, 0x81, 0xff, 0xb4, 0x98, 0x00, +0xa0, 0xea, 0x18, 0xa4, 0xe3, 0xc6, 0xc7, 0x9d, +0xd9, 0xf9, 0xd2, 0x9e, 0x87, 0x7f, 0xd4, 0xea, +0x75, 0xfb, 0x99, 0xfc, 0xb6, 0x8d, 0xdf, 0xec, +0xb7, 0xdd, 0xff, 0xf4, 0x3b, 0xed, 0xff, 0xa1, +0x31, 0x05, 0x35, 0x14, 0xcc, 0xb8, 0xe4, 0xde, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x30, 0x07, 0xc0, 0x5e, 0x30, 0x00, +0xc0, 0xad, 0x30, 0x13, 0x81, 0x34, 0x30, 0x2f, +0x42, 0x67, 0x30, 0x74, 0x07, 0x60, 0x33, 0x03, +0x78, 0xca, 0x3b, 0xca, 0x75, 0x23, 0x20, 0x12, +0x69, 0x31, 0x2a, 0x14, 0xc3, 0x0d, 0x60, 0xae, +0x30, 0xf5, 0x07, 0x73, 0x10, 0xc0, 0xc0, 0x3a, +0xe2, 0xe0, 0xe4, 0x75, 0x20, 0xf3, 0xc5, 0x25, +0xf5, 0xf0, 0xa8, 0x27, 0x12, 0xd6, 0x60, 0x43, +0x00, 0xea, 0x60, 0x5b, 0x80, 0xf4, 0x60, 0x8a, +0x01, 0x5a, 0x60, 0xf2, 0x82, 0x8c, 0x62, 0x29, +0x08, 0x1e, 0x6e, 0x3b, 0xc0, 0x6e, 0x6d, 0xe0, +0x07, 0xc2, 0x62, 0x15, 0x81, 0x8c, 0x78, 0x23, +0x81, 0x92, 0x9c, 0x06, 0x3e, 0x84, 0x9a, 0x07, +0xcc, 0x65, 0x74, 0xb1, 0x82, 0x01, 0x2a, 0xdc, +0xfa, 0xcd, 0x6e, 0xdd, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc7, 0x10, 0x27, 0x1c, 0x0f, 0xfb, +0x64, 0xb1, 0x69, 0x07, 0x61, 0xc1, 0xff, 0xb4, +0x98, 0x9e, 0xfe, 0xdc, 0x14, 0xff, 0xbe, 0x39, +0x08, 0xe2, 0x29, 0x32, 0x50, 0x9a, 0x03, 0x83, +0xc0, 0xc4, 0xb4, 0xa9, 0x9f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xe9, 0x4c, 0x41, 0x4d, 0x45, 0x33, +0x2e, 0x39, 0x37, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x08, 0x00, 0x6b, +0x30, 0x04, 0x00, 0xc6, 0x30, 0x1a, 0xc1, 0x5f, +0x30, 0x3b, 0x02, 0xb8, 0x30, 0x8f, 0xc8, 0x53, +0x33, 0xb1, 0x3f, 0xf3, 0x3e, 0x73, 0x84, 0x33, +0x27, 0x22, 0xbe, 0x31, 0x65, 0x18, 0x13, 0x0f, +0xb0, 0xd3, 0x31, 0x1a, 0x09, 0x63, 0x13, 0x30, +0xf3, 0x3c, 0x73, 0xf0, 0x85, 0x44, 0xcf, 0x75, +0x22, 0xf1, 0x4a, 0x43, 0xf6, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xdb, 0xa0, 0xc0, 0xf9, 0x03, 0x70, 0xc1, 0x44, +0x03, 0xc4, 0xc1, 0xe1, 0x05, 0x30, 0xc3, 0x36, +0x09, 0x9c, 0xc7, 0x41, 0x1d, 0xa8, 0xef, 0x5e, +0xe8, 0x68, 0xee, 0x2d, 0x1c, 0x68, 0xc6, 0xfa, +0x06, 0x54, 0xc2, 0x8d, 0x02, 0xd4, 0xc0, 0x7f, +0x06, 0x0c, 0xc0, 0x95, 0x07, 0x28, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x82, 0x47, 0x18, 0x29, 0x1a, +0x0f, 0xfb, 0x64, 0xa1, 0x4d, 0x0a, 0x63, 0x29, +0xfe, 0x08, 0xe0, 0xc1, 0x00, 0x0c, 0xec, 0xd6, +0x90, 0xf3, 0x12, 0x88, 0x8b, 0x52, 0xb9, 0xa1, +0x9a, 0xd7, 0xad, 0x71, 0xe9, 0xad, 0x1e, 0x8f, +0xf8, 0x6f, 0xf5, 0xff, 0xff, 0xf4, 0xe8, 0xff, +0x5e, 0xd7, 0x79, 0x0f, 0x77, 0x47, 0xe8, 0x4c, +0x41, 0x4d, 0x45, 0x33, 0x2e, 0x39, 0x37, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x06, +0xc0, 0x66, 0x30, 0x06, 0xc0, 0xc3, 0x30, 0x1d, +0x01, 0x58, 0x30, 0x3f, 0xc2, 0xb1, 0x30, 0x99, +0x88, 0x36, 0x33, 0xf1, 0x7f, 0x22, 0x3f, 0x6c, +0x82, 0x83, 0x29, 0x72, 0xb9, 0x31, 0x70, 0x18, +0x43, 0x0f, 0xc0, 0xda, 0x31, 0x19, 0x09, 0xf3, +0x12, 0xe1, 0x04, 0x3c, 0x44, 0x40, 0x85, 0x74, +0xb8, 0x75, 0xe2, 0x91, 0x7a, 0xf8, 0x3d, 0x5b, +0x3f, 0xff, 0x51, 0x81, 0xf4, 0x07, 0x19, 0x82, +0x86, 0x07, 0xe1, 0x83, 0xb4, 0x0b, 0x19, 0x86, +0x5a, 0x14, 0x81, 0x8e, 0x4c, 0x3f, 0x49, 0xdd, +0x77, 0xee, 0x99, 0xdb, 0x18, 0x3c, 0xd9, 0x8d, +0xba, 0x0e, 0x31, 0x84, 0xf0, 0x04, 0xb1, 0x80, +0xd4, 0x0b, 0xa1, 0x81, 0x50, 0x0e, 0x19, 0x82, +0x2a, 0x19, 0x81, 0xb0, 0xe1, 0x46, 0x28, 0x11, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc8, 0xb8, +0x27, 0x18, 0x0f, 0xfb, 0x64, 0x81, 0x41, 0x05, +0x62, 0x01, 0xff, 0xf0, 0x90, 0x96, 0x79, 0x72, +0xc3, 0x55, 0x6f, 0xd9, 0x34, 0x9d, 0x87, 0xfc, +0x77, 0x7a, 0x9f, 0x96, 0xff, 0xff, 0xfb, 0xbf, +0xdf, 0xff, 0xab, 0xf7, 0xff, 0xbf, 0xfd, 0x69, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xf5, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x30, 0x04, 0x80, 0x63, 0x30, 0x08, 0x80, 0xbc, +0x30, 0x20, 0x41, 0x53, 0x30, 0x44, 0x02, 0xa6, +0x30, 0xa3, 0x48, 0x1b, 0x34, 0x2e, 0xbe, 0x3f, +0x34, 0x16, 0xc8, 0x0d, 0x30, 0xae, 0x82, 0xb2, +0x30, 0x5e, 0xc1, 0x87, 0x30, 0x3f, 0xc0, 0xe1, +0x30, 0x45, 0x00, 0xa8, 0x30, 0x4a, 0xc1, 0x15, +0x3c, 0x14, 0xb0, 0x72, 0x82, 0x5d, 0xba, 0x91, +0x78, 0xa5, 0x26, 0x6c, 0x5e, 0xdf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xd6, 0x60, 0x6d, 0x81, 0x90, 0x60, 0x8b, 0x01, +0xc6, 0x60, 0xcc, 0x82, 0x88, 0x61, 0x5d, 0x04, +0xc2, 0x63, 0x16, 0x8e, 0xb0, 0x74, 0x34, 0x72, +0xd0, 0x73, 0xb2, 0x8e, 0x28, 0x62, 0xf4, 0x03, +0x6a, 0x61, 0x0b, 0x80, 0xca, 0x60, 0x23, 0x82, +0x72, 0x60, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc7, 0x94, 0x29, 0x18, 0x0f, 0xfb, 0x64, 0x81, +0x3f, 0x05, 0x22, 0x01, 0xff, 0xf0, 0x90, 0x51, +0x83, 0x00, 0x60, 0x7f, 0x05, 0x7a, 0x76, 0x5c, +0x66, 0x4a, 0x30, 0x5d, 0xd6, 0x1d, 0x0c, 0xe5, +0xcb, 0x4e, 0xed, 0x77, 0x8d, 0xf5, 0xf5, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0xfb, 0xbd, 0x1d, +0xdf, 0xff, 0xff, 0xad, 0x31, 0x05, 0x35, 0x14, +0xcc, 0xb8, 0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x30, 0x02, 0xc0, 0x5c, 0x30, 0x0b, +0x40, 0xb9, 0x30, 0x22, 0x81, 0x4c, 0x30, 0x48, +0x42, 0x9b, 0x30, 0xac, 0x07, 0xfa, 0x34, 0x69, +0xfd, 0x48, 0x34, 0x50, 0x07, 0xee, 0x30, 0xb7, +0x42, 0xad, 0x30, 0x61, 0x81, 0x86, 0x30, 0x3f, +0x80, 0xe8, 0x30, 0x44, 0xc0, 0xb3, 0x30, 0x49, +0x01, 0x24, 0x3b, 0xc5, 0x00, 0x52, 0x9a, 0x5c, +0x3a, 0xf0, 0xe4, 0x5e, 0xb8, 0x46, 0xca, 0xbf, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x81, +0xb4, 0x06, 0x79, 0x82, 0x2a, 0x07, 0x61, 0x83, +0x24, 0x0a, 0xb9, 0x85, 0x5e, 0x14, 0x21, 0x8c, +0x20, 0x3d, 0xf9, 0xcf, 0x83, 0xe3, 0x69, 0xcd, +0x80, 0x3b, 0xd9, 0x8b, 0x96, 0x0e, 0xd1, 0x84, +0x08, 0x02, 0x21, 0x80, 0x64, 0x09, 0x71, 0x81, +0x64, 0x0b, 0xc9, 0x82, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc9, 0x1c, 0x29, 0x18, 0x0f, 0xff, +0x64, 0x81, 0x37, 0x85, 0x22, 0x41, 0xff, 0xec, +0x90, 0x1e, 0x15, 0x81, 0xde, 0xef, 0x19, 0x30, +0xc9, 0x72, 0x98, 0x6c, 0x6b, 0x79, 0x59, 0xef, +0x52, 0x7d, 0x3f, 0x67, 0xdd, 0xff, 0xff, 0xff, +0xff, 0x47, 0xff, 0xff, 0xa5, 0x31, 0x05, 0x35, +0x14, 0xcc, 0xb8, 0xe4, 0xdd, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x30, 0x00, 0x80, 0x59, +0x30, 0x0d, 0x00, 0xb4, 0x30, 0x25, 0x41, 0x47, +0x30, 0x4c, 0x02, 0x90, 0x30, 0xb4, 0xc7, 0xd9, +0x34, 0xa2, 0xbc, 0x3f, 0x34, 0x87, 0xc7, 0xcf, +0x30, 0xbf, 0x02, 0xa4, 0x30, 0x64, 0x41, 0x89, +0x30, 0x40, 0x40, 0xef, 0x30, 0x43, 0x80, 0xba, +0x30, 0x48, 0x41, 0x35, 0x3b, 0xb5, 0x70, 0x52, +0x62, 0x6b, 0xb8, 0x90, 0xfc, 0x52, 0x93, 0x37, +0x2f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, 0x37, 0x40, +0xd2, 0x30, 0x44, 0x00, 0xf7, 0x30, 0x62, 0xc1, +0x68, 0x30, 0xa8, 0x82, 0xa5, 0x31, 0x7d, 0x48, +0x20, 0x39, 0xc3, 0x3f, 0x54, 0x39, 0x83, 0xc7, +0xde, 0x31, 0x6b, 0x02, 0x01, 0x30, 0x7c, 0x40, +0x21, 0x30, 0x06, 0xc1, 0x21, 0x30, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc8, 0x94, 0x27, 0x18, +0x0f, 0xff, 0x64, 0x81, 0x24, 0x85, 0x62, 0x41, +0xff, 0xec, 0x90, 0x31, 0x41, 0x6e, 0x30, 0x47, +0x82, 0xa5, 0x3c, 0x6d, 0x93, 0x2b, 0x16, 0x2e, +0x4b, 0x0e, 0x8c, 0xeb, 0x1b, 0x47, 0x7b, 0x9d, +0xe3, 0x7f, 0xf4, 0xfd, 0x9d, 0x1f, 0xff, 0xff, +0xf5, 0xfe, 0xbe, 0xef, 0xf7, 0x7f, 0xff, 0xfe, +0xb4, 0xc4, 0x14, 0xd4, 0x53, 0x32, 0xe3, 0x93, +0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x04, 0x80, +0xa4, 0x60, 0x1e, 0x81, 0x5e, 0x60, 0x4f, 0x02, +0x80, 0x60, 0xa0, 0x85, 0x06, 0x61, 0x7a, 0x0f, +0x64, 0x69, 0xb2, 0xf6, 0x44, 0x69, 0x79, 0x0f, +0x54, 0x61, 0x8d, 0x85, 0x3a, 0x60, 0xcc, 0x03, +0x10, 0x60, 0x80, 0x01, 0xe4, 0x60, 0x86, 0x81, +0x86, 0x60, 0x8d, 0x02, 0x88, 0x76, 0xcb, 0x80, +0x64, 0xb4, 0xd4, 0x71, 0xe1, 0xc8, 0xbd, 0x38, +0x66, 0xca, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x49, 0x97, +0xc5, 0xc9, 0x9d, 0x66, 0xe1, 0xaa, 0x4a, 0x39, +0xc8, 0x33, 0x51, 0x8a, 0x38, 0x3b, 0x99, 0xc3, +0x3f, 0xd0, 0x69, 0xc1, 0x84, 0x39, 0xc9, 0x89, +0xb6, 0x0e, 0xf0, 0x90, 0x67, 0x80, 0x00, 0x3b, +0x8c, 0xb6, 0x4d, 0xcd, 0x07, 0x90, 0x8c, 0xb5, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc9, 0x20, +0x29, 0x18, 0x0f, 0xff, 0x64, 0x81, 0x3a, 0x05, +0x22, 0x41, 0xff, 0xec, 0x90, 0x2d, 0x8c, 0x24, +0x04, 0x50, 0x79, 0x9c, 0xc6, 0x84, 0xc1, 0xbf, +0x4f, 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0x4a, 0x62, 0x0a, 0x6a, 0x29, 0x99, +0x71, 0xc9, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0x11, 0x00, 0x9a, 0x60, 0x22, 0x01, 0x50, 0x60, +0x53, 0x82, 0x72, 0x60, 0xa7, 0x04, 0xec, 0x61, +0x8a, 0x8f, 0x1a, 0x6a, 0x1b, 0x73, 0xe6, 0x69, +0xe0, 0x8f, 0x0a, 0x61, 0x9c, 0x05, 0x24, 0x60, +0xd1, 0x83, 0x12, 0x60, 0x80, 0x81, 0xf2, 0x60, +0x84, 0x01, 0x94, 0x60, 0x8a, 0x82, 0xaa, 0x76, +0x2c, 0x20, 0x64, 0x84, 0xd7, 0x71, 0x21, 0xf8, +0xa5, 0x26, 0x75, 0xed, 0xfb, 0xff, 0xd7, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, +0x66, 0x5f, 0x97, 0x86, 0x73, 0x1c, 0xa6, 0xa5, +0xaa, 0x87, 0x1a, 0x50, 0xe6, 0x28, 0x08, 0xf8, +0x47, 0x07, 0x57, 0x8c, 0xc7, 0x00, 0x98, 0xf1, +0x06, 0x25, 0xd0, 0x3f, 0xe6, 0x0c, 0x68, 0x01, +0x43, 0x00, 0x72, 0x99, 0x86, 0x97, 0x1a, 0x25, +0x1b, 0x99, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc9, 0x14, 0x27, 0x18, 0x0f, 0xff, 0x64, 0x80, +0xfc, 0x04, 0x62, 0x81, 0xdf, 0xf4, 0x50, 0x78, +0x59, 0x98, 0x4e, 0x07, 0x20, 0x05, 0x9d, 0x46, +0x7c, 0x16, 0x77, 0xbb, 0xff, 0xff, 0xec, 0xff, +0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfb, 0xbe, 0x9f, +0xff, 0xf5, 0xa6, 0x20, 0xa6, 0xa2, 0x99, 0x97, +0x1c, 0x9b, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x24, 0x01, 0x18, 0xc0, 0x4b, 0x02, +0x8c, 0xc0, 0xb0, 0x04, 0xc0, 0xc1, 0x5d, 0x09, +0xa4, 0xc3, 0x34, 0x1d, 0x88, 0xd5, 0x01, 0xe2, +0xc8, 0xd4, 0x84, 0x1d, 0x70, 0xc3, 0x57, 0x0a, +0x24, 0xc1, 0xaa, 0x06, 0x20, 0xc1, 0x00, 0x03, +0xf8, 0xc1, 0x05, 0x03, 0x4c, 0xc1, 0x0e, 0x05, +0x88, 0xeb, 0x19, 0x80, 0x48, 0xe9, 0xa8, 0xe3, +0xc3, 0x92, 0xfa, 0x73, 0x96, 0x55, 0xf4, 0x7f, +0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xa4, 0xcb, 0xe2, 0xfc, 0xce, 0x53, +0xa8, 0xd4, 0x45, 0x84, 0xe2, 0x7a, 0x80, 0xc4, +0xe2, 0x20, 0x3c, 0xe0, 0x2b, 0xfa, 0x9c, 0xdf, +0x58, 0x1f, 0x54, 0xc4, 0x9b, 0x08, 0x68, 0xc1, +0x78, 0x00, 0xb4, 0xc0, 0x09, 0x03, 0x60, 0xcd, +0x04, 0x9c, 0xd1, 0xf8, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc9, 0x0c, 0x29, 0x18, 0x0f, 0xff, +0x64, 0x81, 0x13, 0x04, 0xa2, 0x81, 0xdf, 0xf4, +0x50, 0xa0, 0xcc, 0x52, 0xb8, 0xc2, 0xa0, 0x3d, +0x00, 0x4d, 0x76, 0x34, 0xa0, 0xdf, 0xa7, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xd9, 0xf4, +0xff, 0xa5, 0x31, 0x05, 0x35, 0x14, 0xcc, 0xb8, +0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x0b, 0x80, 0x9e, 0x60, +0x31, 0x01, 0x6c, 0x60, 0x6b, 0x82, 0xaa, 0x60, +0xd0, 0x05, 0x60, 0x61, 0xe6, 0x90, 0x76, 0x6c, +0x65, 0x7e, 0x22, 0x6c, 0x1b, 0x90, 0x6e, 0x61, +0xf7, 0x05, 0xb4, 0x60, 0xf9, 0x83, 0x86, 0x60, +0x94, 0x82, 0x56, 0x60, 0x93, 0x01, 0xf8, 0x60, +0x98, 0x83, 0x4e, 0x78, 0x6f, 0xe6, 0x54, 0x04, +0x8e, 0x6d, 0x71, 0xff, 0x87, 0x29, 0x33, 0x38, +0xbd, 0xbf, 0x7f, 0xfa, 0xe8, 0xff, 0xff, 0xff, +0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xac, 0xca, +0x32, 0x98, 0xcc, 0x23, 0x44, 0xd1, 0x34, 0xf8, +0xdd, 0x49, 0x84, 0xc4, 0x2b, 0x1d, 0x40, 0xdb, +0x8a, 0xe3, 0x98, 0xda, 0xd5, 0x1c, 0x78, 0xc3, +0xea, 0x07, 0xbc, 0xc1, 0x37, 0x00, 0xf0, 0xc0, +0x16, 0x02, 0xbc, 0xd7, 0xef, 0x63, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc9, 0x18, 0x27, 0x18, +0x0f, 0xff, 0x64, 0x81, 0x08, 0x04, 0x62, 0x81, +0xdf, 0xf4, 0x50, 0x81, 0x75, 0x4d, 0x60, 0x91, +0x31, 0x18, 0x21, 0x1f, 0x5a, 0xf4, 0xb4, 0xa8, +0x33, 0xe8, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xe8, 0x4c, 0x41, 0x4d, 0x45, +0x33, 0x2e, 0x39, 0x37, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x30, 0x00, +0x00, 0x48, 0x30, 0x1a, 0x40, 0xb1, 0x30, 0x38, +0x01, 0x4c, 0x30, 0x6b, 0xc2, 0x9f, 0x30, 0xfb, +0x08, 0x06, 0x36, 0x67, 0x7d, 0x78, 0x36, 0x41, +0x08, 0x02, 0x31, 0x03, 0x42, 0xcd, 0x30, 0x7f, +0x01, 0xc0, 0x30, 0x49, 0x81, 0x30, 0x30, 0x48, +0x41, 0x05, 0x30, 0x4a, 0x01, 0xb4, 0x3b, 0xe8, +0x23, 0x29, 0x05, 0x43, 0x46, 0xbe, 0xfe, 0x43, +0xf4, 0xe1, 0x9b, 0x2a, 0xfa, 0x3f, 0xec, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, +0xec, 0xd2, 0x65, 0x11, 0x52, 0x65, 0xf9, 0xac, +0x68, 0x62, 0x92, 0x6e, 0x3c, 0xe8, 0x62, 0x06, +0x0f, 0x1e, 0x6d, 0x68, 0xf5, 0x6e, 0x6d, 0x0f, +0x0e, 0xba, 0x61, 0xe5, 0x84, 0x0c, 0x60, 0x92, +0x00, 0xaa, 0x60, 0x13, 0x81, 0x48, 0x6c, 0x87, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc9, 0x58, +0x29, 0x16, 0x0f, 0xff, 0x64, 0x81, 0x01, 0x04, +0x62, 0xc1, 0xdf, 0xf0, 0x50, 0x79, 0xc3, 0x79, +0x06, 0xb7, 0x46, 0x18, 0x90, 0x0e, 0x8f, 0xce, +0x2c, 0xba, 0x1b, 0xeb, 0x4f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa6, 0x20, +0xa6, 0xa2, 0x99, 0x97, 0x1c, 0x9b, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0x30, 0x02, 0xc0, 0x41, 0x30, 0x1c, 0x00, 0xa8, +0x30, 0x3a, 0x41, 0x41, 0x30, 0x6f, 0x82, 0x8c, +0x31, 0x02, 0xc7, 0xcf, 0x36, 0x99, 0xbb, 0xcb, +0x36, 0x72, 0x47, 0xcd, 0x31, 0x0a, 0x02, 0xbe, +0x30, 0x81, 0x41, 0xbf, 0x30, 0x49, 0xc1, 0x35, +0x30, 0x46, 0x81, 0x0a, 0x30, 0x48, 0x41, 0xc3, +0x3b, 0x98, 0x93, 0x26, 0x06, 0x47, 0xf6, 0xb8, +0xff, 0xc3, 0x94, 0x96, 0xf9, 0x6d, 0x7f, 0x4f, +0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xa3, 0xff, +0xfe, 0x8f, 0xff, 0xdb, 0xa0, 0xca, 0x32, 0xa8, +0xcb, 0xa3, 0x74, 0xd0, 0x55, 0x48, 0xdb, 0x8a, +0x24, 0xc3, 0xef, 0x1f, 0x20, 0xda, 0x0c, 0xf1, +0xc8, 0xd9, 0x61, 0x1e, 0x60, 0xc3, 0xaa, 0x08, +0x7c, 0xc1, 0x11, 0x01, 0xa8, 0xc0, 0x34, 0x02, +0x64, 0xda, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc9, 0x7c, 0x27, 0x16, 0x0f, 0xff, 0x64, 0x80, +0xfd, 0x04, 0x62, 0xc1, 0xdf, 0xf0, 0x50, 0x6e, +0x43, 0x8a, 0x6e, 0xcd, 0x78, 0x89, 0x31, 0x38, +0x19, 0x0d, 0x5c, 0x69, 0x6a, 0xc3, 0x9d, 0x48, +0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xd1, 0xfe, 0x84, 0xc4, 0x14, 0xd4, 0x53, 0x32, +0xe3, 0x93, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x30, 0x04, 0x80, 0x38, 0x30, 0x1e, +0x40, 0xa1, 0x30, 0x3c, 0x01, 0x36, 0x30, 0x72, +0xc2, 0x79, 0x31, 0x0a, 0x07, 0x92, 0x36, 0xc9, +0x7a, 0x06, 0x36, 0xa0, 0x87, 0x94, 0x31, 0x11, +0x42, 0xaf, 0x30, 0x82, 0x81, 0xbc, 0x30, 0x49, +0x01, 0x38, 0x30, 0x45, 0x41, 0x13, 0x30, 0x46, +0x01, 0xd0, 0x3b, 0x08, 0xc3, 0x25, 0x07, 0x47, +0xc6, 0xbe, 0xfe, 0x43, 0xf4, 0xf8, 0x3d, 0x5b, +0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, +0xff, 0xfd, 0xff, 0xff, 0x51, 0x94, 0x05, 0x69, +0x96, 0xe7, 0x01, 0x9f, 0x8a, 0xe9, 0xb5, 0x74, +0xd1, 0x87, 0x98, 0x40, 0x09, 0xb2, 0x83, 0xf0, +0xb9, 0xb1, 0x30, 0x3e, 0x89, 0x87, 0x12, 0x11, +0xa1, 0x81, 0xf8, 0x03, 0xf9, 0x80, 0x8a, 0x04, +0x51, 0xb6, 0x9b, 0xa7, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc9, 0x98, 0x2b, 0x16, 0x0f, 0xff, +0x64, 0x81, 0x03, 0x04, 0x62, 0xc1, 0xdf, 0xf0, +0x50, 0x1f, 0xd5, 0x1b, 0x0d, 0x04, 0x62, 0x80, +0x2a, 0x1b, 0x38, 0xb1, 0x65, 0x06, 0xfa, 0xd3, +0xe8, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xfd, 0x29, 0x88, 0x29, 0xa8, 0xa6, 0x65, +0xc7, 0x26, 0xf5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x30, 0x06, 0xc0, 0x31, +0x30, 0x1f, 0x80, 0x98, 0x30, 0x3e, 0x41, 0x2b, +0x30, 0x76, 0x02, 0x64, 0x31, 0x11, 0x47, 0x57, +0x36, 0xf6, 0xb8, 0x2f, 0x36, 0xcc, 0xc7, 0x59, +0x31, 0x17, 0x02, 0x9e, 0x30, 0x84, 0x41, 0xb9, +0x30, 0x48, 0xc1, 0x3d, 0x30, 0x43, 0x81, 0x18, +0x30, 0x43, 0xc1, 0xdd, 0x3a, 0xb9, 0x33, 0x22, +0x08, 0x47, 0xf6, 0xb8, 0xff, 0xc6, 0x29, 0x01, +0xcf, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf4, 0x19, 0x42, 0x57, 0x19, 0x64, +0x72, 0x99, 0xea, 0xb2, 0x1b, 0x39, 0x56, 0x98, +0x75, 0xa4, 0x1b, 0x1b, 0x0d, 0x1f, 0xd4, 0x1a, +0xf8, 0xe4, 0x03, 0x18, 0x6c, 0x81, 0x25, 0x98, +0x1d, 0x20, 0x48, 0x18, 0x0a, 0x00, 0x3f, 0x9b, +0x95, 0xa4, 0x72, 0x6c, 0xe9, 0xb1, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc9, 0x54, 0x29, 0x16, +0x0f, 0xff, 0x64, 0x81, 0x03, 0x04, 0x62, 0xc1, +0xdf, 0xf0, 0x50, 0x8f, 0xe6, 0x2b, 0x02, 0x23, +0x8b, 0x8d, 0x15, 0x58, 0x33, 0xd4, 0x8f, 0x4f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1f, +0xe8, 0x4c, 0x41, 0x4d, 0x45, 0x33, 0x2e, 0x39, +0x37, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x30, 0x0b, +0x00, 0x32, 0x30, 0x27, 0x40, 0xa9, 0x30, 0x4a, +0x01, 0x4a, 0x30, 0x8a, 0xc2, 0xa5, 0x31, 0x3f, +0x88, 0x14, 0x38, 0x20, 0xfd, 0xcc, 0x37, 0xef, +0x08, 0x1c, 0x31, 0x45, 0xc2, 0xed, 0x30, 0x99, +0x81, 0xf6, 0x30, 0x53, 0x01, 0x70, 0x30, 0x4b, +0xc1, 0x4b, 0x30, 0x4b, 0x02, 0x32, 0x3b, 0xea, +0xe3, 0x29, 0x0f, 0x40, 0x03, 0x3b, 0x76, 0x1f, +0xfa, 0x7b, 0x07, 0xd5, 0xff, 0xff, 0x57, 0xff, +0xff, 0xfe, 0xaf, 0xff, 0x7f, 0xff, 0xfd, 0xff, +0xef, 0xf5, 0x19, 0x10, 0x4b, 0x99, 0x2e, 0x65, +0x19, 0x98, 0x9e, 0x9a, 0xb3, 0x32, 0x18, 0x62, +0xc3, 0xaf, 0x9a, 0x94, 0xfc, 0x97, 0x9a, 0x83, +0x83, 0x9a, 0x98, 0x5a, 0xe1, 0x08, 0x18, 0x16, +0xc0, 0x46, 0x98, 0x09, 0xe0, 0x30, 0x1b, 0x31, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc8, 0xe4, +0x27, 0x16, 0x0f, 0xff, 0x64, 0x81, 0x03, 0x84, +0x62, 0xc1, 0xdf, 0xf0, 0x50, 0x5a, 0x70, 0x7a, +0xc1, 0xac, 0x4c, 0xc0, 0x22, 0x2a, 0x6b, 0x3a, +0xb3, 0xca, 0x0d, 0xf5, 0xa7, 0xd1, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x31, +0x05, 0x35, 0x14, 0xcc, 0xb8, 0xe4, 0xdd, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x30, 0x0d, 0x40, 0x29, 0x30, 0x28, 0x80, 0x9e, +0x30, 0x4c, 0xc1, 0x3d, 0x30, 0x8e, 0x02, 0x8c, +0x31, 0x46, 0xc7, 0xc9, 0x38, 0x4f, 0x3b, 0x83, +0x38, 0x1c, 0xc7, 0xd3, 0x31, 0x4c, 0x02, 0xd8, +0x30, 0x9a, 0xc1, 0xf1, 0x30, 0x52, 0x41, 0x75, +0x30, 0x49, 0x81, 0x52, 0x30, 0x48, 0xc2, 0x3f, +0x3b, 0x7b, 0x33, 0x24, 0x0e, 0x41, 0xf6, 0x70, +0xff, 0xbf, 0x94, 0x96, 0xf9, 0x6d, 0x1f, 0xff, +0xdb, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xe8, 0xff, 0xfd, 0xba, 0x0c, 0x87, 0x26, 0x0c, +0x92, 0x33, 0x4c, 0xc5, 0x51, 0x0d, 0x4a, 0x9c, +0xcc, 0x2f, 0x71, 0xe2, 0x0d, 0x3d, 0xae, 0x9a, +0x8d, 0x35, 0x51, 0xd7, 0x8c, 0x2b, 0x40, 0x88, +0x4c, 0x0a, 0x30, 0x26, 0x8c, 0x05, 0xa0, 0x14, +0xcd, 0xaa, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc9, 0x84, 0x29, 0x14, 0x0f, 0xff, 0x64, 0x80, +0xfe, 0x84, 0x63, 0x01, 0xdf, 0xf0, 0x50, 0xa2, +0x38, 0x65, 0x2c, 0xd6, 0x86, 0x10, 0x11, 0x29, +0x35, 0x5d, 0x69, 0xd0, 0xbb, 0x3a, 0xbf, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, +0x98, 0x82, 0x9a, 0x8a, 0x66, 0x5c, 0x72, 0x6e, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x30, 0x0f, 0x00, 0x1e, 0x30, 0x2a, +0xc0, 0x93, 0x30, 0x4e, 0x81, 0x2e, 0x30, 0x91, +0x42, 0x71, 0x31, 0x4d, 0x87, 0x78, 0x38, 0x7a, +0xf9, 0x1e, 0x38, 0x47, 0x07, 0x84, 0x31, 0x52, +0x42, 0xc3, 0x30, 0x9c, 0x01, 0xec, 0x30, 0x51, +0x81, 0x76, 0x30, 0x47, 0xc1, 0x59, 0x30, 0x45, +0x82, 0x4a, 0x3a, 0xeb, 0x83, 0x23, 0x11, 0x41, +0xc6, 0x76, 0xec, 0x43, 0x74, 0xf6, 0x1e, 0xaf, +0xf7, 0xff, 0xaa, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xbf, 0xff, 0xfe, 0xff, 0xf7, 0xfa, 0x8c, 0x84, +0x26, 0x4c, 0x8d, 0x34, 0x0c, 0xbc, 0x52, 0xcd, +0x3b, 0xa0, 0x0c, 0x2d, 0x41, 0xec, 0x4d, 0x30, +0x5e, 0xe4, 0x4d, 0x28, 0x21, 0xe1, 0xcc, 0x29, +0x10, 0x8c, 0x8c, 0x08, 0xe0, 0x2a, 0xcc, 0x06, +0x50, 0x11, 0x8d, 0xb4, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc9, 0x88, 0x2b, 0x14, 0x0f, 0xff, +0x64, 0x80, 0xfa, 0x84, 0x63, 0x01, 0xdf, 0xf0, +0x50, 0x99, 0x38, 0x9c, 0xe8, 0xd7, 0x25, 0xc0, +0x31, 0x35, 0x35, 0x9d, 0x59, 0xe0, 0x83, 0x7a, +0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xfd, 0x3f, 0xff, 0xf4, 0x26, 0x20, 0xa6, +0xa2, 0x99, 0x97, 0x1c, 0x9b, 0xd5, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x30, 0x14, 0xc0, 0x19, +0x30, 0x33, 0x00, 0xa0, 0x30, 0x5c, 0xc1, 0x4b, +0x30, 0xa9, 0x82, 0xac, 0x31, 0x84, 0x48, 0x29, +0x39, 0xd7, 0xbe, 0x3b, 0x39, 0x9b, 0xc8, 0x39, +0x31, 0x88, 0x03, 0x0e, 0x30, 0xb4, 0x42, 0x2d, +0x30, 0x5c, 0xc1, 0xb3, 0x30, 0x4f, 0x81, 0x92, +0x30, 0x4c, 0xc2, 0xad, 0x3c, 0x1d, 0xb3, 0x28, +0x16, 0x2e, 0x5b, 0x0c, 0x72, 0xdf, 0xca, 0x4b, +0x67, 0x17, 0xbb, 0xee, 0xff, 0x5d, 0x3f, 0x6f, +0xff, 0xff, 0xee, 0xfb, 0xf7, 0x7f, 0x5f, 0xa3, +0xdd, 0xfe, 0xef, 0x2a, 0x64, 0x19, 0x34, 0x64, +0x41, 0xaa, 0x65, 0x9a, 0xa0, 0x69, 0x55, 0x1a, +0x61, 0x59, 0x8f, 0xa8, 0x69, 0x13, 0x79, 0x4c, +0x68, 0xd4, 0x8f, 0x58, 0x61, 0x36, 0x04, 0x82, +0x60, 0x3c, 0x81, 0x70, 0x60, 0x37, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc9, 0x88, 0x29, 0x14, +0x0f, 0xff, 0x64, 0x81, 0x07, 0x84, 0x63, 0x01, +0xdf, 0xf0, 0x50, 0x00, 0x72, 0x6e, 0x34, 0x71, +0xc6, 0x25, 0x66, 0xbc, 0x2b, 0x82, 0x89, 0xc9, +0x22, 0xeb, 0x48, 0x42, 0xec, 0xb2, 0xa4, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x42, 0x62, 0x0a, 0x6a, 0x29, 0x99, 0x71, 0xc9, +0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x02, +0xc0, 0x49, 0x00, 0x00, 0x06, 0xf0, 0xbb, 0x66, +0x71, 0x07, 0x9d, 0xa6, 0x12, 0x41, 0x80, 0x68, +0x96, 0xcd, 0x06, 0x86, 0x01, 0x84, 0x61, 0x2a, +0x07, 0x26, 0x06, 0x80, 0x44, 0x60, 0x1c, 0x02, +0xc6, 0x4a, 0x66, 0x36, 0x45, 0x9c, 0x87, 0xf0, +0xa7, 0xa9, 0x98, 0x38, 0xff, 0xf5, 0x9b, 0xda, +0xf1, 0xbd, 0x54, 0x20, 0xc8, 0x02, 0x6c, 0xc8, +0x53, 0x58, 0xca, 0xa5, 0x5c, 0xd1, 0xba, 0x60, +0xc2, 0x8c, 0x1f, 0xe4, 0xd1, 0x3f, 0xf6, 0xa4, +0xd0, 0xc6, 0x1f, 0x44, 0xc2, 0x47, 0x09, 0x40, +0xc0, 0x62, 0x03, 0x1c, 0xc0, 0x77, 0x00, 0xa8, +0xdd, 0x08, 0x53, 0x8f, 0xc6, 0x8d, 0x82, 0x50, +0x05, 0x14, 0x52, 0xe9, 0xd5, 0x91, 0x04, 0x1b, +0xd6, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc9, 0xfc, +0x29, 0x12, 0x0f, 0xff, 0x64, 0x80, 0xff, 0x04, +0x63, 0x01, 0xdf, 0xf0, 0x50, 0xff, 0xd3, 0xfe, +0x9f, 0xff, 0xfa, 0x13, 0x10, 0x53, 0x51, 0x4c, +0xcb, 0x8e, 0x4d, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0x03, 0x01, 0x96, 0x60, 0x6d, 0x01, 0x0c, 0x60, +0xc1, 0x82, 0x4e, 0x61, 0x5f, 0x04, 0xd0, 0x63, +0x22, 0x8e, 0xc2, 0x74, 0x58, 0x70, 0x72, 0x73, +0xdb, 0x8e, 0xee, 0x63, 0x27, 0x05, 0xb0, 0x61, +0x6c, 0x84, 0x3e, 0x60, 0xb4, 0x83, 0x6e, 0x60, +0x94, 0x03, 0x3c, 0x60, 0x8a, 0x85, 0x8a, 0x75, +0x7c, 0x66, 0x40, 0x30, 0x5f, 0xf6, 0x18, 0xed, +0xc3, 0x14, 0x96, 0xdc, 0xbd, 0x9f, 0x77, 0x77, +0x4f, 0xff, 0xa3, 0xff, 0xfe, 0xbf, 0xfb, 0xbf, +0xfd, 0x3e, 0xef, 0xaf, 0x77, 0xa0, 0xc7, 0xf2, +0x68, 0xc7, 0xe3, 0x64, 0xca, 0x15, 0x70, 0xd0, +0xaa, 0x8c, 0xc2, 0x67, 0x20, 0x60, 0xd0, 0x4e, +0xfa, 0x60, 0xcf, 0xdd, 0x1f, 0xc0, 0xc2, 0x1e, +0x09, 0x7c, 0xc0, 0x49, 0x03, 0x48, 0xc0, 0x80, +0x00, 0x6c, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x82, +0xc6, 0xb8, 0x25, 0x35, 0x4c, 0xfb, 0x22, 0xb1, +0x0a, 0x04, 0x63, 0x01, 0xdf, 0xf0, 0x50, 0xdd, +0xe7, 0xa3, 0x92, 0x42, 0x4d, 0x84, 0x4b, 0x07, +0x15, 0x92, 0xe5, 0xd6, 0x90, 0x83, 0xec, 0xb2, +0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf4, 0x26, 0x20, 0xa6, 0xa2, 0x99, 0x97, +0x1c, 0x9b, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x26, 0x03, 0xf0, 0xc1, 0x05, 0x02, 0x34, +0xc1, 0xc2, 0x04, 0xf0, 0xc3, 0x31, 0x0a, 0x6c, +0xc7, 0x40, 0x1f, 0xc8, 0xef, 0x05, 0xf1, 0xa0, +0xed, 0xe4, 0x20, 0x30, 0xc7, 0x49, 0x0c, 0x84, +0xc3, 0x44, 0x09, 0x88, 0xc1, 0x98, 0x07, 0xe0, +0xc1, 0x47, 0x07, 0x8c, 0xc1, 0x2c, 0x0c, 0xe0, +0xd7, 0x10, 0xa3, 0x13, 0x88, 0x4b, 0x50, 0xb9, +0xda, 0xc3, 0xef, 0x2f, 0xb0, 0xf1, 0x9b, 0x5b, +0xe6, 0xfd, 0x7d, 0x5f, 0xff, 0xff, 0xff, 0xbf, +0xfb, 0x9f, 0x5f, 0xd1, 0xfa, 0x73, 0xfd, 0x37, +0x63, 0xfa, 0x14, 0x63, 0xe1, 0x36, 0x63, 0xd9, +0xb4, 0x64, 0xc2, 0xc2, 0x67, 0xcd, 0x58, 0x61, +0x20, 0x10, 0x6a, 0x67, 0xaa, 0xfe, 0xea, 0x67, +0x74, 0x10, 0x1e, 0x60, 0xfa, 0x84, 0xd4, 0x60, +0x17, 0x01, 0xc2, 0x60, 0xff, 0xfb, 0x90, 0xc4, +0xff, 0x83, 0xc9, 0xb8, 0x29, 0x12, 0x0f, 0xff, +0x64, 0x80, 0xfd, 0x84, 0x63, 0x01, 0xdf, 0xf0, +0x50, 0x44, 0x80, 0x14, 0x6f, 0x43, 0x79, 0xca, +0x5e, 0xc6, 0xc7, 0x22, 0x03, 0x8a, 0xa9, 0x74, +0xf2, 0xc8, 0x81, 0x06, 0xdb, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x31, +0x05, 0x35, 0x14, 0xcc, 0xb8, 0xe4, 0xdd, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x00, 0x01, 0xd4, 0x48, 0xc0, +0x00, 0x01, 0x60, 0x17, 0x8c, 0x06, 0xa0, 0x0a, +0x0c, 0x0c, 0x30, 0x1d, 0xcc, 0x16, 0xa0, 0x43, +0x8c, 0x34, 0xf0, 0xd6, 0xcd, 0x5c, 0x66, 0x7a, +0x4d, 0x54, 0x10, 0xda, 0x4c, 0x35, 0x00, 0x53, +0x8e, 0xe3, 0x03, 0x35, 0x4b, 0x64, 0xcf, 0xcc, +0xe3, 0x38, 0xdb, 0xcc, 0x7e, 0x6d, 0x00, 0x00, +0x19, 0x5b, 0xb1, 0x0d, 0xca, 0x25, 0x96, 0xec, +0x76, 0xbe, 0x9f, 0xfc, 0x62, 0x62, 0xda, 0x1f, +0x51, 0xb2, 0x66, 0x34, 0x90, 0x86, 0x31, 0x17, +0xe6, 0x3c, 0xa6, 0xc6, 0x63, 0x4b, 0xe6, 0x0e, +0x98, 0xe9, 0x06, 0x64, 0x77, 0x0c, 0xc6, 0x61, +0xa8, 0xe5, 0x06, 0x0c, 0x70, 0x44, 0xe6, 0x00, +0x58, 0x19, 0x81, 0xc0, 0x7c, 0x9b, 0x5c, 0xa4, +0x70, 0x46, 0x29, 0xab, 0x06, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xca, 0x3c, 0x29, 0x10, 0x0f, +0xff, 0x84, 0x80, 0xfb, 0x84, 0x63, 0x01, 0xdf, +0xf0, 0x50, 0x61, 0x84, 0x65, 0x22, 0xf3, 0x4e, +0xe6, 0x59, 0x31, 0x05, 0x35, 0x14, 0xcc, 0xb8, +0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x00, 0x81, 0xc8, +0x00, 0x00, 0x01, 0x80, 0x95, 0x30, 0x25, 0xc0, +0x33, 0x30, 0x42, 0x00, 0x94, 0x30, 0x79, 0xc1, +0x4d, 0x31, 0x17, 0x84, 0x14, 0x37, 0x27, 0x5f, +0x4e, 0x36, 0xfa, 0x84, 0x2a, 0x31, 0x17, 0xc1, +0xa7, 0x30, 0x79, 0x81, 0x52, 0x30, 0x37, 0x81, +0x20, 0x03, 0x52, 0xc6, 0x40, 0xd2, 0x1e, 0xa0, +0x32, 0x82, 0x58, 0x0c, 0x0a, 0x09, 0x0f, 0x40, +0x72, 0xc8, 0x01, 0x36, 0x5f, 0x34, 0x7f, 0xeb, +0xff, 0xd1, 0xcd, 0xeb, 0xce, 0xdb, 0xf8, 0x25, +0x73, 0xcd, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xfd, 0x26, 0x33, 0x10, 0x66, 0x2f, 0x98, 0x06, +0x38, 0x27, 0x66, 0x5b, 0xcc, 0xc6, 0x0d, 0x60, +0xeb, 0xe6, 0x5d, 0x0f, 0x20, 0xe6, 0x5a, 0x60, +0xe7, 0xe6, 0x0b, 0x48, 0x46, 0x05, 0x40, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0xc8, 0xec, 0x53, +0x1d, 0x4f, 0xf0, 0x47, 0x20, 0xc9, 0x84, 0xa3, +0x41, 0xdf, 0xf0, 0x55, 0x35, 0xc5, 0x81, 0x07, +0x36, 0xd1, 0x24, 0xe1, 0x2b, 0x43, 0x57, 0x8b, +0x03, 0x88, 0xaa, 0x49, 0xe5, 0x9e, 0xc0, 0x23, +0x5a, 0x62, 0x0a, 0x6a, 0x29, 0x99, 0x71, 0xc9, +0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0x33, 0xc0, 0x30, 0x30, 0x5d, 0x00, 0x7a, 0x30, +0x9b, 0x41, 0x47, 0x31, 0x14, 0x82, 0xbe, 0x32, +0x71, 0x48, 0x5b, 0x3f, 0xcb, 0xbf, 0x1f, 0x3f, +0x6a, 0x48, 0x8d, 0x32, 0x6f, 0x83, 0x8a, 0x31, +0x12, 0x42, 0xf5, 0x30, 0x7f, 0xc2, 0x99, 0x31, +0x76, 0x28, 0xc3, 0x14, 0x14, 0x5b, 0x30, 0xc3, +0x17, 0x13, 0x02, 0x80, 0x36, 0x04, 0x80, 0x4a, +0x54, 0x30, 0x37, 0x02, 0x1c, 0x9f, 0xbd, 0xdd, +0xef, 0xbd, 0xff, 0xb9, 0xff, 0x7d, 0x7a, 0xb2, +0xd3, 0xfb, 0xfa, 0x5c, 0x1e, 0xe6, 0x0d, 0xd5, +0xd8, 0x79, 0xbe, 0x86, 0xd3, 0xdd, 0xd2, 0x8f, +0xf4, 0x6d, 0x65, 0xb9, 0x45, 0x76, 0xbb, 0x47, +0xec, 0x6a, 0x3e, 0x1b, 0xa4, 0xc6, 0x32, 0x08, +0xc5, 0x83, 0x04, 0xc6, 0x74, 0xf0, 0xca, 0x49, +0xb4, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x82, 0xca, +0x8c, 0x7b, 0x18, 0xef, 0xd4, 0x49, 0x40, 0xc9, +0x04, 0xa3, 0x41, 0xdf, 0xf0, 0x54, 0xc1, 0x87, +0x1d, 0xc8, 0xca, 0xaa, 0xe6, 0x50, 0xca, 0x5b, +0x1d, 0x48, 0xc1, 0x3e, 0x08, 0xec, 0xc0, 0x08, +0x03, 0x80, 0xc0, 0x8a, 0x00, 0x08, 0xdb, 0xe3, +0xc3, 0x85, 0x28, 0xcd, 0x60, 0x27, 0x12, 0x25, +0x2a, 0x17, 0x9a, 0x8b, 0x32, 0xc9, 0x88, 0x29, +0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xf5, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x36, 0x00, 0x43, 0x30, 0x5f, 0x40, +0x63, 0x30, 0x9d, 0x01, 0x24, 0x31, 0x17, 0x42, +0x81, 0x32, 0x76, 0x87, 0xa2, 0x3f, 0xf0, 0xf9, +0x9c, 0x3f, 0x8e, 0x07, 0xda, 0x32, 0x74, 0x43, +0x57, 0x31, 0x12, 0x02, 0xe4, 0x30, 0x7c, 0x82, +0x98, 0x30, 0x58, 0x42, 0x91, 0x30, 0x49, 0x84, +0x66, 0x30, 0x2b, 0x01, 0x72, 0x30, 0x08, 0xc0, +0x39, 0x06, 0x00, 0x10, 0x03, 0xbc, 0x26, 0x82, +0x4e, 0x3d, 0xca, 0x07, 0xda, 0xa6, 0xe7, 0x6a, +0xea, 0x07, 0xbb, 0xc6, 0x75, 0x31, 0x3d, 0x16, +0xbb, 0xdb, 0xff, 0xfd, 0x3f, 0x99, 0xdf, 0x2d, +0xf6, 0x3f, 0xd2, 0xad, 0xfd, 0x33, 0xaf, 0x8e, +0xbb, 0x51, 0x8c, 0x04, 0x19, 0x8a, 0x66, 0x11, +0x8b, 0x89, 0xf9, 0x92, 0x73, 0x91, 0x82, 0xb8, +0x3c, 0x19, 0x93, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xcc, 0xb8, 0x7b, 0x0c, 0x0f, 0xf8, 0x49, +0x40, 0xce, 0x84, 0xa3, 0x41, 0xdf, 0xf0, 0x55, +0x53, 0xd0, 0xa9, 0x92, 0xbc, 0x3b, 0x29, 0x82, +0x26, 0x12, 0x11, 0x80, 0x4a, 0x07, 0x59, 0x81, +0x22, 0x00, 0x89, 0xb8, 0x86, 0x67, 0x0f, 0x48, +0x1a, 0xcc, 0x40, 0x24, 0x49, 0x54, 0x4f, 0x6c, +0x9f, 0x00, 0x8d, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xa6, +0x20, 0xa6, 0xa2, 0x99, 0x97, 0x1c, 0x9b, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x00, 0xd4, 0x49, 0x00, +0x00, 0x03, 0x01, 0x24, 0x01, 0x03, 0x02, 0x28, +0x00, 0xa3, 0x03, 0xbc, 0x05, 0x73, 0x06, 0xd0, +0x0d, 0x63, 0x0f, 0xbc, 0x2b, 0x53, 0x67, 0x39, +0x4c, 0xf3, 0x64, 0xbc, 0x2c, 0xd3, 0x0f, 0xa0, +0x13, 0x23, 0xd3, 0xc4, 0x4d, 0x66, 0xf9, 0x33, +0xa3, 0xe0, 0xcb, 0x3b, 0x73, 0x16, 0xa1, 0x41, +0x00, 0x46, 0x47, 0x00, 0x4a, 0xea, 0x46, 0x27, +0xef, 0x76, 0xbe, 0x9f, 0xe8, 0xea, 0x80, 0xd9, +0xfc, 0xd1, 0x76, 0xff, 0xa6, 0xef, 0x83, 0x46, +0x2f, 0x90, 0x06, 0x27, 0x18, 0x66, 0x29, 0xa8, +0x46, 0x40, 0x4e, 0xe6, 0x09, 0x98, 0xf2, 0x46, +0x44, 0xd7, 0x50, 0x46, 0x42, 0xb8, 0xee, 0x86, +0x07, 0x20, 0x49, 0x66, 0x01, 0xd0, 0x1e, 0x46, +0x04, 0xb0, 0x03, 0xc6, 0xe7, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xcc, 0x14, 0x3d, 0x0c, 0x0f, +0xfd, 0xa4, 0xc1, 0x02, 0x04, 0xa3, 0x41, 0xdf, +0xf0, 0x50, 0x12, 0x1c, 0x40, 0xfe, 0x6b, 0x40, +0xd8, 0xb1, 0x29, 0x50, 0xbd, 0xd2, 0x60, 0x7d, +0x9f, 0xf4, 0x26, 0x20, 0xa6, 0xa2, 0x99, 0x97, +0x1c, 0x9b, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x30, 0x32, 0x80, +0x57, 0x30, 0x55, 0xc0, 0x21, 0x30, 0x8c, 0x00, +0xbe, 0x30, 0xf8, 0x41, 0xbd, 0x32, 0x30, 0x85, +0x58, 0x3e, 0x33, 0x68, 0x36, 0x3d, 0xdb, 0x05, +0x94, 0x32, 0x2c, 0xc2, 0x8d, 0x30, 0xee, 0x02, +0x66, 0x30, 0x67, 0x02, 0x3e, 0x30, 0x42, 0xc2, +0x43, 0x30, 0x32, 0x83, 0xe8, 0x33, 0x75, 0x20, +0xc1, 0xe2, 0xf1, 0x00, 0x11, 0x60, 0xda, 0x44, +0x07, 0x1b, 0x9c, 0xbf, 0xc5, 0x3a, 0x4d, 0xbe, +0x2d, 0xde, 0xae, 0xa6, 0xa7, 0xf7, 0x7b, 0xbf, +0xbb, 0xd5, 0xb4, 0xf3, 0x7f, 0xbe, 0xbf, 0xdf, +0xfe, 0xfe, 0x87, 0x1d, 0x75, 0xfe, 0xa3, 0x16, +0x88, 0x13, 0x12, 0x4c, 0x23, 0x12, 0x14, 0x53, +0x1b, 0x67, 0xa3, 0x04, 0x18, 0x79, 0xf3, 0x1d, +0xff, 0xad, 0xf3, 0x1d, 0x00, 0x78, 0x33, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0x49, 0x8c, 0x55, +0x1b, 0x4f, 0xf0, 0x47, 0x28, 0xd7, 0x04, 0x63, +0x41, 0xdf, 0xf0, 0x50, 0x02, 0xd4, 0x25, 0x23, +0x01, 0x44, 0x0f, 0xb3, 0x02, 0x74, 0x02, 0xd3, +0x75, 0x06, 0x4e, 0x26, 0x68, 0x35, 0xb8, 0x50, +0x68, 0x92, 0xab, 0x9e, 0xd9, 0x3d, 0x80, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x5a, 0x62, 0x0a, 0x6a, 0x29, +0x99, 0x71, 0xc9, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0x34, 0xc0, 0x64, 0x30, 0x57, 0x00, 0x00, 0x30, +0x8d, 0x40, 0x9b, 0x30, 0xf9, 0x01, 0x7e, 0x32, +0x33, 0xc4, 0x9f, 0x3e, 0x47, 0xa2, 0x9d, 0x3d, +0xee, 0xc4, 0xe1, 0x32, 0x2e, 0x82, 0x5c, 0x30, +0xed, 0x42, 0x55, 0x30, 0x64, 0xc2, 0x3d, 0x30, +0x3d, 0x82, 0x44, 0x30, 0x2b, 0xc3, 0xed, 0x32, +0xdd, 0x2c, 0xc1, 0x02, 0xe1, 0x50, 0x2a, 0xc0, +0x34, 0xb8, 0x02, 0x59, 0x3f, 0x79, 0xed, 0x96, +0x19, 0xe9, 0xfb, 0x79, 0x3f, 0xd7, 0xed, 0xff, +0x4f, 0xff, 0xfb, 0x4a, 0xec, 0xfb, 0x7d, 0xcf, +0xc9, 0x7e, 0x76, 0x8f, 0x93, 0xa0, 0xc5, 0x91, +0xf8, 0xc4, 0x23, 0x0c, 0xc3, 0xd5, 0x10, 0xc5, +0x69, 0xfc, 0xc0, 0xd7, 0x1e, 0xa0, 0xc6, 0x50, +0xec, 0xa8, 0xc6, 0x1b, 0x1e, 0x30, 0xc0, 0x7e, +0x09, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xcb, +0x30, 0x2d, 0x0e, 0x0f, 0xff, 0x84, 0x81, 0x00, +0x84, 0xa3, 0x41, 0xdf, 0xf0, 0x50, 0x64, 0xc0, +0x64, 0x04, 0x10, 0xc0, 0xa2, 0x00, 0xe0, 0xdd, +0xa0, 0x83, 0x8a, 0x15, 0x4d, 0x6c, 0x0d, 0x1a, +0x27, 0x2a, 0xd7, 0xba, 0x4d, 0x6c, 0xb2, 0x62, +0x0a, 0x6a, 0x29, 0x99, 0x71, 0xc9, 0xbd, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x36, 0x80, 0x71, 0x08, 0x0b, 0x08, +0xc2, 0x38, 0x01, 0xd8, 0xc3, 0xeb, 0x04, 0xf4, +0xc8, 0xd8, 0x0f, 0x60, 0xf9, 0x5f, 0x72, 0x98, +0xf7, 0xf8, 0x10, 0x88, 0xc8, 0xbf, 0x08, 0xa4, +0xc3, 0xb0, 0x09, 0x08, 0xc1, 0x86, 0x08, 0xe0, +0xc0, 0xe1, 0x09, 0x1c, 0xc0, 0x92, 0x0f, 0xc8, +0xc8, 0xd4, 0xc3, 0x01, 0x8b, 0xc6, 0x00, 0x8b, +0x2d, 0xb8, 0x40, 0x72, 0xf9, 0xcb, 0xfc, 0x53, +0xa4, 0xfe, 0x12, 0xf5, 0x75, 0x31, 0xbf, 0x14, +0xfb, 0xbf, 0xff, 0xde, 0xdf, 0xef, 0xfe, 0x97, +0xfa, 0x91, 0xbf, 0xa7, 0x5d, 0xee, 0xea, 0x31, +0x50, 0x7f, 0x30, 0xf4, 0xc2, 0x30, 0xc1, 0x47, +0x31, 0x06, 0x82, 0x30, 0x28, 0x87, 0xb3, 0x31, +0x43, 0xfb, 0x65, 0x31, 0x37, 0x87, 0x97, 0x30, +0x10, 0xc2, 0x5e, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xca, 0xd8, 0x2b, 0x0e, 0x0f, 0xff, 0x84, +0x80, 0xcf, 0x84, 0xa3, 0x41, 0xdf, 0xf0, 0x55, +0x30, 0x1e, 0x41, 0x0d, 0x30, 0x2a, 0x40, 0x45, +0x07, 0x77, 0x4e, 0x2e, 0x3c, 0x35, 0xb8, 0x10, +0x78, 0x9a, 0xab, 0x9f, 0x29, 0x3d, 0x80, 0x8f, +0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x5a, 0x62, 0x0a, 0x6a, +0x29, 0x99, 0x71, 0xc9, 0xba, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x30, 0x38, 0x40, 0x7e, 0x30, +0x59, 0x00, 0x19, 0x30, 0x8f, 0x40, 0x4d, 0x30, +0xfb, 0x00, 0xf4, 0x32, 0x38, 0x43, 0x05, 0x3e, +0x63, 0x96, 0x37, 0x3e, 0x09, 0xc3, 0x59, 0x32, +0x30, 0x81, 0xf0, 0x30, 0xea, 0x42, 0x2f, 0x30, +0x5e, 0x42, 0x35, 0x33, 0x2a, 0x46, 0x31, 0xcf, +0xf5, 0x30, 0xbd, 0x4d, 0x04, 0x06, 0x03, 0xa0, +0x2a, 0xc8, 0x6e, 0x71, 0xc9, 0x64, 0xfd, 0xee, +0xfe, 0xff, 0xff, 0xf2, 0xe7, 0xff, 0xdf, 0xff, +0x57, 0xfc, 0x1e, 0xfa, 0x75, 0xfb, 0x3f, 0xff, +0x76, 0x8f, 0xf4, 0x7d, 0xbf, 0xde, 0xdd, 0x0e, +0xf6, 0xe8, 0x4f, 0x93, 0xa0, 0x12, 0x28, 0x0c, +0x3c, 0x80, 0xc1, 0x0f, 0x40, 0xae, 0x40, 0x0f, +0x33, 0x00, 0x64, 0x30, 0xa3, 0x05, 0xa1, 0x7e, +0x83, 0x05, 0x64, 0x2f, 0xe2, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xca, 0xc0, 0x2d, 0x0e, 0x0f, +0xff, 0x84, 0x81, 0x02, 0x84, 0xa3, 0x41, 0xdf, +0xf0, 0x50, 0x00, 0x39, 0x4c, 0x02, 0x60, 0x17, +0x0c, 0x03, 0x40, 0x03, 0x8a, 0x51, 0x81, 0xde, +0x8d, 0x71, 0x46, 0x28, 0x3a, 0xf9, 0x91, 0x6f, +0x6b, 0xbd, 0xde, 0xa4, 0xc4, 0x14, 0xd4, 0x53, +0x32, 0xe3, 0x93, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x3a, 0x00, +0x8b, 0x30, 0x5a, 0x40, 0x32, 0x30, 0x8f, 0x80, +0x1e, 0x30, 0xfc, 0x40, 0xa7, 0x32, 0x39, 0x02, +0x1a, 0x3e, 0x6b, 0xcf, 0x0a, 0x3e, 0x11, 0x82, +0x7c, 0x32, 0x30, 0xc1, 0xb9, 0x30, 0xe8, 0x82, +0x1a, 0x30, 0x5b, 0x02, 0x2e, 0x30, 0x2c, 0xc2, +0x47, 0x30, 0x14, 0x03, 0xf6, 0x30, 0xa5, 0x38, +0x42, 0x31, 0x20, 0x02, 0x2d, 0xb7, 0x42, 0x0b, +0x97, 0xce, 0x5f, 0x30, 0xc9, 0x57, 0xf9, 0x5f, +0xa3, 0x90, 0xba, 0x9d, 0x5f, 0x6f, 0xf4, 0x68, +0xd9, 0xfe, 0x8b, 0x4b, 0x6c, 0xd9, 0xa7, 0xec, +0x75, 0x3e, 0xee, 0x96, 0x7b, 0x28, 0x31, 0x30, +0x7b, 0x30, 0xbc, 0xc2, 0x30, 0x61, 0x47, 0x30, +0x36, 0x84, 0x30, 0x0a, 0x07, 0xbb, 0x30, 0x85, +0xfb, 0xa9, 0x30, 0x7d, 0x87, 0xa3, 0x30, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0x4b, 0x38, 0x7b, +0x0e, 0x0f, 0xf4, 0x49, 0x40, 0xc7, 0x04, 0x25, +0x25, 0xbf, 0xe8, 0x56, 0x0d, 0x82, 0x66, 0x30, +0x26, 0xc1, 0x1b, 0x30, 0x2c, 0xc0, 0x59, 0x01, +0x79, 0x0e, 0x32, 0x06, 0x0e, 0xb9, 0x13, 0x13, +0x55, 0xa9, 0xf2, 0x93, 0xd8, 0x08, 0xfb, 0x3f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0x5a, 0x62, 0x0a, 0x6a, 0x29, 0x99, +0x71, 0xc9, 0xbd, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x30, +0x3b, 0xc0, 0x96, 0x30, 0x5b, 0x00, 0x4d, 0x0e, +0x12, 0x08, 0xc3, 0xf0, 0x01, 0x30, 0xc8, 0xe7, +0x04, 0x24, 0xf9, 0xbe, 0x19, 0x74, 0xf8, 0x55, +0x06, 0x0c, 0xc8, 0xc0, 0x05, 0xf0, 0xc3, 0x99, +0x08, 0x1c, 0xc1, 0x5f, 0x08, 0xa4, 0xc0, 0x98, +0x09, 0x10, 0xc0, 0x2b, 0x0f, 0xe4, 0x43, 0x4f, +0x20, 0x18, 0x16, 0x00, 0xaa, 0x38, 0xdd, 0xe3, +0x92, 0xca, 0x3b, 0xcf, 0x6d, 0x27, 0x7d, 0x2d, +0xd1, 0x4f, 0x6d, 0xff, 0xf7, 0x23, 0xfa, 0xaa, +0xe9, 0xff, 0x4d, 0x88, 0xaf, 0xb7, 0x47, 0xdd, +0xa3, 0xed, 0x4d, 0x1f, 0x26, 0x60, 0x25, 0x80, +0xf0, 0x60, 0x13, 0x01, 0x82, 0x60, 0x04, 0x82, +0x8c, 0x58, 0x0a, 0x1c, 0xc0, 0x08, 0x1e, 0xf0, +0xc0, 0x27, 0xee, 0xc0, 0xc1, 0x21, 0xe9, 0x0c, +0x1d, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xcb, +0x20, 0x2b, 0x0e, 0x0f, 0xff, 0x84, 0x80, 0xfe, +0x84, 0xa3, 0x41, 0xdf, 0xf0, 0x50, 0xc9, 0xac, +0xc2, 0xb0, 0x48, 0x0c, 0x2e, 0x01, 0x88, 0xc3, +0xd4, 0x03, 0xc5, 0x88, 0xc0, 0xa5, 0xc4, 0xa1, +0x39, 0x46, 0x1e, 0xf9, 0x05, 0xba, 0xec, 0xb2, +0xb4, 0xc4, 0x14, 0xd4, 0x53, 0x32, 0xe3, 0x93, +0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x3d, 0x00, 0xa1, 0x30, 0x5c, 0x40, +0x62, 0x30, 0x90, 0x00, 0x2f, 0x30, 0xfc, 0x40, +0x0c, 0x32, 0x39, 0x00, 0x7b, 0x3e, 0x6f, 0xc6, +0xe1, 0x3e, 0x14, 0x80, 0x38, 0x32, 0x2e, 0xc1, +0x3d, 0x30, 0xe3, 0x81, 0xf0, 0x30, 0x53, 0x82, +0x22, 0x30, 0x1f, 0xc2, 0x45, 0x04, 0x07, 0xf0, +0x60, 0x1a, 0x70, 0xc0, 0xc4, 0x94, 0x08, 0xa3, +0x6f, 0x04, 0x96, 0x5f, 0x45, 0x7d, 0xcc, 0xa0, +0x7f, 0xa3, 0xa6, 0x8e, 0xcb, 0xbf, 0xef, 0x4f, +0xf5, 0x54, 0x9d, 0x1f, 0xe8, 0x8a, 0x16, 0xdb, +0xf2, 0x3f, 0x7e, 0x9f, 0xd1, 0x4f, 0xc8, 0x18, +0x8c, 0x3b, 0x98, 0x42, 0x60, 0x03, 0x14, 0x73, +0x03, 0x28, 0x63, 0x01, 0x4c, 0x7b, 0xd3, 0x09, +0x23, 0xba, 0x93, 0x09, 0x34, 0x7a, 0x53, 0x02, +0xb0, 0x26, 0xe3, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xca, 0xbc, 0x2b, 0x0e, 0x0f, 0xff, 0x84, +0x80, 0xda, 0x84, 0xe3, 0x41, 0xff, 0x6c, 0x94, +0x02, 0xec, 0x12, 0x73, 0x02, 0xf4, 0x06, 0xd3, +0x7b, 0x07, 0x0e, 0x32, 0x13, 0x12, 0xb9, 0x94, +0x13, 0x15, 0xad, 0xec, 0x91, 0xd8, 0x04, 0xfd, +0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xad, 0x31, 0x05, 0x35, 0x14, +0xcc, 0xb8, 0xe4, 0xdd, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x30, 0x3e, 0xc0, 0xac, 0x30, +0x5c, 0x80, 0x77, 0x30, 0x90, 0xc0, 0x5a, 0x30, +0xfc, 0x00, 0x77, 0x32, 0x38, 0xc1, 0xb0, 0x3e, +0x6b, 0x0f, 0x6e, 0x3e, 0x10, 0x41, 0x32, 0x32, +0x2d, 0x00, 0xfa, 0x30, 0xe1, 0x41, 0xd9, 0x30, +0x50, 0x42, 0x1d, 0x30, 0x18, 0x82, 0x42, 0x30, +0x03, 0x83, 0xf7, 0x30, 0xf5, 0x3c, 0x2e, 0x30, +0x20, 0x02, 0xa8, 0xf3, 0xd7, 0x24, 0x96, 0x51, +0xde, 0x37, 0x97, 0x09, 0x79, 0x76, 0xfa, 0x78, +0x9e, 0xfa, 0x35, 0x7f, 0xfd, 0x3a, 0x7e, 0xbf, +0xa6, 0x2e, 0x8d, 0x9f, 0x47, 0xef, 0xa3, 0xde, +0xde, 0xcf, 0x27, 0x49, 0x10, 0x61, 0xb1, 0xc1, +0x80, 0x8c, 0xa4, 0x8b, 0x63, 0x06, 0xdc, 0xcc, +0x04, 0x81, 0x23, 0x0c, 0x23, 0xd8, 0xd7, 0x0c, +0x23, 0x61, 0x1f, 0x8c, 0x07, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xca, 0xc4, 0x2b, 0x0e, 0x0f, +0xff, 0x84, 0x80, 0xfe, 0x84, 0xa3, 0x41, 0xdf, +0xf0, 0x50, 0x90, 0x59, 0xcc, 0x06, 0xc0, 0x29, +0x8c, 0x06, 0x60, 0x0e, 0x8e, 0x1c, 0x34, 0xe6, +0x83, 0x84, 0xb0, 0x0a, 0x05, 0xdc, 0xc9, 0x1d, +0x80, 0x7c, 0xe7, 0xfd, 0x29, 0x88, 0x29, 0xa8, +0xa6, 0x65, 0xc7, 0x26, 0xea, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x40, 0x00, +0xb7, 0x30, 0x5d, 0x40, 0x8a, 0x30, 0x90, 0x80, +0x83, 0x30, 0xfb, 0xc0, 0xca, 0x32, 0x37, 0x02, +0xa9, 0x3e, 0x62, 0xd6, 0x8f, 0x3e, 0x07, 0x82, +0x39, 0x32, 0x2a, 0xc0, 0xaf, 0x30, 0xde, 0x01, +0xc0, 0x30, 0x4c, 0x02, 0x14, 0x30, 0x11, 0x42, +0x3f, 0x30, 0x0e, 0xc3, 0xf4, 0x31, 0xcd, 0x30, +0x00, 0x31, 0x1d, 0x02, 0x2d, 0x97, 0xa2, 0x4b, +0x2f, 0xa2, 0xbe, 0xec, 0xa3, 0xfd, 0x0c, 0xf6, +0xfa, 0xb4, 0x5a, 0xbf, 0x67, 0xff, 0xef, 0xd3, +0xfe, 0x9f, 0xf6, 0x7b, 0xba, 0x5f, 0xfe, 0x8f, +0x21, 0x49, 0x87, 0xc3, 0x89, 0x82, 0x25, 0xe0, +0x15, 0x45, 0x31, 0x02, 0x82, 0x30, 0x31, 0x47, +0xb5, 0x31, 0x4d, 0x3b, 0x63, 0x31, 0x48, 0x47, +0x9f, 0x30, 0x43, 0x02, 0x70, 0x30, 0x36, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0x4b, 0x14, 0x2b, +0x0e, 0x0f, 0xff, 0x84, 0x80, 0xcf, 0x04, 0x64, +0x55, 0xcf, 0xec, 0x56, 0x41, 0x33, 0x30, 0x31, +0x40, 0x7f, 0x37, 0xc0, 0xd8, 0xe3, 0x24, 0x53, +0x5b, 0x80, 0xc8, 0x89, 0x8a, 0xbd, 0xec, 0x91, +0xce, 0x02, 0x7e, 0xcf, 0xff, 0xd7, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x69, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xf5, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x30, +0x41, 0x40, 0xc0, 0x30, 0x5d, 0x80, 0x9f, 0x30, +0x90, 0x40, 0xa6, 0x30, 0xfa, 0x81, 0x17, 0x32, +0x34, 0xc3, 0x84, 0x3e, 0x56, 0x1c, 0xf8, 0x3d, +0xfb, 0x43, 0x1c, 0x32, 0x27, 0x00, 0x5a, 0x30, +0xda, 0xc1, 0xa9, 0x30, 0x48, 0x42, 0x0d, 0x30, +0x08, 0x82, 0x3a, 0x30, 0x17, 0x83, 0xf1, 0x32, +0x75, 0x34, 0xc0, 0xa2, 0xe1, 0x40, 0x2a, 0xda, +0x7c, 0x66, 0xa7, 0x28, 0xef, 0x65, 0x7c, 0x4a, +0x73, 0xcf, 0xfa, 0xba, 0xed, 0xfb, 0x3e, 0xff, +0xfa, 0x35, 0xf7, 0x37, 0xfb, 0xbf, 0xa1, 0xdf, +0x4e, 0xee, 0x85, 0xbd, 0x7b, 0xfa, 0xcc, 0x39, +0x1b, 0x8c, 0x06, 0x2e, 0xcc, 0x0c, 0x50, 0x8c, +0x57, 0xa0, 0x4c, 0x0f, 0x41, 0xeb, 0x0c, 0x67, +0x5e, 0xc9, 0x8c, 0x65, 0x81, 0xe6, 0x0c, 0x13, +0x90, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xca, +0x94, 0x2b, 0x0e, 0x0f, 0xff, 0x84, 0x81, 0x03, +0x04, 0xa3, 0x41, 0xdf, 0xf0, 0x50, 0x9c, 0xcc, +0x0e, 0x60, 0x4e, 0x0c, 0x0c, 0x80, 0x21, 0x8d, +0xf2, 0x41, 0x38, 0xb1, 0x70, 0xd6, 0xc0, 0xa1, +0xe2, 0x5a, 0xac, 0x7b, 0xe4, 0x13, 0xe1, 0x89, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xea, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0x30, 0x42, 0x80, 0xcb, 0x30, 0x5e, 0x40, +0xb0, 0x30, 0x90, 0x00, 0xc9, 0x30, 0xf9, 0x41, +0x5a, 0x32, 0x32, 0x04, 0x4f, 0x3e, 0x45, 0xe2, +0xe9, 0x3d, 0xeb, 0x03, 0xed, 0x12, 0x44, 0x78, +0xc3, 0x5c, 0x06, 0x38, 0xc1, 0x10, 0x08, 0x08, +0x2a, 0x11, 0xb9, 0x80, 0xfe, 0x1f, 0x51, 0x98, +0xe9, 0x46, 0x0a, 0x17, 0x88, 0xc0, 0x8b, 0x25, +0xf0, 0x99, 0x9f, 0xa2, 0xbe, 0xe4, 0x4a, 0x1e, +0xf2, 0x4c, 0xd3, 0x6f, 0x0e, 0x6d, 0xeb, 0xf6, +0xff, 0xa3, 0xb3, 0xff, 0xda, 0x9a, 0xd9, 0xb3, +0xfb, 0xfa, 0x7f, 0x3f, 0x6f, 0xc8, 0x18, 0x68, +0x36, 0x81, 0x4b, 0x83, 0x06, 0xd4, 0x13, 0x1b, +0x27, 0xc3, 0x04, 0x8c, 0x7a, 0x33, 0x1e, 0x7b, +0xad, 0xb3, 0x1d, 0xec, 0x79, 0x13, 0x05, 0x80, +0x27, 0x23, 0x03, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xca, 0xe8, 0x2d, 0x0e, 0x0f, 0xff, 0x84, +0x80, 0xd0, 0x84, 0xa3, 0x41, 0xdf, 0xf0, 0x55, +0xd4, 0x13, 0xd3, 0x03, 0x2c, 0x08, 0xf3, 0x7c, +0x13, 0x0e, 0x2e, 0x71, 0x35, 0xa8, 0x4c, 0x68, +0x90, 0xab, 0xde, 0x49, 0x1c, 0xe0, 0x27, 0x5f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfd, 0x69, 0x88, 0x29, 0xa8, 0xa6, +0x65, 0xc7, 0x26, 0xf5, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x30, 0x43, 0xc0, 0xd4, 0x30, +0x5e, 0x00, 0xc3, 0x30, 0x8f, 0xc0, 0xe8, 0x30, +0xf8, 0x01, 0x9b, 0x32, 0x2e, 0xc5, 0x0c, 0x3e, +0x30, 0xa8, 0x7c, 0x3d, 0xd6, 0xc4, 0xac, 0x32, +0x1f, 0x00, 0x63, 0x30, 0xd3, 0xc1, 0x75, 0x30, +0x3f, 0xc1, 0xfb, 0x30, 0x03, 0x42, 0x32, 0x30, +0x27, 0x03, 0xe5, 0x33, 0xb5, 0x24, 0xc2, 0x22, +0xe1, 0x00, 0x15, 0x60, 0x9e, 0x99, 0xab, 0xd4, +0x77, 0x9e, 0x9a, 0xc3, 0x5e, 0xbe, 0x8b, 0x38, +0x4e, 0xe4, 0xfa, 0x7d, 0x3f, 0xd3, 0xfd, 0x65, +0x17, 0xfc, 0xae, 0xdd, 0xba, 0x3f, 0xd1, 0xe6, +0xc4, 0xe9, 0xac, 0x86, 0x01, 0x38, 0x0b, 0x02, +0x20, 0x27, 0x4c, 0x02, 0x00, 0x45, 0x0c, 0x06, +0xd0, 0x8a, 0x4c, 0x12, 0x01, 0xa9, 0x8c, 0x7a, +0x5c, 0xd6, 0x0d, 0xdf, 0x9a, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xca, 0xa4, 0x2b, 0x0e, 0x0f, +0xff, 0x84, 0x81, 0x01, 0x04, 0xa3, 0x41, 0xdf, +0xf0, 0x50, 0x58, 0xc5, 0x54, 0x88, 0x4c, 0x37, +0x84, 0x58, 0xc2, 0xc0, 0x20, 0x0c, 0x35, 0xc1, +0x24, 0xc3, 0xb8, 0x1c, 0x0e, 0x68, 0x48, 0x68, +0xed, 0x6e, 0x40, 0xf3, 0x93, 0xf5, 0xce, 0x7f, +0xd2, 0x98, 0x82, 0x9a, 0x8a, 0x66, 0x5c, 0x72, +0x6e, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, 0x44, 0x80, +0xdd, 0x30, 0x5e, 0x40, 0xd2, 0x30, 0x8e, 0x81, +0x09, 0x30, 0xf6, 0x41, 0xd6, 0x32, 0x2a, 0x85, +0xc1, 0x3e, 0x18, 0x6d, 0xc7, 0x3d, 0xbe, 0x05, +0x63, 0x32, 0x1a, 0x40, 0xb6, 0x30, 0xcf, 0x81, +0x58, 0x30, 0x3b, 0x01, 0xee, 0x30, 0x0c, 0x82, +0x2d, 0x30, 0x2e, 0xc3, 0xde, 0x30, 0x22, 0xc1, +0x46, 0x30, 0x05, 0x80, 0x2f, 0x0b, 0x80, 0x08, +0x0d, 0xd1, 0x64, 0x4d, 0x29, 0x94, 0x4f, 0xb6, +0x8f, 0x38, 0x1d, 0xf6, 0xf4, 0xdb, 0xbd, 0x97, +0xd9, 0xa3, 0xde, 0x8f, 0x56, 0xaa, 0xbf, 0xfc, +0xd5, 0x9e, 0xcb, 0x32, 0x7e, 0x73, 0xa7, 0xb3, +0xa1, 0xbf, 0x0e, 0x56, 0x60, 0x15, 0x00, 0xce, +0x54, 0x02, 0xd0, 0xc0, 0x35, 0x04, 0xf4, 0xc0, +0x92, 0x09, 0xd0, 0xc1, 0x77, 0x1e, 0x2c, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x82, 0xca, 0xf8, 0x2b, +0x0e, 0x0f, 0xff, 0x84, 0x80, 0xe4, 0x84, 0xe3, +0x95, 0xff, 0x6c, 0x94, 0xc9, 0xc4, 0xe8, 0x3c, +0xe6, 0x4d, 0xde, 0x4c, 0x6b, 0x89, 0xc0, 0xc4, +0x3c, 0x51, 0x4c, 0x34, 0x42, 0x7c, 0xc3, 0xe0, +0x18, 0x0c, 0x44, 0xc2, 0x5c, 0xec, 0xc8, 0x45, +0x92, 0x15, 0x1b, 0xc9, 0x17, 0x96, 0x54, 0xce, +0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xfa, 0xd3, 0x10, 0x53, 0x51, +0x4c, 0xcb, 0x8e, 0x4d, 0xea, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0x50, 0x41, 0x0a, 0x30, 0x6c, 0x81, 0x07, 0x30, +0xa2, 0xc1, 0x50, 0x31, 0x17, 0x02, 0x5f, 0x32, +0x73, 0x47, 0x54, 0x3f, 0xec, 0xb9, 0xe4, 0x3f, +0x87, 0x46, 0xea, 0x32, 0x5f, 0x81, 0x29, 0x30, +0xe8, 0x41, 0x6d, 0x30, 0x3e, 0xc2, 0x2d, 0x30, +0x18, 0x42, 0x76, 0x30, 0x3d, 0x84, 0x63, 0x30, +0x2d, 0x01, 0x75, 0x30, 0x09, 0x40, 0x38, 0x06, +0x00, 0x12, 0x07, 0x61, 0x35, 0x27, 0x1e, 0x29, +0x1e, 0x7d, 0xf9, 0xd5, 0xa0, 0xdf, 0xd4, 0x8b, +0x3f, 0xda, 0xea, 0xfe, 0xb4, 0x9a, 0xdf, 0xdf, +0x5b, 0xff, 0xd7, 0xff, 0xff, 0xff, 0x55, 0xe8, +0xdf, 0xfe, 0xff, 0x2f, 0x93, 0xff, 0x4b, 0x7f, +0xed, 0x4f, 0x1b, 0xd0, 0xb3, 0xee, 0xaa, 0xfd, +0x06, 0x01, 0x38, 0x0c, 0x42, 0x10, 0x2c, 0xcc, +0x04, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xcb, +0xdc, 0x3b, 0x0e, 0x0f, 0xfd, 0xa4, 0xc1, 0x0d, +0x85, 0x23, 0x41, 0xff, 0x6c, 0x90, 0x00, 0x4e, +0x0c, 0x0a, 0x50, 0x9b, 0xcc, 0x19, 0xe1, 0xde, +0x0c, 0xac, 0x7e, 0x63, 0x8e, 0xa3, 0x1d, 0xa0, +0xc7, 0x4c, 0x9b, 0x4c, 0x46, 0x85, 0x20, 0xc3, +0x48, 0x29, 0x8c, 0x3d, 0xc1, 0xac, 0xc4, 0x40, +0x2a, 0x0e, 0xc0, 0x98, 0x49, 0x2d, 0x50, 0x3c, +0xf1, 0x49, 0x7d, 0x7c, 0x2a, 0x4c, 0x41, 0x4d, +0x45, 0x33, 0x2e, 0x39, 0x37, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0x30, 0x51, 0x01, 0x13, 0x30, 0x6c, 0x41, +0x18, 0x30, 0xa1, 0x01, 0x71, 0x31, 0x14, 0xc2, +0x9c, 0x32, 0x6d, 0x08, 0x11, 0x3f, 0xc7, 0x7f, +0x65, 0x3f, 0x62, 0x07, 0xa7, 0x32, 0x58, 0xc1, +0x74, 0x30, 0xe3, 0x01, 0x4a, 0x30, 0x39, 0x02, +0x1e, 0x30, 0x20, 0x82, 0x6f, 0x30, 0x45, 0x44, +0x58, 0x30, 0x32, 0x41, 0x70, 0x30, 0x0a, 0x80, +0x37, 0x04, 0x80, 0x10, 0x06, 0x48, 0x93, 0x13, +0x4b, 0x4b, 0x0f, 0xb6, 0xcd, 0x9c, 0x52, 0x76, +0xed, 0xad, 0xf5, 0x7f, 0x6f, 0x55, 0xbd, 0xfd, +0x7e, 0x9f, 0xed, 0x5f, 0xfc, 0xfd, 0xed, 0xf9, +0xff, 0xd9, 0x5f, 0xf4, 0xff, 0xd3, 0xaa, 0xd3, +0xff, 0x7a, 0x7e, 0xb7, 0xfc, 0x7f, 0xb1, 0x96, +0xfc, 0x39, 0x41, 0x80, 0x40, 0x02, 0xf8, 0x00, +0x0a, 0xe3, 0x01, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xcd, 0x2d, 0x61, 0x0c, 0x0f, 0xb4, 0x4d, +0xc0, 0xde, 0x85, 0x23, 0x41, 0xff, 0x6c, 0x94, +0x2c, 0x13, 0x53, 0x02, 0xd8, 0x26, 0x83, 0x07, +0x14, 0x76, 0x73, 0x2e, 0xf3, 0x8f, 0xf3, 0xb7, +0xd7, 0x59, 0x31, 0xf6, 0x26, 0xa3, 0x12, 0x71, +0x4b, 0x30, 0xd7, 0x0a, 0xd3, 0x0f, 0x60, 0x74, +0x31, 0x0d, 0x0b, 0xb3, 0xaf, 0x2d, 0x0e, 0x44, +0x52, 0x6f, 0x24, 0x5e, 0x59, 0x53, 0x3a, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xeb, 0x4c, 0x41, 0x4d, 0x45, 0x33, +0x2e, 0x39, 0x37, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x30, 0x47, 0x40, 0xf6, 0x30, +0x5e, 0x01, 0x03, 0x30, 0x8b, 0xc1, 0x5c, 0x30, +0xef, 0x02, 0x7d, 0x32, 0x1a, 0xc7, 0xae, 0x3d, +0xb5, 0x3c, 0x4a, 0x3d, 0x5d, 0x47, 0x52, 0x32, +0x07, 0x81, 0x83, 0x30, 0xc1, 0xc0, 0xff, 0x30, +0x2c, 0x41, 0xcd, 0x30, 0x22, 0xc2, 0x18, 0x30, +0x42, 0x03, 0xc3, 0x35, 0xe4, 0xf4, 0xc5, 0x22, +0xc0, 0x40, 0x15, 0x5b, 0xa0, 0x1a, 0xd6, 0x2d, +0x19, 0xed, 0x08, 0xf5, 0x18, 0xf4, 0xf5, 0xb5, +0x17, 0xdb, 0x6b, 0xfd, 0xdf, 0xff, 0xed, 0xf5, +0x6e, 0x3b, 0x4f, 0xd0, 0xef, 0xa3, 0x75, 0x14, +0xad, 0xff, 0xa1, 0x06, 0x00, 0xd8, 0x0b, 0x46, +0x00, 0x48, 0x15, 0x66, 0x02, 0xb0, 0x26, 0x06, +0x06, 0x38, 0x4c, 0x66, 0x0f, 0x40, 0xea, 0x46, +0x65, 0x4f, 0x0b, 0x87, 0x8c, 0xff, 0xfb, 0x92, +0xc4, 0xff, 0x83, 0xcd, 0x35, 0x5f, 0x0c, 0x0f, +0xb4, 0x4d, 0xc1, 0x0d, 0x85, 0x23, 0x41, 0xff, +0x6c, 0x90, 0x4e, 0x88, 0x64, 0x32, 0x4c, 0xe6, +0x26, 0x02, 0x9c, 0x61, 0xb0, 0x16, 0x86, 0x1e, +0xa0, 0xfa, 0x62, 0x14, 0x19, 0x47, 0x58, 0x64, +0x1c, 0x8e, 0xa4, 0x1e, 0x78, 0xa4, 0xbe, 0xbe, +0x15, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd4, 0x98, 0x82, 0x9a, +0x8a, 0x66, 0x5c, 0x72, 0x6f, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x00, 0x01, 0xc9, +0xd9, 0x00, 0x00, 0x03, 0x01, 0x48, 0x04, 0x73, +0x01, 0xc4, 0x04, 0xc3, 0x02, 0xc0, 0x07, 0x13, +0x04, 0xec, 0x0e, 0x03, 0x0b, 0x70, 0x2d, 0x93, +0x4c, 0x55, 0x6d, 0x13, 0x4a, 0x68, 0x2b, 0x93, +0x0b, 0x04, 0x08, 0xa3, 0x7c, 0x0e, 0x8c, 0x48, +0x8a, 0x31, 0x32, 0xa4, 0xca, 0x73, 0xc3, 0x1a, +0x96, 0x8b, 0x4a, 0xe1, 0x43, 0x35, 0xb7, 0xdb, +0x3d, 0xff, 0xd2, 0xfe, 0xb4, 0xc7, 0x71, 0xa7, +0x33, 0x59, 0x01, 0x8e, 0xac, 0xc0, 0x1c, 0x01, +0xa4, 0xc0, 0x16, 0x03, 0x08, 0xc0, 0x71, 0x05, +0x6c, 0xc0, 0xf8, 0x0a, 0xc8, 0xc2, 0x59, 0x21, +0x04, 0xcf, 0x70, 0xfd, 0xa4, 0xfc, 0x6e, 0x0c, +0xcc, 0xa2, 0x8a, 0xe8, 0xc5, 0xb4, 0x60, 0xcc, +0x3f, 0x43, 0x64, 0xc4, 0x60, 0x27, 0x0c, 0xff, +0xfb, 0x92, 0xc4, 0xff, 0x83, 0xcb, 0x0c, 0x29, +0x0e, 0x0f, 0xff, 0x84, 0x81, 0x12, 0x05, 0x23, +0x41, 0xff, 0x6c, 0x90, 0x4b, 0xc3, 0xfc, 0xf1, +0x50, 0xc2, 0x15, 0x12, 0xed, 0xd4, 0x8b, 0xc5, +0x2a, 0x67, 0x5f, 0xff, 0xfd, 0x7f, 0xff, 0xff, +0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x69, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xea, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x30, +0x3e, 0xc0, 0xe0, 0x30, 0x51, 0x00, 0xf9, 0x30, +0x77, 0x41, 0x5a, 0x30, 0xcc, 0x02, 0x83, 0x31, +0xcc, 0x47, 0xbe, 0x3b, 0xbc, 0xbc, 0x98, 0x3b, +0x71, 0x47, 0x70, 0x31, 0xb9, 0x81, 0xb7, 0x30, +0xa0, 0x40, 0xa1, 0x30, 0x1c, 0x41, 0x7b, 0x30, +0x28, 0xc1, 0xc4, 0x30, 0x43, 0x03, 0x35, 0x35, +0xf4, 0x2c, 0xc5, 0x22, 0x22, 0xce, 0xae, 0x68, +0x67, 0x2b, 0x16, 0x9c, 0xfd, 0xae, 0xf3, 0x1e, +0xbe, 0xbf, 0xff, 0xff, 0xbf, 0xfd, 0xdf, 0xdf, +0xaf, 0xf7, 0x7d, 0x1b, 0xba, 0x2f, 0xd7, 0xd2, +0x83, 0x00, 0x54, 0x06, 0x23, 0x00, 0x84, 0x0b, +0xf3, 0x01, 0xf0, 0x15, 0x43, 0x04, 0x2c, 0x2a, +0x93, 0x09, 0xf8, 0x82, 0x43, 0x41, 0xaf, 0xe8, +0xc3, 0x40, 0x30, 0x81, 0x63, 0x0a, 0xbc, 0x2b, +0x53, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x82, 0x48, +0xf8, 0x55, 0x1f, 0x4f, 0xf0, 0x47, 0x21, 0x16, +0x85, 0x23, 0x01, 0xff, 0x6c, 0x90, 0x05, 0xd8, +0x18, 0x43, 0x03, 0xf0, 0x0d, 0xe3, 0x04, 0x5c, +0x0a, 0x73, 0x04, 0xa8, 0x10, 0xe3, 0xc2, 0x48, +0x07, 0x29, 0xa5, 0xc3, 0xaf, 0x0e, 0x45, 0xeb, +0x9c, 0xb2, 0xaf, 0xff, 0xec, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0x29, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xf5, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x30, 0x36, 0x00, 0xc7, 0x30, 0x45, 0xc0, +0xe0, 0x30, 0x66, 0x81, 0x3f, 0x30, 0xaf, 0xc2, +0x56, 0x31, 0x8d, 0x07, 0x35, 0x3a, 0x27, 0xf8, +0x61, 0x39, 0xe6, 0x06, 0xf1, 0x31, 0x7c, 0x41, +0xa6, 0x30, 0x87, 0x00, 0x6c, 0x30, 0x13, 0x01, +0x3c, 0x30, 0x27, 0x01, 0x83, 0x30, 0x3e, 0xc2, +0xc0, 0x3a, 0xfe, 0x23, 0x22, 0x19, 0x2e, 0xf3, +0x29, 0x8d, 0x63, 0xdb, 0x2f, 0xec, 0x7f, 0x8e, +0xef, 0xe8, 0x57, 0xff, 0x4f, 0xff, 0xfd, 0x7f, +0xf7, 0xfa, 0xbf, 0xa3, 0xdf, 0xf5, 0xff, 0x49, +0x80, 0x1c, 0x02, 0xf9, 0x80, 0x50, 0x05, 0xd1, +0x81, 0x0e, 0x0a, 0x79, 0x82, 0x34, 0x14, 0xf1, +0x85, 0x4a, 0x40, 0x29, 0xa2, 0xb1, 0xec, 0xe9, +0xa1, 0xea, 0x3f, 0xc9, 0x85, 0xa0, 0x15, 0x71, +0x83, 0x06, 0x0c, 0xff, 0xfb, 0x92, 0xc4, 0xff, +0x83, 0xca, 0x30, 0x29, 0x10, 0x0f, 0xff, 0x84, +0x81, 0x27, 0x84, 0xe3, 0x01, 0xff, 0xec, 0x90, +0x39, 0x81, 0xfe, 0x07, 0x29, 0x82, 0x24, 0x05, +0x71, 0x82, 0x4e, 0x09, 0x09, 0xdf, 0xa7, 0x83, +0x94, 0x12, 0xed, 0xd4, 0x8b, 0xc5, 0x2a, 0x67, +0x5e, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xdd, 0xff, 0xff, 0xff, 0xfd, 0x69, 0x88, 0x29, +0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xea, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x30, 0x36, 0xc0, 0xcc, 0x30, 0x45, +0x00, 0xeb, 0x30, 0x65, 0x41, 0x50, 0x30, 0xac, +0x82, 0x79, 0x31, 0x86, 0xc7, 0x9c, 0x39, 0xfe, +0xbb, 0x6e, 0x39, 0xbe, 0x47, 0x58, 0x31, 0x75, +0x01, 0xcf, 0x30, 0x82, 0xc0, 0x4f, 0x30, 0x0e, +0x41, 0x31, 0x30, 0x2b, 0xc1, 0x7a, 0x30, 0x42, +0x82, 0xb7, 0x3b, 0x8d, 0xf3, 0x27, 0x18, 0x2e, +0xeb, 0x0e, 0x8c, 0xe5, 0xcb, 0x5c, 0xeb, 0x47, +0xa3, 0xa2, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xfe, +0x9f, 0xfe, 0x8f, 0xdb, 0x47, 0xd2, 0x60, 0x03, +0x80, 0xb0, 0x60, 0x19, 0x81, 0x6a, 0x60, 0x48, +0x02, 0x90, 0x60, 0x95, 0x85, 0x2a, 0x61, 0x64, +0x0f, 0xc8, 0x69, 0x1f, 0xf9, 0x30, 0x68, 0xeb, +0x0f, 0xb0, 0x61, 0x79, 0x85, 0x4e, 0x60, 0xc6, +0x03, 0x10, 0x60, 0x80, 0x01, 0xff, 0xfb, 0x90, +0xc4, 0xff, 0x83, 0xc9, 0xd4, 0x29, 0x12, 0x0f, +0xff, 0x64, 0x81, 0x23, 0x05, 0x23, 0x01, 0xff, +0xec, 0x90, 0xd8, 0x60, 0x88, 0x81, 0x72, 0x60, +0x91, 0x02, 0x60, 0x77, 0x4a, 0x80, 0xa4, 0xf4, +0xf8, 0x71, 0xe1, 0xc8, 0xbd, 0x70, 0x4e, 0xca, +0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xb3, 0x4a, 0x62, 0x0a, 0x6a, +0x29, 0x99, 0x71, 0xc9, 0xbd, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x30, 0x36, 0x80, 0xd1, +0x30, 0x44, 0xc0, 0xf2, 0x30, 0x63, 0x81, 0x63, +0x30, 0xa9, 0xc2, 0x9a, 0x31, 0x7f, 0x88, 0x01, +0x39, 0xd2, 0xfe, 0x61, 0x39, 0x92, 0x87, 0xbd, +0x31, 0x6d, 0xc1, 0xf4, 0x30, 0x7d, 0x80, 0x2c, +0x30, 0x08, 0x81, 0x26, 0x30, 0x2f, 0x81, 0x73, +0x30, 0x46, 0xc2, 0xa8, 0x3c, 0x5d, 0xa3, 0x2a, +0x19, 0x2e, 0x53, 0x0d, 0x8d, 0x63, 0x95, 0x9c, +0xba, 0x53, 0xe9, 0x67, 0xfe, 0xef, 0x5f, 0xff, +0xff, 0xe9, 0xfa, 0x3f, 0xf9, 0x3f, 0x7b, 0xf4, +0xff, 0xfe, 0xfa, 0x40, 0x80, 0x2a, 0x98, 0x07, +0x40, 0x58, 0x18, 0x13, 0x60, 0xa1, 0x98, 0x27, +0x41, 0x44, 0x18, 0x5d, 0x63, 0xe0, 0x9a, 0x63, +0x9d, 0xc1, 0x9a, 0x55, 0xa3, 0xdb, 0x98, 0x62, +0x01, 0x4f, 0x18, 0x32, 0xe0, 0xc4, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc9, 0x7c, 0x2b, 0x12, +0x0f, 0xff, 0x64, 0x81, 0x27, 0x04, 0xe3, 0x01, +0xff, 0xec, 0x90, 0x98, 0x20, 0x20, 0x79, 0x98, +0x21, 0x80, 0x60, 0x18, 0x23, 0xa0, 0xa0, 0x9d, +0xba, 0xd8, 0x19, 0x31, 0x35, 0xdc, 0x48, 0x7e, +0x1c, 0xa4, 0xce, 0xbd, 0xbf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, +0x31, 0x05, 0x35, 0x14, 0xcc, 0xb8, 0xe4, 0xdd, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x32, 0xfc, +0xb6, 0x33, 0xa8, 0xdb, 0x35, 0x55, 0x42, 0x39, +0x12, 0x63, 0x31, 0x49, 0xc7, 0x58, 0x38, 0x75, +0xb9, 0x3e, 0x38, 0x3e, 0xc7, 0x1c, 0x31, 0x39, +0x01, 0xd5, 0x30, 0x69, 0x40, 0x01, 0x30, 0x01, +0xc0, 0xf3, 0x32, 0xc5, 0x3a, 0x34, 0x02, 0x47, +0x32, 0xc0, 0xb9, 0x30, 0x94, 0x10, 0x41, 0xd6, +0x75, 0x19, 0x10, 0x87, 0x3d, 0x1e, 0x8f, 0xfe, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, +0x21, 0x01, 0x38, 0xc0, 0x41, 0x02, 0xac, 0xc0, +0xa4, 0x04, 0xe8, 0xc1, 0x4b, 0x09, 0xec, 0xc3, +0x0a, 0x1e, 0x60, 0xd3, 0xf3, 0xe9, 0x68, 0xd3, +0x7c, 0x1e, 0x48, 0xc3, 0x2f, 0x0a, 0x5c, 0xc1, +0x9e, 0x06, 0x20, 0xc1, 0x00, 0x03, 0xd8, 0xc1, +0x09, 0x03, 0x24, 0xc1, 0x16, 0x05, 0x38, 0xec, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc9, 0xe8, +0x2b, 0x12, 0x0f, 0xff, 0x64, 0x81, 0x1e, 0x05, +0x23, 0x01, 0xff, 0xec, 0x90, 0x98, 0x00, 0xc9, +0x69, 0xa8, 0xe3, 0xc3, 0x91, 0xba, 0xf8, 0x55, +0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0xff, 0xff, 0xff, 0xff, 0x52, 0x62, 0x0a, 0x6a, +0x29, 0x99, 0x71, 0xc9, 0xba, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0x32, 0xf8, 0xbb, 0x33, 0xa4, 0xe2, 0x35, 0x31, +0x51, 0x38, 0xe6, 0x7c, 0x31, 0x42, 0x87, 0xa9, +0x38, 0x49, 0xfb, 0xa1, 0x38, 0x13, 0x87, 0x6f, +0x31, 0x31, 0xc1, 0xf4, 0x01, 0x06, 0x4a, 0x40, +0x07, 0x41, 0x97, 0xc9, 0x89, 0xa1, 0xf1, 0xd1, +0x97, 0x65, 0xa1, 0x84, 0xc0, 0x7a, 0x0f, 0x33, +0x98, 0xd6, 0xc1, 0x97, 0xfb, 0xff, 0xff, 0x77, +0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfb, +0xff, 0xfe, 0x92, 0x40, 0x12, 0x4c, 0x04, 0x80, +0x29, 0x0c, 0x0a, 0xd0, 0x4c, 0xcc, 0x15, 0x80, +0x9b, 0x0c, 0x32, 0xb1, 0xdc, 0x4d, 0x4b, 0xee, +0x47, 0xcd, 0x44, 0x51, 0xda, 0xcc, 0x34, 0xc0, +0xa3, 0x0c, 0x1a, 0x90, 0x62, 0x4c, 0x10, 0x10, +0x3f, 0x4c, 0x10, 0x40, 0x34, 0x0c, 0x11, 0x10, +0x57, 0x4e, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc8, 0x3c, 0x23, 0x14, 0x0e, 0xff, 0xa2, 0x81, +0x1f, 0x05, 0x23, 0x01, 0xff, 0xec, 0x90, 0xbd, +0x94, 0x04, 0x88, 0x9a, 0xee, 0x24, 0x3f, 0x0e, +0x52, 0x66, 0xe5, 0xed, 0xfb, 0xff, 0xd7, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, +0x69, 0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, +0xf5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x32, 0xfc, 0xbe, 0x33, 0x90, 0xe9, +0x35, 0x1d, 0x5c, 0x38, 0xaa, 0x97, 0x31, 0x3b, +0x47, 0xf6, 0x38, 0x1b, 0x3d, 0xea, 0x37, 0xe5, +0xc7, 0xbc, 0x31, 0x29, 0x82, 0x13, 0x30, 0x60, +0x40, 0x22, 0x30, 0x00, 0x00, 0xdd, 0x33, 0x35, +0x28, 0x34, 0x6a, 0x2d, 0x33, 0x08, 0xb1, 0x30, +0xa4, 0x0e, 0x40, 0x0b, 0x3a, 0x8c, 0xac, 0x39, +0x4e, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, +0xff, 0x6f, 0xff, 0xe8, 0xff, 0xff, 0xa4, 0x44, +0x02, 0x81, 0x80, 0xbe, 0x05, 0xc9, 0x81, 0xa4, +0x0a, 0xc1, 0x83, 0x3a, 0x15, 0xb9, 0x87, 0x80, +0x42, 0x61, 0xb1, 0x07, 0xfc, 0xa1, 0xaf, 0xe0, +0x42, 0x31, 0x87, 0xca, 0x16, 0xf9, 0x83, 0xe0, +0x0e, 0x11, 0x82, 0x50, 0x09, 0x41, 0x82, 0x52, +0x07, 0xc9, 0x82, 0x64, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc8, 0x50, 0x25, 0x14, 0x0e, 0xff, +0xa2, 0x81, 0x23, 0x85, 0x23, 0x01, 0xff, 0xec, +0x90, 0x0d, 0x01, 0xe2, 0x3e, 0x19, 0x58, 0x1a, +0x38, 0x35, 0xf8, 0x72, 0x1f, 0xa7, 0xc0, 0xfa, +0xb6, 0x7d, 0xdf, 0xea, 0xff, 0xff, 0xff, 0xff, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xea, 0x4c, 0x41, +0x4d, 0x45, 0x33, 0x2e, 0x39, 0x37, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x32, 0x88, 0xa7, 0x33, +0x0c, 0xce, 0x34, 0x51, 0x3b, 0x37, 0x66, 0x58, +0x31, 0x0c, 0x87, 0x3d, 0x36, 0xf1, 0xf8, 0x47, +0x36, 0xc4, 0x07, 0x09, 0x30, 0xfd, 0x41, 0xe6, +0x30, 0x4f, 0x00, 0x35, 0x30, 0x04, 0x40, 0xb2, +0x35, 0xd3, 0xe4, 0xdf, 0xfd, 0x83, 0x56, 0xa4, +0x8c, 0x44, 0x09, 0x47, 0xe7, 0x26, 0x5d, 0x0d, +0xfa, 0x7f, 0xff, 0x67, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf4, 0xff, 0xa4, 0x0a, 0x02, 0x59, 0x80, +0xcc, 0x05, 0x91, 0x81, 0xba, 0x0a, 0x79, 0x83, +0x54, 0x15, 0x21, 0x87, 0xc6, 0x40, 0xb9, 0xb2, +0xb1, 0xf0, 0x19, 0xb1, 0x82, 0x40, 0xa9, 0x88, +0x04, 0x16, 0x81, 0x83, 0xf2, 0x0e, 0x09, 0x82, +0x4e, 0x09, 0x79, 0x82, 0x44, 0x08, 0x01, 0x82, +0x5a, 0x0d, 0x89, 0xe0, 0xc1, 0x99, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc8, 0x98, 0x23, 0x14, +0x0e, 0xff, 0xa2, 0x81, 0x29, 0x05, 0x22, 0xc1, +0xff, 0xec, 0x90, 0x40, 0x22, 0x1b, 0xb5, 0xc7, +0xfe, 0x1c, 0xa4, 0xb7, 0x85, 0xb5, 0xfd, 0x3f, +0xf6, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xff, +0xff, 0xff, 0xff, 0x6e, 0x84, 0xc4, 0x14, 0xd4, +0x53, 0x32, 0xe3, 0x93, 0x75, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x32, 0x8c, +0xa8, 0x32, 0xf8, 0xd5, 0x34, 0x3d, 0x44, 0x37, +0x2a, 0x6f, 0x31, 0x05, 0xc7, 0x7a, 0x36, 0xc4, +0x3a, 0x1e, 0x36, 0x97, 0x47, 0x48, 0x30, 0xf5, +0x01, 0xff, 0x30, 0x4a, 0xc0, 0x4c, 0x30, 0x08, +0x00, 0xa7, 0x36, 0x2b, 0xc0, 0xe1, 0x1c, 0xd3, +0x5a, 0x23, 0xcc, 0x4a, 0x06, 0x47, 0xd7, 0x1a, +0x5b, 0x0e, 0x75, 0x23, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xfa, 0x0c, 0x00, 0x60, +0x10, 0x8c, 0x06, 0xf0, 0x2a, 0xcc, 0x0e, 0x60, +0x51, 0x0c, 0x1b, 0x90, 0xa4, 0xcc, 0x40, 0x01, +0xf8, 0x0d, 0xa2, 0x5f, 0x17, 0x0d, 0x98, 0x61, +0xf8, 0x0c, 0x42, 0x10, 0xb0, 0xcc, 0x20, 0x00, +0x6f, 0x8c, 0x12, 0x60, 0x4c, 0x8c, 0x11, 0xd0, +0x42, 0x4c, 0x12, 0x20, 0x6f, 0x8e, 0xea, 0x18, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc7, 0xf8, +0x23, 0x16, 0x0e, 0xff, 0x82, 0x81, 0x2f, 0x05, +0x62, 0xc1, 0xff, 0xec, 0x90, 0xc9, 0xc1, 0x51, +0xf1, 0xaf, 0xbf, 0x90, 0xfd, 0x3d, 0x87, 0xab, +0x67, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, +0xff, 0xff, 0xff, 0xff, 0xea, 0x4c, 0x41, 0x4d, +0x45, 0x33, 0x2e, 0x39, 0x37, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x32, 0x88, 0xab, 0x32, 0xf4, 0xda, 0x34, 0x19, +0x4f, 0x36, 0xfe, 0x82, 0x30, 0xfe, 0x07, 0xb7, +0x36, 0x93, 0xfb, 0xe1, 0x36, 0x68, 0x07, 0x85, +0x30, 0xed, 0x42, 0x16, 0x30, 0x45, 0x80, 0x63, +0x30, 0x0c, 0x40, 0x9c, 0x36, 0x73, 0xa4, 0xe2, +0x7b, 0xe3, 0x5d, 0xa2, 0x0c, 0x4c, 0x07, 0x43, +0x67, 0x16, 0x5c, 0xa0, 0xdf, 0x5a, 0x7d, 0x1f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, +0x4c, 0x01, 0x10, 0x0e, 0xcc, 0x07, 0x60, 0x28, +0x8c, 0x0e, 0xf0, 0x4e, 0xcc, 0x1c, 0x60, 0xa0, +0x0c, 0x41, 0xf1, 0xe9, 0xcd, 0xae, 0x6e, 0xa8, +0x4d, 0xa4, 0x51, 0xea, 0x4c, 0x43, 0xa0, 0xad, +0x0c, 0x20, 0x90, 0x6f, 0x4c, 0x12, 0x50, 0x4d, +0xcc, 0x11, 0x60, 0x44, 0x0c, 0x11, 0xb0, 0x73, +0x4e, 0xce, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc7, 0xe8, 0x23, 0x16, 0x0e, 0xff, 0x82, 0x81, +0x2b, 0x05, 0x22, 0xc1, 0xff, 0xec, 0x90, 0x2c, +0xc9, 0x01, 0x91, 0xfd, 0xae, 0x3f, 0xf0, 0xe5, +0x26, 0x6e, 0x5f, 0xff, 0xfd, 0x7f, 0xff, 0xff, +0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x69, +0x88, 0x29, 0xa8, 0xa6, 0x65, 0xc7, 0x26, 0xea, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x32, 0x84, 0xac, 0x32, 0xe0, 0xdf, +0x33, 0xfd, 0x58, 0x36, 0xba, 0x95, 0x30, 0xf6, +0x47, 0xee, 0x36, 0x61, 0x3d, 0x8c, 0x36, 0x36, +0xc7, 0xbe, 0x30, 0xe4, 0x82, 0x2d, 0x30, 0x41, +0x40, 0x76, 0x30, 0x0f, 0x80, 0x8f, 0x36, 0xcb, +0x78, 0xe3, 0x5b, 0x13, 0x60, 0x21, 0x4c, 0x52, +0x04, 0x43, 0x57, 0x1a, 0x5a, 0xb0, 0xe7, 0x52, +0x3d, 0x3f, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, +0xff, 0x47, 0xfa, 0x0c, 0x01, 0x80, 0x0c, 0x8c, +0x07, 0xd0, 0x26, 0xcc, 0x0f, 0x60, 0x4b, 0x8c, +0x1d, 0x50, 0x9b, 0x4c, 0x43, 0xc1, 0xda, 0x8d, +0xba, 0x1e, 0x33, 0x8d, 0xaf, 0x81, 0xdb, 0x0c, +0x45, 0x50, 0xa9, 0x4c, 0x20, 0xe0, 0x6e, 0x8c, +0x12, 0x20, 0x4e, 0x8c, 0x11, 0x10, 0x45, 0xcc, +0x11, 0x20, 0x76, 0x0e, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc8, 0x08, 0x23, 0x16, 0x0e, 0xff, +0x82, 0x81, 0x28, 0x85, 0x22, 0xc1, 0xff, 0xec, +0x90, 0xb2, 0x40, 0xc8, 0xc1, 0xd1, 0xf1, 0xaf, +0xbf, 0x90, 0xfd, 0x3e, 0x07, 0xd5, 0xfe, 0xaf, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf5, 0x26, 0x20, 0xa6, 0xa2, 0x99, 0x97, +0x1c, 0x9b, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x32, 0x80, 0xaf, 0x32, +0xd4, 0xe4, 0x33, 0xd9, 0x63, 0x36, 0x86, 0xa6, +0x30, 0xed, 0x88, 0x25, 0x36, 0x2c, 0xff, 0x25, +0x36, 0x03, 0x07, 0xf5, 0x30, 0xdc, 0x42, 0x42, +0x30, 0x3c, 0x00, 0x8b, 0x30, 0x13, 0x40, 0x82, +0x37, 0x13, 0x54, 0xe4, 0xba, 0x03, 0x63, 0x9f, +0x8c, 0x54, 0x05, 0x47, 0x27, 0x16, 0x2d, 0xe2, +0x17, 0xf6, 0xbf, 0xdd, 0xff, 0xa7, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xee, +0xf5, 0x18, 0x05, 0x20, 0x1a, 0x98, 0x13, 0x00, +0x55, 0x18, 0x24, 0xe0, 0xa8, 0x98, 0x44, 0xc1, +0x57, 0x18, 0x9e, 0xa4, 0x17, 0x9c, 0x08, 0x1f, +0x45, 0x9b, 0xef, 0xe4, 0x1a, 0x98, 0xa1, 0xc1, +0x79, 0x18, 0x4c, 0x60, 0xfb, 0x98, 0x29, 0xa0, +0xb7, 0x98, 0x26, 0x40, 0xa4, 0x18, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc8, 0x28, 0x23, 0x16, +0x0e, 0xff, 0x82, 0x81, 0x27, 0x85, 0x22, 0xc1, +0xff, 0xec, 0x90, 0x26, 0x21, 0x16, 0x9e, 0x0d, +0x69, 0x94, 0x06, 0x20, 0x0d, 0x9c, 0x3f, 0xef, +0xe5, 0x25, 0xb7, 0x2f, 0xff, 0xfe, 0xbf, 0xff, +0xff, 0xff, 0xff, 0xee, 0xab, 0xff, 0xfb, 0xbf, +0xdd, 0xeb, 0x4c, 0x41, 0x4d, 0x45, 0x33, 0x2e, +0x39, 0x37, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x32, 0x24, +0x96, 0x32, 0x58, 0xc9, 0x33, 0x3d, 0x3a, 0x35, +0x72, 0x61, 0x30, 0xc8, 0x47, 0x50, 0x35, 0x3a, +0xb8, 0xc2, 0x35, 0x17, 0x47, 0x26, 0x30, 0xb8, +0x02, 0x0b, 0x30, 0x2f, 0x40, 0x86, 0x30, 0x12, +0x80, 0x65, 0x36, 0x5a, 0xb8, 0xe0, 0x95, 0xd3, +0x57, 0x1a, 0x40, 0x44, 0x64, 0xd5, 0x75, 0xa5, +0xab, 0x3d, 0xd4, 0x8f, 0x4f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xfd, 0x1f, 0xe8, 0x30, 0x0c, +0x80, 0x2c, 0x30, 0x28, 0x40, 0xa1, 0x30, 0x4b, +0x81, 0x42, 0x30, 0x8d, 0x42, 0x95, 0x31, 0x44, +0x87, 0xe2, 0x38, 0x3f, 0xfc, 0x48, 0x38, 0x0d, +0x87, 0xea, 0x31, 0x4a, 0x42, 0xdf, 0x30, 0x9a, +0x81, 0xf2, 0x30, 0x52, 0x81, 0x72, 0x30, 0x4a, +0xc1, 0x51, 0x30, 0x49, 0x82, 0x3a, 0x3b, 0x8b, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0xc8, 0xa4, +0x25, 0x16, 0x0e, 0xff, 0x82, 0x81, 0x2f, 0x85, +0x22, 0x81, 0xff, 0xec, 0x90, 0x23, 0x27, 0x0f, +0x41, 0xc6, 0x76, 0xec, 0x3f, 0xf4, 0xf6, 0x1e, +0xaf, 0xff, 0xfa, 0xbf, 0xb3, 0xff, 0xff, 0xf7, +0xff, 0xbf, 0xff, 0xfe, 0xff, 0xa3, 0xfa, 0x93, +0x10, 0x53, 0x51, 0x4c, 0xcb, 0x8e, 0x4d, 0xd5, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x32, 0x18, 0x99, 0x32, 0x4c, 0xcc, 0x33, 0x19, +0x43, 0x35, 0x3e, 0x6e, 0x30, 0xc0, 0x07, 0x7b, +0x35, 0x07, 0xfa, 0x03, 0x34, 0xe5, 0x87, 0x51, +0x30, 0xb0, 0x42, 0x1c, 0x30, 0x2a, 0x00, 0x97, +0x30, 0x15, 0xc0, 0x56, 0x36, 0x92, 0x9c, 0xe1, +0x74, 0xe3, 0x59, 0x98, 0x80, 0x44, 0x94, 0xd6, +0x75, 0x67, 0x94, 0x77, 0xad, 0x3e, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x26, +0x01, 0xd8, 0x04, 0x26, 0x05, 0x40, 0x12, 0xc6, +0x09, 0xb8, 0x26, 0xa6, 0x12, 0x00, 0x4f, 0x46, +0x29, 0x68, 0xf2, 0xa7, 0x0d, 0x97, 0x3d, 0xa7, +0x07, 0x28, 0xf3, 0xe6, 0x2a, 0x00, 0x59, 0x46, +0x13, 0x78, 0x3d, 0xe6, 0x0a, 0x38, 0x2e, 0xe6, +0x09, 0x00, 0x2a, 0xc6, 0x08, 0xd8, 0x48, 0xe7, +0x63, 0x6e, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, +0xc8, 0x00, 0x23, 0x18, 0x0e, 0xff, 0x82, 0x81, +0x31, 0x05, 0x22, 0x81, 0xff, 0xec, 0x90, 0x64, +0x81, 0xc8, 0x3e, 0xce, 0x1d, 0xb7, 0xf2, 0x92, +0xdb, 0x97, 0xff, 0xff, 0x5d, 0x3f, 0xff, 0xff, +0xeb, 0xff, 0xf7, 0x7f, 0xff, 0xdd, 0xfe, 0xef, +0x5a, 0x62, 0x0a, 0x6a, 0x29, 0x99, 0x71, 0xc9, +0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0x32, 0x14, 0x98, 0x32, 0x38, 0xd1, +0x32, 0xfd, 0x48, 0x35, 0x02, 0x7d, 0x30, 0xb8, +0x47, 0xa2, 0x34, 0xd3, 0x3b, 0x30, 0x34, 0xb2, +0x47, 0x7a, 0x30, 0xa7, 0x02, 0x2d, 0x30, 0x25, +0x40, 0xa4, 0x30, 0x18, 0x00, 0x4b, 0x36, 0xca, +0x70, 0xe2, 0x14, 0x13, 0x5b, 0x17, 0x40, 0xc4, +0xe4, 0xd5, 0x75, 0xa7, 0x47, 0x90, 0xea, 0x47, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xf4, 0x18, 0x0a, 0x00, 0x0f, 0x18, 0x19, 0x60, +0x52, 0x98, 0x2d, 0xc0, 0xa8, 0x18, 0x54, 0x61, +0x5b, 0x98, 0xc0, 0xc4, 0x24, 0x1c, 0xe4, 0x7f, +0x97, 0x1c, 0xc6, 0x84, 0x2b, 0x18, 0xc3, 0x21, +0x8c, 0x98, 0x59, 0xc1, 0x18, 0x18, 0x2e, 0x80, +0xd8, 0x18, 0x28, 0x60, 0xc8, 0x98, 0x26, 0xc1, +0x54, 0x1e, 0x16, 0xc1, 0xff, 0xfb, 0x92, 0xc4, +0xff, 0x83, 0xc7, 0xec, 0x23, 0x18, 0x0e, 0xff, +0x82, 0x81, 0x31, 0x05, 0x22, 0x81, 0xff, 0xec, +0x90, 0x94, 0x8b, 0x97, 0x21, 0x77, 0xbb, 0x0f, +0xfc, 0xbe, 0xc1, 0xf5, 0x67, 0xfe, 0xff, 0x5f, +0x55, 0x1f, 0x67, 0x4f, 0xff, 0xff, 0xfd, 0x77, +0xff, 0xff, 0xdf, 0xfe, 0xff, 0x52, 0x62, 0x0a, +0x6a, 0x29, 0x99, 0x71, 0xc9, 0xbd, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x32, 0x10, 0x9b, 0x32, +0x2c, 0xd2, 0x32, 0xd9, 0x4f, 0x34, 0xc6, 0x88, +0x30, 0xaf, 0x07, 0xc9, 0x34, 0x9c, 0x7c, 0x4d, +0x34, 0x7c, 0x87, 0xa1, 0x30, 0x9e, 0x42, 0x3c, +0x30, 0x20, 0x00, 0xb5, 0x30, 0x1a, 0xc0, 0x3e, +0x37, 0x02, 0x4c, 0xe2, 0xf3, 0x03, 0x5d, 0x96, +0x00, 0xc4, 0xd4, 0xd6, 0x75, 0x67, 0x86, 0x37, +0xac, 0x60, 0x30, 0x0f, 0xc0, 0x05, 0x30, 0x26, +0x80, 0x6e, 0x30, 0x46, 0xc0, 0xef, 0x30, 0x82, +0x81, 0xf8, 0x31, 0x2d, 0x46, 0x13, 0x37, 0xac, +0x2e, 0x75, 0x37, 0x7d, 0x46, 0x1f, 0x31, 0x30, +0x02, 0x48, 0x30, 0x8a, 0x41, 0xa5, 0x30, 0x45, +0x41, 0x49, 0x30, 0x3a, 0x81, 0x32, 0x30, 0x37, +0xc2, 0x11, 0x38, 0x7a, 0x33, 0x16, 0x0a, 0x4c, +0x77, 0x21, 0xff, 0x8c, 0x52, 0x5b, 0xff, 0xfb, +0x92, 0xc4, 0xff, 0x83, 0xc7, 0xe4, 0x23, 0x18, +0x0e, 0xff, 0x82, 0x81, 0x3e, 0x05, 0x22, 0x41, +0xff, 0xec, 0x90, 0x04, 0xc5, 0x69, 0x38, 0xcf, +0x1b, 0x48, 0x0c, 0x68, 0xa2, 0x1d, 0x5d, 0x3f, +0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xfd, 0xdf, +0xff, 0x5a, 0x62, 0x0a, 0x6a, 0x29, 0x99, 0x71, +0xc9, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x40, 0x00, +0x64, 0xdb, 0x6d, 0xb5, 0xb2, 0x4a, 0xc1, 0xdb, +0xa3, 0xf9, 0x04, 0xa6, 0x38, 0xaf, 0x01, 0x21, +0xc3, 0xcc, 0xe2, 0x0f, 0x5c, 0x8f, 0x60, 0x85, +0x53, 0x5c, 0x72, 0xa0, 0x86, 0x38, 0x52, 0x42, +0x98, 0x90, 0xe2, 0xdd, 0x4d, 0x8c, 0x93, 0x72, +0x2c, 0xc7, 0x36, 0x37, 0x48, 0x08, 0x50, 0x9b, +0x75, 0xa6, 0x14, 0x51, 0xac, 0x54, 0x3d, 0x08, +0xcd, 0x2c, 0x34, 0x40, 0x0c, 0x1a, 0x13, 0xa6, +0xcc, 0x91, 0x91, 0xce, 0x84, 0x64, 0x0a, 0x9c, +0x38, 0x64, 0x5b, 0x4d, 0x6c, 0x53, 0x76, 0x3c, +0xc6, 0x36, 0x37, 0xc9, 0x88, 0x11, 0x9b, 0xb6, +0xa6, 0x34, 0x41, 0xb2, 0x64, 0x51, 0x6c, 0xcf, +0x36, 0x35, 0xc2, 0x8c, 0x1a, 0x93, 0x66, 0x7c, +0x64, 0xc1, 0xae, 0x54, 0x62, 0x00, 0x9a, 0x75, +0xff, 0xfb, 0x92, 0xc4, 0xff, 0x83, 0x46, 0x98, +0x23, 0x18, 0x0e, 0xff, 0x82, 0xa1, 0x4f, 0x85, +0x22, 0xc9, 0xff, 0xec, 0x90, 0x23, 0xd2, 0x0c, +0xaa, 0xb3, 0x4e, 0x24, 0x08, 0x78, 0xd4, 0x18, +0x14, 0x22, 0x69, 0xd1, 0x82, 0x87, 0x19, 0xe4, +0x03, 0x4f, 0xcc, 0x72, 0x23, 0x40, 0x18, 0x2a, +0x64, 0xe3, 0x54, 0x46, 0x41, 0xbc, 0xe0, 0x41, +0xa6, 0xbb, 0x62, 0x5a, 0x19, 0x2e, 0x9b, 0x62, +0x88, 0x12, 0x37, 0x12, 0x10, 0x0a, 0x6c, 0xb2, +0x1c, 0x51, 0xa0, 0xb0, 0x95, 0xe6, 0x12, 0xc6, +0xb0, 0x82, 0xa6, 0x9b, 0x28, 0x97, 0x38, 0xd4, +0x58, 0x58, 0x93, 0x35, 0x30, 0xea, 0x00, 0x29, +0x9a, 0xa2, 0x8e, 0x10, 0x6a, 0x1c, 0x5e, 0xd3, +0x45, 0x31, 0xe1, 0x8c, 0x83, 0x83, 0x23, 0x04, +0x1c, 0x68, 0x04, 0x4a, 0x29, 0xa2, 0x6a, 0x12, +0x8c, 0xc4, 0x09, 0x85, 0x31, 0x4d, 0x0c, 0x70, +0x1a, 0x59, 0x9e, 0x19, 0x54, 0x23, 0x38, 0xa4, +0x89, 0x32, 0xcf, 0x2b, 0x0c, 0xc2, 0x20, 0x21, +0xf0, 0xb1, 0x06, 0x60, 0x48, 0x7a, 0x66, 0x92, +0x8f, 0xc6, 0x31, 0x84, 0xc2, 0x00, 0x47, 0x08, +0x60, 0x42, 0x39, 0x96, 0x1a, 0x3b, 0x19, 0x44, +0x25, 0x69, 0x8a, 0x59, 0x10, 0xe0, 0x41, 0x02, +0x17, 0x11, 0x08, 0x64, 0x04, 0x96, 0xa6, 0x48, +0xe9, 0xf4, 0x61, 0x10, 0x3c, 0x00, 0x24, 0x30, +0x72, 0x83, 0x20, 0x99, 0x21, 0xa6, 0x91, 0x8c, +0x32, 0x66, 0x98, 0x23, 0x8d, 0x06, 0x0c, 0x00, +0x1c, 0x9a, 0x1c, 0x0c, 0x60, 0x14, 0xa4, 0xc5, +0x1d, 0x38, 0x80, 0x03, 0x0b, 0x00, 0x5b, 0xb0, +0x72, 0x09, 0x2e, 0x62, 0x82, 0xa6, 0x46, 0x10, +0x8a, 0x12, 0x05, 0x14, 0x48, 0x32, 0xe6, 0x02, +0x8f, 0x49, 0xc3, 0x10, 0x05, 0x4a, 0x60, 0x8a, +0xa2, 0x20, 0x81, 0x04, 0x80, 0x40, 0x58, 0x28, +0xc4, 0xdb, 0x30, 0xc1, 0x58, 0xc6, 0x00, 0x49, +0xe0, 0x0d, 0x0c, 0x38, 0x34, 0x6c, 0x05, 0x16, +0xaa, 0x46, 0x10, 0x0a, 0xe4, 0x02, 0x1a, 0x4d, +0x85, 0x02, 0x0e, 0x01, 0x23, 0xc1, 0x44, 0x2c, +0x93, 0x04, 0x15, 0xac, 0x04, 0x09, 0x20, 0x02, +0xa0, 0x86, 0x06, 0x9e, 0x80, 0xa1, 0xd7, 0x91, +0x82, 0x10, 0x99, 0x10, 0xb9, 0x0a, 0x11, 0xb7, +0x94, 0x1b, 0x65, 0xb9, 0xac, 0x3c, 0x1e, 0x9b, +0xd1, 0xa4, 0x51, 0x91, 0x70, 0x19, 0x51, 0x59, +0x95, 0x12, 0x8c, 0x13, 0x19, 0xa8, 0xd0, 0xa0, +0xd9, 0x93, 0x0c, 0x85, 0x04, 0x77, 0xb0, 0xd2, +0xcc, 0x6e, 0x0e, 0x90, 0x21, 0xa0, 0x6e, 0x8a, +0x98, 0xda, 0x44, 0xd3, 0x32, 0x15, 0x48, 0x02, +0x06, 0x81, 0xa1, 0x71, 0x04, 0x19, 0x1d, 0x40, +0xc5, 0x60, 0x05, 0x92, 0x62, 0xe5, 0xee, 0x4f, +0xa4, 0x26, 0x97, 0xc5, 0x45, 0x8b, 0x8c, 0xd2, +0xcb, 0xba, 0xd4, 0x11, 0xe5, 0x58, 0x53, 0x49, +0x0d, 0x98, 0x4a, 0x00, 0x5d, 0x84, 0x56, 0x6c, +0xea, 0xdc, 0xb5, 0x96, 0x8a, 0x74, 0xb4, 0x64, +0x8a, 0x7f, 0xd4, 0x05, 0xcd, 0x60, 0x2c, 0x95, +0x91, 0x29, 0xff, 0xfb, 0x92, 0xc4, 0xff, 0x80, +0x31, 0x95, 0xa3, 0x65, 0xac, 0xeb, 0x2d, 0xf4, +0xf1, 0x3a, 0xe6, 0xc1, 0xbc, 0x3d, 0xb8, 0xb1, +0xb2, 0x21, 0xa8, 0x60, 0xb7, 0x18, 0xc3, 0xe8, +0x93, 0x17, 0x51, 0xc2, 0x7c, 0x09, 0xb2, 0x8c, +0x5b, 0x4f, 0x12, 0x7a, 0x58, 0x4b, 0xb0, 0xe2, +0x49, 0x8b, 0x8a, 0xa0, 0x83, 0x1e, 0x45, 0xf8, +0xb1, 0x1d, 0xa4, 0x25, 0x20, 0x3d, 0x4a, 0xb2, +0x52, 0x70, 0x9b, 0xa5, 0x84, 0xf6, 0x21, 0x4a, +0x71, 0xe9, 0x58, 0x2d, 0xc7, 0x11, 0xbc, 0x65, +0x24, 0x49, 0x6a, 0x90, 0x9d, 0x2d, 0x96, 0xd3, +0x84, 0xfd, 0x32, 0x53, 0x05, 0xc9, 0x8c, 0x9c, +0xb4, 0x17, 0xe3, 0x89, 0x14, 0x65, 0x2f, 0x97, +0x16, 0x02, 0xdc, 0xd2, 0x5f, 0x4e, 0x14, 0x49, +0x92, 0xb8, 0x2e, 0x4a, 0xf2, 0xda, 0xb2, 0x73, +0x19, 0x4a, 0x63, 0x29, 0x76, 0x68, 0xb2, 0x1a, +0x4b, 0x47, 0xe9, 0xd2, 0xb9, 0x34, 0x5b, 0x0d, +0x26, 0x73, 0x45, 0x64, 0xfe, 0x3a, 0x97, 0x46, +0x93, 0x19, 0xa2, 0xc8, 0x73, 0x2a, 0x8f, 0xd3, +0xa5, 0x72, 0x68, 0xb0, 0x1a, 0x4e, 0x67, 0x2a, +0xa4, 0xfe, 0x3a, 0x97, 0x8d, 0x26, 0x33, 0x45, +0xc0, 0xe6, 0x55, 0x22, 0x4e, 0x96, 0xb3, 0x45, +0xe1, 0xcc, 0xe6, 0x72, 0xaa, 0x54, 0xc7, 0x53, +0x51, 0xa4, 0xfc, 0xe5, 0x74, 0x7f, 0x2a, 0x94, +0xa7, 0x4b, 0x59, 0xa2, 0xf0, 0xe6, 0x76, 0x7e, +0xaa, 0x54, 0xc7, 0x53, 0x61, 0xa4, 0xce, 0x72, +0xb8, 0xa7, 0x94, 0x4b, 0x93, 0xa5, 0xbc, 0xd1, +0x70, 0x43, 0x96, 0x93, 0xaa, 0x15, 0xd1, 0xd4, +0xd9, 0x4c, 0x41, 0x4d, 0x45, 0x33, 0x2e, 0x39, +0x37, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x4c, 0x41, 0x4d, 0x45, 0x33, 0x2e, +0x39, 0x37, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0xff, 0xfb, 0x92, 0xc4, +0x61, 0x83, 0xc0, 0x00, 0x01, 0xa4, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x34, 0x80, 0x00, 0x00, +0x04, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +0x55, 0x55, 0x55, 0x55, 0x55, 0x55, +}; + diff --git a/tests/check/generic/index.c b/tests/check/generic/index.c new file mode 100644 index 0000000000..5225f1698b --- /dev/null +++ b/tests/check/generic/index.c @@ -0,0 +1,140 @@ +/* GStreamer + * unit test for index setting on all elements + * Copyright (C) 2005 Thomas Vander Stichele + * Copyright (C) 2011 Tim-Philipp Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +static GList *elements = NULL; + +static void +setup (void) +{ + GList *features, *f; + GList *plugins, *p; + gchar **ignorelist = NULL; + const gchar *INDEX_IGNORE_ELEMENTS = NULL; + + GST_DEBUG ("getting elements for package %s", PACKAGE); + INDEX_IGNORE_ELEMENTS = g_getenv ("GST_INDEX_IGNORE_ELEMENTS"); + if (!g_getenv ("GST_NO_INDEX_IGNORE_ELEMENTS") && INDEX_IGNORE_ELEMENTS) { + GST_DEBUG ("Will ignore element factories: '%s'", INDEX_IGNORE_ELEMENTS); + ignorelist = g_strsplit (INDEX_IGNORE_ELEMENTS, " ", 0); + } + + plugins = gst_registry_get_plugin_list (gst_registry_get_default ()); + + for (p = plugins; p; p = p->next) { + GstPlugin *plugin = p->data; + + if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) + continue; + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), + gst_plugin_get_name (plugin)); + + for (f = features; f; f = f->next) { + GstPluginFeature *feature = f->data; + const gchar *name = gst_plugin_feature_get_name (feature); + gboolean ignore = FALSE; + + if (!GST_IS_ELEMENT_FACTORY (feature)) + continue; + + if (ignorelist) { + gchar **s; + + for (s = ignorelist; s && *s; ++s) { + if (g_str_has_prefix (name, *s)) { + GST_DEBUG ("ignoring element %s", name); + ignore = TRUE; + } + } + if (ignore) + continue; + } + + GST_DEBUG ("adding element %s", name); + elements = g_list_prepend (elements, (gpointer) g_strdup (name)); + } + gst_plugin_feature_list_free (features); + } + gst_plugin_list_free (plugins); + g_strfreev (ignorelist); +} + +static void +teardown (void) +{ + GList *e; + + for (e = elements; e; e = e->next) { + g_free (e->data); + } + g_list_free (elements); + elements = NULL; +} + +GST_START_TEST (test_set_index) +{ + GstElement *element; + GstIndex *idx; + GList *e; + + idx = gst_index_factory_make ("memindex"); + if (idx == NULL) + return; + + gst_object_ref_sink (idx); + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + gst_element_set_index (element, idx); + gst_object_unref (element); + } + + gst_object_unref (idx); +} + +GST_END_TEST; + +static Suite * +index_suite (void) +{ + Suite *s = suite_create ("index"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_checked_fixture (tc_chain, setup, teardown); + tcase_add_test (tc_chain, test_set_index); + + return s; +} + +GST_CHECK_MAIN (index); diff --git a/tests/check/generic/states.c b/tests/check/generic/states.c new file mode 100644 index 0000000000..3d7c89bc80 --- /dev/null +++ b/tests/check/generic/states.c @@ -0,0 +1,219 @@ +/* GStreamer + * + * unit test for state changes on all elements + * + * Copyright (C) <2005> Thomas Vander Stichele + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +static GList *elements = NULL; + +static void +setup () +{ + GList *features, *f; + GList *plugins, *p; + gchar **ignorelist = NULL; + const gchar *STATE_IGNORE_ELEMENTS = NULL; + + GST_DEBUG ("getting elements for package %s", PACKAGE); + STATE_IGNORE_ELEMENTS = g_getenv ("GST_STATE_IGNORE_ELEMENTS"); + if (!g_getenv ("GST_NO_STATE_IGNORE_ELEMENTS") && STATE_IGNORE_ELEMENTS) { + GST_DEBUG ("Will ignore element factories: '%s'", STATE_IGNORE_ELEMENTS); + ignorelist = g_strsplit (STATE_IGNORE_ELEMENTS, " ", 0); + } + + plugins = gst_registry_get_plugin_list (gst_registry_get ()); + + for (p = plugins; p; p = p->next) { + GstPlugin *plugin = p->data; + + if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) + continue; + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get (), + gst_plugin_get_name (plugin)); + + for (f = features; f; f = f->next) { + GstPluginFeature *feature = f->data; + const gchar *name = gst_plugin_feature_get_name (feature); + gboolean ignore = FALSE; + + if (!GST_IS_ELEMENT_FACTORY (feature)) + continue; + + if (ignorelist) { + gchar **s; + + for (s = ignorelist; s && *s; ++s) { + if (g_str_has_prefix (name, *s)) { + GST_DEBUG ("ignoring element %s", name); + ignore = TRUE; + } + } + if (ignore) + continue; + } + + GST_DEBUG ("adding element %s", name); + elements = g_list_prepend (elements, (gpointer) g_strdup (name)); + } + gst_plugin_feature_list_free (features); + } + gst_plugin_list_free (plugins); + g_strfreev (ignorelist); +} + +static void +teardown () +{ + GList *e; + + for (e = elements; e; e = e->next) { + g_free (e->data); + } + g_list_free (elements); + elements = NULL; +} + + +GST_START_TEST (test_state_changes_up_and_down_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_NULL); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + +GST_START_TEST (test_state_changes_up_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + +GST_START_TEST (test_state_changes_down_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + +Suite * +states_suite (void) +{ + Suite *s = suite_create ("states_ugly"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_checked_fixture (tc_chain, setup, teardown); + tcase_add_test (tc_chain, test_state_changes_up_and_down_seq); + tcase_add_test (tc_chain, test_state_changes_up_seq); + tcase_add_test (tc_chain, test_state_changes_down_seq); + + return s; +} + +GST_CHECK_MAIN (states); diff --git a/tests/check/gst-plugins-ugly.supp b/tests/check/gst-plugins-ugly.supp new file mode 100644 index 0000000000..d73d18645c --- /dev/null +++ b/tests/check/gst-plugins-ugly.supp @@ -0,0 +1,190 @@ +### amrnb suppressions +### these should/could be submitted to amrnb + +{ + + Memcheck:Cond + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + obj:/usr/lib/libamrnb.so* + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + obj:/usr/lib/libamrnb.so* + obj:/usr/lib/libamrnb.so* + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + obj:/usr/lib/libamrnb.so* + obj:/usr/lib/libamrnb.so* + obj:/usr/lib/libamrnb.so* + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + fun:acos + obj:/usr/lib/libamrnb.so* + obj:/usr/lib/libamrnb.so* + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode + fun:gst_amrnbenc_chain + fun:gst_pad_chain + fun:gst_pad_push +} + +{ + + Memcheck:Cond + fun:Levinson + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:Az_lsp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:acos + fun:Lsp_lsf + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:Lsf_wt + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} +{ + + Memcheck:Cond + fun:Vq_subvec + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:Lag_max + fun:Pitch_ol + fun:ol_ltp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:Pitch_ol + fun:ol_ltp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:cl_ltp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:searchFrac + fun:cl_ltp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:q_gain_pitch + fun:cl_ltp + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:set_sign12k2 + fun:code_10i40_35bits + fun:cbsearch + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:code_10i40_35bits + fun:cbsearch + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Cond + fun:gainQuant + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} + +{ + + Memcheck:Value2 + obj:/usr/lib/libamrnb.so.0.0.0 + fun:Speech_Encode_Frame + fun:Encoder_Interface_Encode +} diff --git a/tests/check/meson.build b/tests/check/meson.build new file mode 100644 index 0000000000..2c3ecb114e --- /dev/null +++ b/tests/check/meson.build @@ -0,0 +1,81 @@ +# name, condition when to skip the test and extra dependencies +ugly_tests = [ + [ 'elements/x264enc', not x264_dep.found(), [ x264_dep, gmodule_dep ] ], + [ 'elements/xingmux' ], + [ 'generic/states' ], +] + +# FIXME: unistd dependency or not tested yet on windows +if host_machine.system() != 'windows' + ugly_tests += [ + [ 'elements/amrnbenc', not amrnb_dep.found() ], + [ 'elements/mpeg2dec', not mpeg2_dep.found() or not cdata.has('HAVE_UNISTD_H'), [ gstvideo_dep ] ], + ] +endif + +test_defines = [ + '-UG_DISABLE_ASSERT', + '-UG_DISABLE_CAST_CHECKS', + '-DGST_CHECK_TEST_ENVIRONMENT_BEACON="GST_PLUGIN_LOADING_WHITELIST"', + '-DGST_TEST_FILES_PATH="' + meson.current_source_dir() + '/../files"', + '-DGST_USE_UNSTABLE_API', +] + +pluginsdirs = [] +if gst_dep.type_name() == 'pkgconfig' + pbase = dependency('gstreamer-plugins-base-' + api_version, required: true) + pluginsdirs = [gst_dep.get_pkgconfig_variable('pluginsdir'), + pbase.get_pkgconfig_variable('pluginsdir')] + gst_plugin_scanner_dir = gst_dep.get_pkgconfig_variable('pluginscannerdir') +else + gst_plugin_scanner_dir = subproject('gstreamer').get_variable('gst_scanner_dir') +endif +gst_plugin_scanner_path = join_paths(gst_plugin_scanner_dir, 'gst-plugin-scanner') + +test_deps = [gst_dep, gstbase_dep, gstcheck_dep, gstaudio_dep, gstapp_dep, + gstfft_dep, gstvideo_dep, gstpbutils_dep] + +libm = cc.find_library('m', required : false) + +# FIXME: valgrind_args: add suppressions $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-ugly.supp + +no_warn_args = [] +foreach arg : [ + '-Wno-missing-prototypes', + '-Wno-missing-declarations', + '-Wno-old-style-definition'] + if cc.has_argument(arg) + no_warn_args += [arg] + endif +endforeach + +foreach t : ugly_tests + fname = '@0@.c'.format(t.get(0)) + test_name = t.get(0).underscorify() + extra_deps = [ ] + if t.length() == 3 + extra_deps = t.get(2) + skip_test = t.get(1) + elif t.length() == 2 + skip_test = t.get(1) + else + skip_test = false + endif + if not skip_test + exe = executable(test_name, fname, + include_directories : [configinc], + c_args : ['-DHAVE_CONFIG_H=1' ] + test_defines + no_warn_args, + dependencies : [libm] + test_deps + extra_deps, + ) + + env = environment() + env.set('GST_PLUGIN_SYSTEM_PATH_1_0', '') + env.set('CK_DEFAULT_TIMEOUT', '20') + env.set('GST_PLUGIN_LOADING_WHITELIST', 'gstreamer', 'gst-plugins-base', + 'gst-plugins-good', 'gst-plugins-ugly@' + meson.build_root()) + env.set('GST_PLUGIN_PATH_1_0', [meson.build_root()] + pluginsdirs) + env.set('GST_REGISTRY', join_paths(meson.current_build_dir(), '@0@.registry'.format(test_name))) + env.set('GST_PLUGIN_SCANNER_1_0', gst_plugin_scanner_path) + test(test_name, exe, env: env, timeout: 3 * 60) + endif +endforeach diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000000..3714641a59 --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,3 @@ +if not get_option('tests').disabled() and gstcheck_dep.found() + subdir('check') +endif