mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-28 03:45:39 +00:00
mediainfo: remove
This looks bitrotten and abandoned, remove in an effort to declutter.
This commit is contained in:
parent
ca260bd833
commit
ef9a57d3fc
25 changed files with 0 additions and 3259 deletions
|
@ -1,3 +0,0 @@
|
|||
Original Authors
|
||||
----------------
|
||||
Stefan Sauer <ensonic@users.sf.net>
|
|
@ -1,510 +0,0 @@
|
|||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
|
||||
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
= Releases =
|
||||
|
||||
- bump version in configure.ac
|
||||
0.1.1 -> 0.2
|
||||
|
||||
- update NEWS
|
||||
|
||||
- commit
|
||||
git add configure.ac NEWS
|
||||
git commit -m"release: prepare for release"
|
||||
|
||||
- dist
|
||||
make dist
|
||||
|
||||
- tag
|
||||
git tag -a RELEASE-0.2 -m"release: 0.2"
|
||||
git push origin RELEASE-0.2
|
||||
|
||||
- release
|
||||
scp gst-mediainfo-0.2.tar.gz ensonic@people.freedesktop.org:public_html/files/
|
||||
|
||||
- bump versions in configure.ac
|
||||
0.2 -> 0.2.1
|
||||
|
||||
- commit
|
||||
git add configure.ac
|
||||
git commit -m"release: bump versions and back to development"
|
||||
|
||||
- update web-page
|
||||
|
||||
= Building =
|
||||
|
||||
in the case we need to update the vapi for yet unreleased gstreamer api, these
|
||||
are the steps. Right now its enough to install the vapi file from git
|
||||
|
||||
== update system vapi ==
|
||||
1) checkout vala from gnome git
|
||||
cd vala/mediainfo/vapi
|
||||
vala-gen-introspect gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10
|
||||
vapigen --vapidir . --library gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10/gstreamer-pbutils-0.10.gi
|
||||
git diff packages/gstreamer-pbutils-0.10/gstreamer-pbutils-0.10.metadata >vapi.gstreamer-pbutils-0.10.patch
|
||||
|
||||
2) install
|
||||
# suse, meego
|
||||
sudo cp gstreamer-pbutils-0.10.vapi /usr/share/vala/mediainfo/vapi/
|
||||
# ubuntu
|
||||
sudo cp gstreamer-pbutils-0.10.vapi /usr/share/vala-0.xxx/vapi/
|
||||
|
||||
== use jhbuild ==
|
||||
jhbuild build vala
|
||||
jhbuild shell
|
||||
|
||||
You might want to build these at least once:
|
||||
jhbuild build gnome-themes-standard gnome-icon-theme
|
||||
|
||||
${jhbuild_prefix}/share/vala-0.22/vapi/
|
||||
|
||||
= Hacking =
|
||||
|
||||
use G_MESSAGES_DEBUG="gst-mi" to see the logging
|
|
@ -1,36 +0,0 @@
|
|||
SUBDIRS = src po vapi
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/ABOUT-NLS \
|
||||
$(srcdir)/INSTALL \
|
||||
$(srcdir)/COPYING \
|
||||
$(srcdir)/aclocal.m4 \
|
||||
$(srcdir)/autoregen.sh \
|
||||
$(srcdir)/compile \
|
||||
$(srcdir)/config.guess \
|
||||
$(srcdir)/config.h.in \
|
||||
$(srcdir)/config.rpath \
|
||||
$(srcdir)/config.sub \
|
||||
$(srcdir)/configure.scan \
|
||||
$(srcdir)/depcomp \
|
||||
$(srcdir)/install-sh \
|
||||
$(srcdir)/intl \
|
||||
$(srcdir)/ltmain.sh \
|
||||
$(srcdir)/m4 \
|
||||
$(srcdir)/missing \
|
||||
$(srcdir)/mkinstalldirs \
|
||||
$(srcdir)/po/Makevars.template \
|
||||
$(srcdir)/po/Rules-quot \
|
||||
$(srcdir)/po/boldquot.sed \
|
||||
$(srcdir)/po/en@boldquot.header \
|
||||
$(srcdir)/po/en@quot.header \
|
||||
$(srcdir)/po/insert-header.sin \
|
||||
$(srcdir)/po/quot.sed \
|
||||
$(srcdir)/po/remove-potcdate.sin \
|
||||
$(srcdir)/ChangeLog
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = config.rpath
|
|
@ -1,5 +0,0 @@
|
|||
0.1 initial release (17.Jan.2011)
|
||||
================================================================================
|
||||
Initial version. Shows same info has gst-discoverer -v enhanced for end-users.
|
||||
Plays media.
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
= Media detail browser =
|
||||
The package contains a UI for browsing media files and showing details of the
|
||||
files.
|
||||
|
||||
= Usage =
|
||||
The left side of the window has a file-browser. This has the keyborad focus.
|
||||
Going through the files will show the media details immediately on the right
|
||||
side. When staying on a file for a moment, the file will be played.
|
||||
|
||||
The information shown on the left side is enhanced for human readability. E.g.
|
||||
codec and fomat names are turned into wikipedia links.
|
||||
|
||||
The UI has a compact mode for small screens (height < 600) where all streams
|
||||
are in one notebook.
|
213
mediainfo/TODO
213
mediainfo/TODO
|
@ -1,213 +0,0 @@
|
|||
= Inspiration =
|
||||
Simillar apps to take inspiration from:
|
||||
http://www.fourcc.org/identifier/gspot_example.png
|
||||
http://img.brothersoft.com/screenshots/softimage/g/gspot-190045-1.jpeg
|
||||
http://www.headbands.com/gspot/v26x/index.htm
|
||||
|
||||
= browsing =
|
||||
- if one has grillo installed we could use grillo sources in addition to local files
|
||||
- there should be a "open url" menu entry in addition
|
||||
- if initial directory contains a glob as a last entry, we could set a filter on
|
||||
the file-choser
|
||||
- when a stream plays we hide the file-browser pane or show a text entry
|
||||
- we could also take playlists and use totem-pl-parser
|
||||
- needs a list-view to show the playlist instead of the file-browser
|
||||
- if the input arg starts with '@' we could read the file and show uris listed
|
||||
line by lien in the tree view.
|
||||
|
||||
= compare =
|
||||
- dup detail pane and allow to pick a new file
|
||||
- create new Info() pane and reuse the DiscovererInfo
|
||||
- show differing entries in red
|
||||
- add a narrow vertical bar between the two details panes and mark blocks with a
|
||||
delta red
|
||||
- diffing one (broken) file against several known working files would be nice
|
||||
- it would build ranges for the group of files (e.g. for the video width)
|
||||
- it would highlight fields that the are different to any of the working files
|
||||
|
||||
= structural view/hex view =
|
||||
- make parsing elements post structural messages (if enabled via property)
|
||||
- message would contain:
|
||||
- stream offset in bytes
|
||||
- block identifier (e.g. fourcc)
|
||||
- human readable description (if available)
|
||||
- flags (e.g. if the block is used or skipped)
|
||||
- indentation depth
|
||||
- we would need a way to indicate that e.g. h264parse would be indented below
|
||||
the containing container block
|
||||
- a structured hex view would be nice
|
||||
(somehow align the parse tree with the hexdump)
|
||||
|
||||
= playback =
|
||||
- have a menu command to turn auto-play off
|
||||
- show level meters for audio next or below video drawable
|
||||
- show a seek bar under the drawable / or seek by scrubbing on the drawable
|
||||
|
||||
= unsorted =
|
||||
- show named audio channel configurations instead only numbers
|
||||
e.g. "mono", "stereo", "5.1"
|
||||
- tag lists
|
||||
- if there is a "language-code" in the tags (or subtitles?) use flag icons
|
||||
- deluge installs some under: /usr/share/pyshared/deluge/data/mediainfo/pixmaps/flags/
|
||||
- famfamfam-flag-png: locale/usr/share/flags/countries/
|
||||
- geo-tags: map-widget?, link to google-maps?, rev-geocoding
|
||||
- artist: links to {last.fm,wikipedia}
|
||||
- format dates nicely (current locale, xx days ago?)
|
||||
- more codec details
|
||||
- caps have profile/level strings, can we also turn them into wikilinks?
|
||||
- bitrate and encode_size are related, calculate one from the other if missing
|
||||
- encoded_size = duration * bitrate;
|
||||
- bitrate = encoded_size / duration;
|
||||
- needed in: quicktime, ogg/theora
|
||||
- we'd like to have some transport-info (from sources)
|
||||
- http-source can post a taglist of http-header fields (e.g. mime-type)
|
||||
- we can have wiki-links for the protocol
|
||||
- we can get the file-size for remote content
|
||||
|
||||
== deep scan mode ==
|
||||
- could be done in gst_devtools/validate
|
||||
- play the file by using fakesinks and gather statistics:
|
||||
- update fields when playing
|
||||
- listen for duration messages on the bus
|
||||
- get bit-rate over time
|
||||
- specify window size, get min,max,avg bitrate for each window
|
||||
- gst-mi can draw them as a graph
|
||||
- get key-frame statistics (using gst-index)
|
||||
- number of keyframes
|
||||
- min,max,avg keyframe interval
|
||||
- disconts
|
||||
- read-pos on source (show if there is excessive seeking)
|
||||
- raw data statistics
|
||||
- audio: level, ...
|
||||
- video: histogram, contrast, ...
|
||||
|
||||
= TODO for gstreamer =
|
||||
- file/stream layout
|
||||
- from every element we'd like to know what data is processed, what is pushed
|
||||
further and some metadata about it:
|
||||
layout {
|
||||
gsize offset; // in bytes
|
||||
gsize length; // in bytes
|
||||
gboolean known; // or an enum: handled, skipped, unknown
|
||||
gchar *name; // e.g. atom/chunk name
|
||||
gchar *description; // long description or NULL
|
||||
enum block_type type; // meta, audio, video, text, ...
|
||||
};
|
||||
- offset is not neccesarily easy to determine for later elements, not sure
|
||||
if we can make it relative
|
||||
- elements could emit messages with this info
|
||||
- need a common way to enable it:
|
||||
- "post-stream-layout" property
|
||||
- message-mask as api
|
||||
- visulaisation
|
||||
- we would need a cairo custom widget to draw a table
|
||||
- one row per element
|
||||
- each row contains colored segments
|
||||
- tree- view with data as hex dump
|
||||
|
||||
= TODO for gstreamer-plugins =
|
||||
- wav: no bitrate for uncompressed files
|
||||
- mp4: no bitrate for many formats
|
||||
|
||||
= TODO for discoverer =
|
||||
- add deep-scan mode (see above)
|
||||
- add a mode property: quick-scan, deep-scan
|
||||
(or just a boolean for deep-scan that is false by default)
|
||||
- gst-discoverer will use "-d" for deep-scan/details
|
||||
(-a for analyze or -s for scan are used otherwise already)
|
||||
- in deep-scan, don't stop on handle_message::GST_MESSAGE_ASYNC_DONE
|
||||
- in deep-scan we need pad-probes for encoded data pads (to get bitrates)
|
||||
- uridecodebin_pad_added_cb() has raw pads :/
|
||||
- look at uridecodebin_element_added_cb()
|
||||
- the pads on uri-decodebin are sufficient to get keyframes and disconts
|
||||
- qtdemux could return stsz table to get bitrate profile
|
||||
http://wiki.multimedia.cx/index.php?title=QuickTime_container#stsz
|
||||
- get duration per stream
|
||||
- this would need individual queries on the demuxer src pads
|
||||
- or duration as part of per stream tags
|
||||
- we need byte-durations for calculating compression ratio
|
||||
- errors/warnings about files/stream processing
|
||||
- we'd like to know about fixable, unfixable issues in the file/stream
|
||||
- many elements do this already (178 uses in 89 files)
|
||||
- the pipeline and thus the bus is internal to discoverer, so it would be nice
|
||||
if it could gather the messages and offer them
|
||||
- having them globaly should be enough
|
||||
- CBR/VBR type for each stream
|
||||
- can we derive that from the bitrate tags (no min/max bitrate set)?
|
||||
find . -name "*.c" -exec egrep -Hn "GST_TAG[A-Z_]*_BITRATE" {} \;
|
||||
- formats
|
||||
- all raw files are cbr
|
||||
- some codecs are cbr only (some speech codecs)
|
||||
- audio
|
||||
- in an MP3 file, if there is no VBRI or Xing,
|
||||
it probably is not a vbr stream
|
||||
-
|
||||
- lossy/lossless compression/encoding
|
||||
- show compression type:
|
||||
- all raw formats are lossless
|
||||
- some audio formats are lossless (flac, wavpack, ...)
|
||||
- some video formats can be lossless (dirac, ...)
|
||||
- show compression raitio (in/out)
|
||||
- depends on the target raw format
|
||||
- need binary size for each stream, can we do byte queries on each pad?
|
||||
- if we have stream sizes we could also show container overhead
|
||||
|
||||
= discoverer workflow =
|
||||
== sync quick-scan ==
|
||||
app disco
|
||||
--- -----
|
||||
| discover_uri() |
|
||||
|--------------------->|
|
||||
| done |
|
||||
|<---------------------|
|
||||
|
|
||||
|
||||
== async quick-scan ==
|
||||
app disco
|
||||
--- -----
|
||||
| discover_uri_async() |
|
||||
|--------------------->|
|
||||
| ... |
|
||||
| discover_uri_async() |
|
||||
|--------------------->|
|
||||
| start() |
|
||||
|--------------------->|
|
||||
| ::discovered |
|
||||
|<---------------------|
|
||||
| ... |
|
||||
| ::discovered |
|
||||
|<---------------------|
|
||||
| ::finisheded |
|
||||
|<---------------------|
|
||||
|
|
||||
|
||||
== sync deep-scan ==
|
||||
- same as "sync quick-scan", no intermediate result
|
||||
|
||||
== async deep-scan ==
|
||||
- same as "async quick-scan", but each discovered signal is followed by an
|
||||
"analyzed" signal with detailed information
|
||||
- we could also just emit discovered twice.
|
||||
|
||||
app disco
|
||||
--- -----
|
||||
| discover_uri_async() |
|
||||
|--------------------->|
|
||||
| ... |
|
||||
| discover_uri_async() |
|
||||
|--------------------->|
|
||||
| start() |
|
||||
|--------------------->|
|
||||
| ::discovered |
|
||||
|<---------------------|
|
||||
| ::analyzed |
|
||||
|<---------------------|
|
||||
| ... |
|
||||
| ::discovered |
|
||||
|<---------------------|
|
||||
| ::analyzed |
|
||||
|<---------------------|
|
||||
| ::finisheded |
|
||||
|<---------------------|
|
||||
|
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
#!/bin/sh
|
||||
# Run this to generate all the initial makefiles, etc.
|
||||
|
||||
# a silly hack that generates autoregen.sh but it's handy
|
||||
echo "#!/bin/sh" > autoregen.sh
|
||||
echo "./autogen.sh $@ \$@" >> autoregen.sh
|
||||
chmod +x autoregen.sh
|
||||
|
||||
mkdir -p m4
|
||||
|
||||
test -n "$srcdir" || srcdir=$(dirname "$0")
|
||||
test -n "$srcdir" || srcdir=.
|
||||
(
|
||||
cd "$srcdir" &&
|
||||
AUTOPOINT='intltoolize --automake -c -f' autoreconf -fiv &&
|
||||
test -f "po/Makefile.in.in" || intltoolize -c -f
|
||||
) || exit
|
||||
test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
AC_PREREQ(2.62)
|
||||
dnl initialize autoconf
|
||||
dnl when going to/from release please set the nano (fourth number) right !
|
||||
dnl releases only do Wall, cvs and prerelease does Werror too
|
||||
AC_INIT(Gst-Mediainfo, 1.11.0.1,
|
||||
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
|
||||
gst-mediainfo)
|
||||
AC_CONFIG_SRCDIR([src/mi.vala])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
AM_INIT_AUTOMAKE([check-news])
|
||||
|
||||
# Enable silent rules is available
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_STDC
|
||||
AM_PROG_VALAC([0.7.0])
|
||||
AC_PROG_INSTALL
|
||||
IT_PROG_INTLTOOL([0.35])
|
||||
PKG_PROG_PKG_CONFIG
|
||||
|
||||
pkg_modules="gee-0.8 gtk+-3.0 >= 3.0.0 gstreamer-1.0 >= 1.1.0 gstreamer-plugins-base-1.0 >= 1.1.0 gstreamer-pbutils-1.0 >= 1.1.0 gstreamer-video-1.0 >= 1.1.0"
|
||||
MI_PACKAGES="--pkg gee-0.8 --pkg gtk+-3.0 --pkg gdk-x11-3.0 --pkg gstreamer-1.0 --pkg gstreamer-pbutils-1.0 --pkg gstreamer-video-1.0"
|
||||
PKG_CHECK_MODULES([MI], [$pkg_modules])
|
||||
AC_SUBST(MI_CFLAGS)
|
||||
AC_SUBST(MI_LIBS)
|
||||
AC_SUBST(MI_PACKAGES)
|
||||
|
||||
GETTEXT_PACKAGE=gst-mi
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext Package])
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
# AC_PROG_INTLTOOL is enough, the lines below caused:
|
||||
# required file `./config.rpath' not found
|
||||
#AM_GNU_GETTEXT_VERSION([0.18.1])
|
||||
#AM_GNU_GETTEXT([external])
|
||||
|
||||
dnl check for desktop utilities
|
||||
AC_PATH_PROG(UPDATE_DESKTOP_DATABASE, update-desktop-database)
|
||||
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
src/Makefile
|
||||
po/Makefile.in
|
||||
vapi/Makefile
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
196
mediainfo/git.mk
196
mediainfo/git.mk
|
@ -1,196 +0,0 @@
|
|||
# git.mk
|
||||
#
|
||||
# Copyright 2009, Red Hat, Inc.
|
||||
# Written by Behdad Esfahbod
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification,
|
||||
# are permitted in any medium without royalty provided the copyright
|
||||
# notice and this notice are preserved.
|
||||
#
|
||||
# The canonical source for this file is pango/git.mk, or whereever the
|
||||
# header of pango/git.mk suggests in the future.
|
||||
#
|
||||
# To use in your project, import this file in your git repo's toplevel,
|
||||
# then do "make -f git.mk". This modifies all Makefile.am files in
|
||||
# your project to include git.mk.
|
||||
#
|
||||
# This enables automatic .gitignore generation. If you need to ignore
|
||||
# more files, add them to the GITIGNOREFILES variable in your Makefile.am.
|
||||
# But think twice before doing that. If a file has to be in .gitignore,
|
||||
# chances are very high that it's a generated file and should be in one
|
||||
# of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES.
|
||||
#
|
||||
# The only case that you need to manually add a file to GITIGNOREFILES is
|
||||
# when remove files in one of mostlyclean-local, clean-local, distclean-local,
|
||||
# or maintainer-clean-local.
|
||||
#
|
||||
# Note that for files like editor backup, etc, there are better places to
|
||||
# ignore them. See "man gitignore".
|
||||
#
|
||||
# If "make maintainer-clean" removes the files but they are not recognized
|
||||
# by this script (that is, if "git status" shows untracked files still), send
|
||||
# me the output of "git status" as well as your Makefile.am and Makefile for
|
||||
# the directories involved.
|
||||
#
|
||||
# For a list of toplevel files that should be in MAINTAINERCLEANFILES, see
|
||||
# pango/Makefile.am.
|
||||
#
|
||||
# Don't EXTRA_DIST this file. It is supposed to only live in git clones,
|
||||
# not tarballs. It serves no useful purpose in tarballs and clutters the
|
||||
# build dir.
|
||||
#
|
||||
# This file knows how to handle autoconf, automake, libtool, gtk-doc,
|
||||
# gnome-doc-utils, intltool, gsettings.
|
||||
#
|
||||
#
|
||||
# KNOWN ISSUES:
|
||||
#
|
||||
# - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the
|
||||
# submodule doesn't find us. If you have configure.{in,ac} files in
|
||||
# subdirs, add a proxy git.mk file in those dirs that simply does:
|
||||
# "include $(top_srcdir)/../git.mk". Add more ..'s to your taste.
|
||||
# And add those files to git. See vte/gnome-pty-helper/git.mk for
|
||||
# example.
|
||||
#
|
||||
|
||||
git-all: git-mk-install
|
||||
|
||||
git-mk-install:
|
||||
@echo Installing git makefile
|
||||
@any_failed=; find $(top_srcdir) -name Makefile.am | while read x; do \
|
||||
if grep 'include .*/git.mk' $$x >/dev/null; then \
|
||||
echo $$x already includes git.mk; \
|
||||
else \
|
||||
failed=; \
|
||||
echo "Updating $$x"; \
|
||||
{ cat $$x; \
|
||||
echo ''; \
|
||||
echo '-include $$(top_srcdir)/git.mk'; \
|
||||
} > $$x.tmp || failed=1; \
|
||||
if test x$$failed = x; then \
|
||||
mv $$x.tmp $$x || failed=1; \
|
||||
fi; \
|
||||
if test x$$failed = x; then : else \
|
||||
echo Failed updating $$x; >&2 \
|
||||
any_failed=1; \
|
||||
fi; \
|
||||
fi; done; test -z "$$any_failed"
|
||||
|
||||
.PHONY: git-all git-mk-install
|
||||
|
||||
|
||||
### .gitignore generation
|
||||
|
||||
$(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk
|
||||
$(AM_V_GEN) \
|
||||
{ \
|
||||
if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \
|
||||
for x in \
|
||||
$(DOC_MODULE)-decl-list.txt \
|
||||
$(DOC_MODULE)-decl.txt \
|
||||
tmpl/$(DOC_MODULE)-unused.sgml \
|
||||
"tmpl/*.bak" \
|
||||
xml html \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test "x$(DOC_MODULE)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \
|
||||
for x in \
|
||||
$(_DOC_C_DOCS) \
|
||||
$(_DOC_LC_DOCS) \
|
||||
$(_DOC_OMF_ALL) \
|
||||
$(_DOC_DSK_ALL) \
|
||||
$(_DOC_HTML_ALL) \
|
||||
$(_DOC_MOFILES) \
|
||||
$(_DOC_POFILES) \
|
||||
$(DOC_H_FILE) \
|
||||
"*/.xml2po.mo" \
|
||||
"*/*.omf.out" \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test "x$(gsettings_SCHEMAS)" = x; then :; else \
|
||||
for x in \
|
||||
$(gsettings_SCHEMAS:.xml=.valid) \
|
||||
$(gsettings__enum_file) \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/po/Makefile.in.in; then \
|
||||
for x in \
|
||||
po/Makefile.in.in \
|
||||
po/Makefile.in \
|
||||
po/Makefile \
|
||||
po/POTFILES \
|
||||
po/stamp-it \
|
||||
po/.intltool-merge-cache \
|
||||
"po/*.gmo" \
|
||||
"po/*.mo" \
|
||||
po/$(GETTEXT_PACKAGE).pot \
|
||||
intltool-extract.in \
|
||||
intltool-merge.in \
|
||||
intltool-update.in \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/configure; then \
|
||||
for x in \
|
||||
autom4te.cache \
|
||||
configure \
|
||||
config.h \
|
||||
stamp-h1 \
|
||||
libtool \
|
||||
config.lt \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
for x in \
|
||||
.gitignore \
|
||||
$(GITIGNOREFILES) \
|
||||
$(CLEANFILES) \
|
||||
$(PROGRAMS) \
|
||||
$(check_PROGRAMS) \
|
||||
$(EXTRA_PROGRAMS) \
|
||||
$(LTLIBRARIES) \
|
||||
so_locations \
|
||||
.libs _libs \
|
||||
$(MOSTLYCLEANFILES) \
|
||||
"*.$(OBJEXT)" \
|
||||
"*.lo" \
|
||||
$(DISTCLEANFILES) \
|
||||
$(am__CONFIG_DISTCLEAN_FILES) \
|
||||
$(CONFIG_CLEAN_FILES) \
|
||||
TAGS ID GTAGS GRTAGS GSYMS GPATH tags \
|
||||
"*.tab.c" \
|
||||
$(MAINTAINERCLEANFILES) \
|
||||
$(BUILT_SOURCES) \
|
||||
$(DEPDIR) \
|
||||
Makefile \
|
||||
Makefile.in \
|
||||
"*.orig" \
|
||||
"*.rej" \
|
||||
"*.bak" \
|
||||
"*~" \
|
||||
".*.sw[nop]" \
|
||||
".dirstamp" \
|
||||
; do echo /$$x; done; \
|
||||
} | \
|
||||
sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \
|
||||
sed 's@/[.]/@/@g' | \
|
||||
LC_ALL=C sort | uniq > $@.tmp && \
|
||||
mv $@.tmp $@;
|
||||
|
||||
all: $(srcdir)/.gitignore gitignore-recurse-maybe
|
||||
gitignore-recurse-maybe:
|
||||
@if test "x$(SUBDIRS)" = "x$(DIST_SUBDIRS)"; then :; else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) gitignore-recurse; \
|
||||
fi;
|
||||
gitignore-recurse:
|
||||
@for subdir in $(DIST_SUBDIRS); do \
|
||||
case " $(SUBDIRS) " in \
|
||||
*" $$subdir "*) :;; \
|
||||
*) test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) .gitignore gitignore-recurse || echo "Skipping $$subdir");; \
|
||||
esac; \
|
||||
done
|
||||
gitignore: $(srcdir)/.gitignore gitignore-recurse
|
||||
|
||||
maintainer-clean: gitignore-clean
|
||||
gitignore-clean:
|
||||
-rm -f $(srcdir)/.gitignore
|
||||
|
||||
.PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe
|
|
@ -1,51 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<anjuta>
|
||||
<plugin name="GBF Project Manager"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="yes">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaProjectManager"/>
|
||||
</plugin>
|
||||
<plugin name="AutoTools Project Backend"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="yes">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaProjectBackend"/>
|
||||
<require group="Project"
|
||||
attribute="Supported-Project-Types"
|
||||
value="automake"/>
|
||||
</plugin>
|
||||
<plugin name="Symbol Browser"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="yes">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaSymbolManager"/>
|
||||
</plugin>
|
||||
<plugin name="Make Build System"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="yes">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaBuildable"/>
|
||||
<require group="Build"
|
||||
attribute="Supported-Build-Types"
|
||||
value="make"/>
|
||||
</plugin>
|
||||
<plugin name="Task Manager"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="no">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaTodo"/>
|
||||
</plugin>
|
||||
<plugin name="Debug Manager"
|
||||
url="http://anjuta.org/plugins/"
|
||||
mandatory="no">
|
||||
<require group="Anjuta Plugin"
|
||||
attribute="Interfaces"
|
||||
value="IAnjutaDebugManager"/>
|
||||
</plugin>
|
||||
</anjuta>
|
|
@ -1,4 +0,0 @@
|
|||
[encoding: UTF-8]
|
||||
src/gst-mi.desktop.in
|
||||
src/mi.vala
|
||||
src/mi-app.vala
|
|
@ -1,3 +0,0 @@
|
|||
src/mi.c
|
||||
src/mi-app.c
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
bin_PROGRAMS = gst-mi
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-include config.h \
|
||||
$(MI_CFLAGS) \
|
||||
-DG_LOG_DOMAIN=\"gst-mi\" \
|
||||
-DLOCALEDIR=\""$(localedir)"\" \
|
||||
-DPKGDATADIR=\""$(pkgdatadir)"\" \
|
||||
-DPKGLIBDIR=\""$(pkglibdir)"\"
|
||||
|
||||
AM_VALAFLAGS = \
|
||||
--vapidir=$(top_srcdir)/vapi --pkg config \
|
||||
@MI_PACKAGES@
|
||||
|
||||
gst_mi_SOURCES = \
|
||||
mi.vala \
|
||||
mi-app.vala \
|
||||
mi-info.vala \
|
||||
mi-preview.vala
|
||||
|
||||
gst_mi_LDADD = $(MI_LIBS)
|
||||
|
||||
pixmapsdir = $(pkgdatadir)/ui/icons
|
||||
pixmaps_DATA = gst-mi.png
|
||||
|
||||
iconsdir = $(datadir)/pixmaps/
|
||||
icons_DATA = gst-mi.png
|
||||
|
||||
desktopdir = $(datadir)/applications/
|
||||
desktop_DATA = gst-mi.desktop
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
install-data-hook:
|
||||
test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)";
|
||||
uninstall-local:
|
||||
test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)";
|
||||
|
||||
EXTRA_DIST = gst-mi.png gst-mi.desktop.in
|
||||
|
||||
BUILT_SOURCES = $(gst_mi_SOURCES:.vala=.c)
|
||||
|
||||
CLEANFILES = \
|
||||
$(BUILT_SOURCES) gst_mi_vala.stamp gst-mi.desktop
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
[Desktop Entry]
|
||||
_Name=GStreamer Media Info
|
||||
_Comment=Quickly browse, play and analyze media files
|
||||
StartupNotify=true
|
||||
Exec=gst-mi
|
||||
Icon=gst-mi
|
||||
Type=Application
|
||||
Categories=GNOME;GTK;AudioVideo;
|
Binary file not shown.
Before Width: | Height: | Size: 6.5 KiB |
|
@ -1,660 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="gst-mi.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective10" />
|
||||
<linearGradient
|
||||
id="linearGradient4440">
|
||||
<stop
|
||||
id="stop4442"
|
||||
offset="0"
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
|
||||
offset="0.50000000"
|
||||
id="stop4448" />
|
||||
<stop
|
||||
id="stop4444"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#686868;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4454">
|
||||
<stop
|
||||
id="stop4456"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#729fcf;stop-opacity:0.20784314;" />
|
||||
<stop
|
||||
id="stop4458"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#729fcf;stop-opacity:0.67619050;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4467">
|
||||
<stop
|
||||
id="stop4469"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4471"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:0.24761905;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2366">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2368" />
|
||||
<stop
|
||||
id="stop2374"
|
||||
offset="0.50000000"
|
||||
style="stop-color:#ffffff;stop-opacity:0.21904762;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2370" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2846">
|
||||
<stop
|
||||
style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2848" />
|
||||
<stop
|
||||
style="stop-color:#484848;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2850" />
|
||||
</linearGradient>
|
||||
<inkscape:perspective
|
||||
id="perspective47"
|
||||
inkscape:persp3d-origin="24 : 16 : 1"
|
||||
inkscape:vp_z="48 : 24 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 24 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2502"
|
||||
id="linearGradient4387"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="2.7612331"
|
||||
y1="6.1102505"
|
||||
x2="18.772917"
|
||||
y2="18.693317"
|
||||
gradientTransform="translate(-0.599666,-0.578168)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2502"
|
||||
id="linearGradient4385"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="2.7612331"
|
||||
y1="6.1102505"
|
||||
x2="18.772917"
|
||||
y2="18.693317" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3593"
|
||||
id="linearGradient3599"
|
||||
x1="10.678571"
|
||||
y1="15.928572"
|
||||
x2="7.9285712"
|
||||
y2="11.107142"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3575"
|
||||
id="radialGradient3581"
|
||||
cx="24.642857"
|
||||
cy="44.285713"
|
||||
fx="24.642857"
|
||||
fy="44.285713"
|
||||
r="22.071428"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.207120,0.000000,35.11327)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2613"
|
||||
id="linearGradient2619"
|
||||
x1="5.4635010"
|
||||
y1="13.142847"
|
||||
x2="21.536488"
|
||||
y2="49.142849"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2601"
|
||||
id="radialGradient2607"
|
||||
cx="27.216267"
|
||||
cy="35.673447"
|
||||
fx="27.216267"
|
||||
fy="35.673447"
|
||||
r="19.571430"
|
||||
gradientTransform="matrix(2.883137,5.542409e-23,8.493709e-23,2.136047,-64.96822,-52.48586)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient2502">
|
||||
<stop
|
||||
style="stop-color:#fdfdfd;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2504" />
|
||||
<stop
|
||||
style="stop-color:#d4d4d4;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2506" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2601">
|
||||
<stop
|
||||
style="stop-color:#5d5d5d;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2603" />
|
||||
<stop
|
||||
style="stop-color:#444444;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2605" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2613">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2615" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2617" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3575">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3577" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3579" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3593">
|
||||
<stop
|
||||
style="stop-color:#939393;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3595" />
|
||||
<stop
|
||||
style="stop-color:#d9d9d9;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop3597" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="609.50507"
|
||||
x2="302.85715"
|
||||
y1="366.64789"
|
||||
x1="302.85715"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient6715"
|
||||
xlink:href="#linearGradient5048"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient5048">
|
||||
<stop
|
||||
id="stop5050"
|
||||
offset="0"
|
||||
style="stop-color:black;stop-opacity:0;" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1;"
|
||||
offset="0.5"
|
||||
id="stop5056" />
|
||||
<stop
|
||||
id="stop5052"
|
||||
offset="1"
|
||||
style="stop-color:black;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
r="117.14286"
|
||||
fy="486.64789"
|
||||
fx="605.71429"
|
||||
cy="486.64789"
|
||||
cx="605.71429"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient6717"
|
||||
xlink:href="#linearGradient5060"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient5060"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop5062"
|
||||
offset="0"
|
||||
style="stop-color:black;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop5064"
|
||||
offset="1"
|
||||
style="stop-color:black;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
r="117.14286"
|
||||
fy="486.64789"
|
||||
fx="605.71429"
|
||||
cy="486.64789"
|
||||
cx="605.71429"
|
||||
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient6719"
|
||||
xlink:href="#linearGradient5060"
|
||||
inkscape:collect="always" />
|
||||
<inkscape:perspective
|
||||
id="perspective78"
|
||||
inkscape:persp3d-origin="24 : 16 : 1"
|
||||
inkscape:vp_z="48 : 24 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 24 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2366"
|
||||
id="linearGradient3151"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="18.292673"
|
||||
y1="13.602121"
|
||||
x2="17.500893"
|
||||
y2="25.743469" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4454"
|
||||
id="radialGradient3155"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="18.240929"
|
||||
cy="21.817987"
|
||||
fx="18.240929"
|
||||
fy="21.817987"
|
||||
r="8.3085051" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4467"
|
||||
id="radialGradient3160"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.592963,0,0,2.252104,140.89333,267.15831)"
|
||||
cx="15.414371"
|
||||
cy="13.078408"
|
||||
fx="15.414371"
|
||||
fy="13.078408"
|
||||
r="6.6562500" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4440"
|
||||
id="linearGradient3167"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.334593,0,0,1.291292,158.97924,278.63865)"
|
||||
x1="30.656250"
|
||||
y1="34.000000"
|
||||
x2="33.218750"
|
||||
y2="31.062500" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2846"
|
||||
id="linearGradient3171"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="27.366341"
|
||||
y1="26.580296"
|
||||
x2="31.335964"
|
||||
y2="30.557772"
|
||||
gradientTransform="translate(165.95308,286.09931)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.5949367"
|
||||
inkscape:cx="130.25595"
|
||||
inkscape:cy="684.35317"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="866"
|
||||
inkscape:window-height="695"
|
||||
inkscape:window-x="969"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g3067"
|
||||
inkscape:export-filename="/home/ensonic/projects/gstreamer/gst-mediainfo/src/gst-mi.png"
|
||||
inkscape:export-xdpi="106.52"
|
||||
inkscape:export-ydpi="106.52">
|
||||
<g
|
||||
transform="translate(66.654752,358.38807)"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-0">
|
||||
<g
|
||||
transform="matrix(0.0233489,0,0,0.02086758,45.33878,41.86789)"
|
||||
id="g6707">
|
||||
<rect
|
||||
style="opacity:0.40206185;color:#000000;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="rect6709"
|
||||
width="1339.6335"
|
||||
height="478.35718"
|
||||
x="-1559.2523"
|
||||
y="-150.69685" />
|
||||
<path
|
||||
style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z"
|
||||
id="path6711"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
id="path6713"
|
||||
d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z"
|
||||
style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
</g>
|
||||
<rect
|
||||
ry="1.1428572"
|
||||
rx="1.1428572"
|
||||
y="16.57143"
|
||||
x="5.4285707"
|
||||
height="27.999996"
|
||||
width="38.14286"
|
||||
id="rect1440"
|
||||
style="color:#000000;fill:url(#radialGradient2607);fill-opacity:1;fill-rule:nonzero;stroke:#1b1b1b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block" />
|
||||
<rect
|
||||
style="opacity:0.31155778;color:#000000;fill:none;stroke:url(#linearGradient2619);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block"
|
||||
id="rect2609"
|
||||
width="36.072987"
|
||||
height="26.060221"
|
||||
x="6.3920727"
|
||||
y="17.489294"
|
||||
rx="0.27372196"
|
||||
ry="0.27372196" />
|
||||
<g
|
||||
transform="matrix(-0.97271,0.232023,0.232023,0.97271,45.78579,5.110631)"
|
||||
id="g4376">
|
||||
<rect
|
||||
transform="matrix(0.974407,-0.22479,0.22479,0.974407,0,0)"
|
||||
ry="1.1428572"
|
||||
rx="1.1428572"
|
||||
y="10.35317"
|
||||
x="1.7052064"
|
||||
height="6.50879"
|
||||
width="39.805996"
|
||||
id="rect4362"
|
||||
style="color:#000000;fill:url(#linearGradient4385);fill-opacity:1;fill-rule:nonzero;stroke:#2b2b2b;stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path4364"
|
||||
d="M 9.1896391,8.9691823 6.7610675,15.540611 11.475352,14.254897 13.903923,7.9691824 9.1896391,8.9691823 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
d="m 18.332496,6.8977538 -2.285715,6.5000002 4.714286,-1.142857 2.285714,-6.3571431 -4.714285,0.9999999 z"
|
||||
id="path4366"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path4368"
|
||||
d="M 27.903923,4.6834682 25.618208,11.11204 30.332494,9.9691828 32.618208,3.6834683 27.903923,4.6834682 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
id="path4370"
|
||||
d="m 39.412852,2.0182896 c 0.229074,0.1560539 0.401242,0.3636209 0.46875,0.65625 l 0.732143,3.0758928 -0.723214,2 -4.6875,1.0848214 2.28125,-6.3571428 1.928571,-0.4598214 z"
|
||||
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block" />
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.57512949;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block"
|
||||
id="rect4372"
|
||||
width="37.842842"
|
||||
height="4.6068902"
|
||||
x="2.6716552"
|
||||
y="11.327118"
|
||||
rx="0.26506385"
|
||||
ry="0.26506385"
|
||||
transform="matrix(0.974407,-0.22479,0.22479,0.974407,0,0)" />
|
||||
</g>
|
||||
<rect
|
||||
transform="matrix(0.974407,-0.22479,0.22479,0.974407,0,0)"
|
||||
ry="1.1428553"
|
||||
rx="1.1428553"
|
||||
y="9.6851511"
|
||||
x="0.67043102"
|
||||
height="6.9415727"
|
||||
width="40.077335"
|
||||
id="rect2200"
|
||||
style="color:#000000;fill:url(#linearGradient4387);fill-opacity:1;fill-rule:nonzero;stroke:#2e2e2e;stroke-width:0.99999833;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2202"
|
||||
d="M 10.142858,8.1428571 7.7142859,14.714286 12.428572,13.428572 14.857143,7.1428572 10.142858,8.1428571 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
d="m 19.428573,5.7857143 -2.642858,7.0000007 4.714286,-1.142857 2.642857,-6.8571436 -4.714285,0.9999999 z"
|
||||
id="path2204"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2206"
|
||||
d="m 29.071429,3.6428573 -2.57143,7.1428577 4.714286,-1.1428574 2.571429,-7.0000002 -4.714285,0.9999999 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
id="rect2210"
|
||||
d="m 41.294643,0.97767869 c 0.229074,0.15605391 0.401242,0.36362091 0.46875,0.65625001 l 0.660714,2.6473214 -1.080356,2.7857143 -5.116071,1.2276785 2.352678,-6.7142857 2.714285,-0.60267851 z"
|
||||
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block" />
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.57512949;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block"
|
||||
id="rect2510"
|
||||
width="38.199306"
|
||||
height="4.9147058"
|
||||
x="1.6368761"
|
||||
y="10.659099"
|
||||
rx="0.26506338"
|
||||
ry="0.26506338"
|
||||
transform="matrix(0.974407,-0.22479,0.22479,0.974407,0,0)" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
id="path3583"
|
||||
d="m 6.5357143,10.892862 0,7.785714 c 0,0.464286 0.3928571,0.892858 0.8571428,0.928572 l 7.8928559,0 c 0.863664,0 1.273862,-1.261852 0.607142,-1.928572 L 9.6785715,10.392862 c -0.9642858,-1.3928571 -3.1428572,-0.7142856 -3.1428572,0.5 z"
|
||||
style="fill:url(#linearGradient3599);fill-opacity:1;fill-rule:evenodd;stroke:#1b1b1b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
transform="translate(-0.07142886,-4.964285)"
|
||||
d="m 9.0357146,17.196428 c 0,0.26628 -0.2158627,0.482143 -0.4821429,0.482143 -0.2662802,0 -0.4821429,-0.215863 -0.4821429,-0.482143 0,-0.26628 0.2158627,-0.482143 0.4821429,-0.482143 0.2662802,0 0.4821429,0.215863 0.4821429,0.482143 z"
|
||||
sodipodi:ry="0.48214287"
|
||||
sodipodi:rx="0.48214287"
|
||||
sodipodi:cy="17.196428"
|
||||
sodipodi:cx="8.5535717"
|
||||
id="path3587"
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
|
||||
id="path3589"
|
||||
sodipodi:cx="8.5535717"
|
||||
sodipodi:cy="17.196428"
|
||||
sodipodi:rx="0.48214287"
|
||||
sodipodi:ry="0.48214287"
|
||||
d="m 9.0357146,17.196428 c 0,0.26628 -0.2158627,0.482143 -0.4821429,0.482143 -0.2662802,0 -0.4821429,-0.215863 -0.4821429,-0.482143 0,-0.26628 0.2158627,-0.482143 0.4821429,-0.482143 0.2662802,0 0.4821429,0.215863 0.4821429,0.482143 z"
|
||||
transform="translate(-0.07142884,0.321429)" />
|
||||
<path
|
||||
transform="translate(4.964285,0.321429)"
|
||||
d="m 9.0357146,17.196428 c 0,0.26628 -0.2158627,0.482143 -0.4821429,0.482143 -0.2662802,0 -0.4821429,-0.215863 -0.4821429,-0.482143 0,-0.26628 0.2158627,-0.482143 0.4821429,-0.482143 0.2662802,0 0.4821429,0.215863 0.4821429,0.482143 z"
|
||||
sodipodi:ry="0.48214287"
|
||||
sodipodi:rx="0.48214287"
|
||||
sodipodi:cy="17.196428"
|
||||
sodipodi:cx="8.5535717"
|
||||
id="path3591"
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
|
||||
sodipodi:type="arc" />
|
||||
<g
|
||||
transform="translate(0,4)"
|
||||
style="opacity:0.26130652"
|
||||
id="g3629">
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 10,28.428571 28,0"
|
||||
id="path3601" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 10,32.571424 28,0"
|
||||
id="path3603" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 32.5,28 0,-4"
|
||||
id="path3607" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 10,32.571424 28,0"
|
||||
id="path3605" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 22.5,28 0,-4"
|
||||
id="path3611" />
|
||||
<path
|
||||
id="path3615"
|
||||
d="m 9.7429344,36.571424 13.2998316,0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.688056,0,0,0.688056,11.98189,14.73331)"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="g3680">
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3674"
|
||||
d="m 13.817087,27.83871 c 0.113601,0.965157 0.244861,1.927714 0.394926,2.887925 l -2.107716,1.115321 C 11.971325,30.898587 11.859805,29.948673 11.653276,29.01819 l 2.163811,-1.17948 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3676"
|
||||
d="m 17.665061,28.673198 c -0.02417,2.079247 0.678,1.192783 -1.910963,2.589105 0.815412,-1.303562 2.191632,-2.618366 3.548625,-1.445006 2.591189,0.421672 -1.433848,2.481989 0.355171,0.314327 2.600013,-2.269865 2.222306,-0.997521 4.404319,-0.868565 1.780222,0.430207 1.796194,0.05633 -0.570253,1.416663 0.03203,-0.02793 0.06406,-0.05585 0.09609,-0.08377 l 2.238621,-0.946961 c -0.02529,0.03869 -0.05058,0.07738 -0.07587,0.116068 -2.811349,1.677475 -1.668398,1.183753 -3.647289,0.92631 -1.86635,-0.327685 -2.87539,-0.553295 -0.220839,-1.484714 -1.139443,1.293919 -2.981215,3.299891 -4.618598,1.882935 -1.588509,-1.170545 2.132535,-2.413333 0.764613,-0.73098 -2.682553,1.478611 -2.400461,1.55186 -2.560742,-0.565921 l 2.197119,-1.119488 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3678"
|
||||
d="m 29.174994,26.230789 c 0.14593,1.507956 0.225786,3.019542 0.405142,4.524683 1.423472,1.850746 -1.826977,4.633968 -1.347225,1.808834 0.342081,-3.243811 0.650319,-3.84417 3.528747,-4.879984 0.547689,0.983343 0.847731,2.137946 1.704024,2.727959 -4.840075,2.551671 1.693745,-1.481215 2.420946,-1.867341 0.464921,-0.109143 0.939853,-0.165325 1.412287,-0.230751 l -1.920756,1.437314 c -0.464844,0.06807 -0.935057,0.1189 -1.384984,0.261165 2.998581,-1.911568 -0.568404,0.841891 -2.506019,1.817551 -0.923746,-0.724224 -1.143464,-1.894425 -1.783232,-2.880314 3.14599,-2.218804 0.63263,-0.141231 0.637903,2.577332 -0.28354,2.350093 -3.320174,3.549885 -2.814981,0.306459 -0.172764,-1.481806 -0.250004,-2.982368 -0.530099,-4.447333 l 2.178247,-1.155574 z" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.013963,0,0,1.013963,1.878556,5.469083)"
|
||||
id="g3755">
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3693"
|
||||
d="m 11.316278,22.373912 c 1.820856,-1.333208 1.127169,-0.281091 1.128436,1.146858 -0.01466,1.286348 0.175884,2.556881 0.462421,3.806594 l -1.262911,0.682145 c -0.287161,-1.259893 -0.47939,-2.540337 -0.475327,-3.836434 -0.01981,-1.552781 -0.288652,-1.952637 1.347165,-2.670858 l -1.199784,0.871695 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3695"
|
||||
d="m 15.610946,22.413179 c -0.02437,0.790304 -0.02398,1.581273 -0.02699,2.3719 -0.0011,0.331934 -0.001,0.663869 -0.0013,0.995804 l -1.264717,0.644405 c -3.07e-4,-0.33148 -2.58e-4,-0.66296 -0.0013,-0.994439 -0.003,-0.781455 -0.0024,-1.563275 -0.02699,-2.344395 l 1.321376,-0.673275 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3697"
|
||||
d="m 17.833281,21.200996 c 0.09877,0.796352 0.117107,1.655155 0.145148,2.472831 0.008,0.24117 0.0132,0.482416 0.01979,0.723625 l -1.257551,0.645191 c -0.0078,-0.240127 -0.0132,-0.480333 -0.02347,-0.72038 -0.03579,-0.815108 -0.04172,-1.648209 -0.205301,-2.447992 l 1.321376,-0.673275 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3699"
|
||||
d="m 20.257647,20.594904 c -0.196164,0.682214 -0.268848,1.395879 -0.337656,2.103621 -0.0674,0.761239 -0.09762,1.524887 -0.128658,2.288229 l -1.257113,0.634694 c 0.02996,-0.763385 0.05957,-1.526914 0.115545,-2.288959 0.05537,-0.688124 0.083,-1.405566 0.286506,-2.06431 l 1.321376,-0.673275 z" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3701"
|
||||
d="m 9.8969255,22.310339 c 0.9067235,0.190928 1.8267775,0.348564 2.7421905,0.503737 2.149945,0.332152 4.306576,0.626935 6.468095,0.873614 0.903938,0.09251 1.807226,0.19028 2.709599,0.296728 l -1.16802,0.826398 C 19.754597,24.700327 18.859587,24.597014 17.963955,24.498588 15.801624,24.238152 13.642863,23.943889 11.488982,23.62143 10.560864,23.472229 9.6271038,23.290017 8.6971411,23.182034 l 1.1997844,-0.871695 z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3174"
|
||||
transform="translate(-89.65873,82.880952)"
|
||||
inkscape:export-filename="/home/ensonic/projects/gstreamer/gst-mediainfo/src/gst-mi.png"
|
||||
inkscape:export-xdpi="106.52"
|
||||
inkscape:export-ydpi="106.52">
|
||||
<path
|
||||
sodipodi:nodetypes="csscccscccscczzzz"
|
||||
id="path2844"
|
||||
d="m 184.58065,289.24286 c -8.13913,0 -14.7448,6.60568 -14.7448,14.74481 0,8.13913 6.60567,14.7448 14.7448,14.7448 3.47955,0 6.551,-1.3844 9.07372,-3.40265 -0.20538,1.00688 -0.078,2.03537 0.75615,2.75993 l 10.96408,9.52741 c 1.23342,1.07133 3.08746,0.93096 4.15879,-0.30246 1.07133,-1.23342 0.93096,-3.08746 -0.30246,-4.15879 l -10.96408,-9.52741 c -0.67153,-0.58328 -1.49288,-0.75597 -2.30624,-0.64272 1.9867,-2.51243 3.36484,-5.54881 3.36484,-8.99811 0,-8.13913 -6.60567,-14.74481 -14.7448,-14.74481 z m -0.0756,1.22619 c 7.63946,0 13.29177,4.78895 13.29177,13.29177 0,8.67512 -5.81669,13.29178 -13.29177,13.29178 -7.30295,0 -13.29177,-5.47809 -13.29177,-13.29178 0,-7.9841 5.82463,-13.29177 13.29177,-13.29177 z"
|
||||
style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3171);stroke-width:2.00000095;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="m 184.55598,289.17967 c -8.16544,0 -14.79246,6.62702 -14.79246,14.79246 0,8.16544 6.62702,14.79246 14.79246,14.79246 3.49081,0 6.57218,-1.38886 9.10306,-3.41364 -0.20604,1.01013 -0.0783,2.04194 0.75859,2.76884 l 10.99952,9.55821 c 1.23741,1.07479 3.09744,0.93397 4.17224,-0.30343 1.07479,-1.23741 0.93396,-3.09745 -0.30344,-4.17224 l -10.99952,-9.5582 c -0.6737,-0.58517 -1.49771,-0.75842 -2.3137,-0.6448 1.99312,-2.52055 3.37572,-5.56674 3.37572,-9.0272 0,-8.16544 -6.62703,-14.79246 -14.79247,-14.79246 z m -0.0759,3.18606 c 6.28111,0 11.37882,5.09771 11.37882,11.37882 0,6.28111 -5.09771,11.37882 -11.37882,11.37882 -6.2811,0 -11.37881,-5.09771 -11.37881,-11.37882 0,-6.28111 5.09771,-11.37882 11.37881,-11.37882 z"
|
||||
id="path4430" />
|
||||
<path
|
||||
style="color:#000000;fill:url(#linearGradient3167);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="m 205.46008,327.677 c -0.47867,-2.27319 1.39733,-4.81142 3.58406,-4.78838 0,0 -10.76037,-9.25811 -10.76037,-9.25811 -2.94479,-0.0567 -4.2695,2.27262 -3.77681,4.59993 l 10.95312,9.44656 z"
|
||||
id="path4438"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:none;stroke:url(#linearGradient3151);stroke-width:0.8027336;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="path4450"
|
||||
sodipodi:cx="17.500893"
|
||||
sodipodi:cy="18.920233"
|
||||
sodipodi:rx="11.048544"
|
||||
sodipodi:ry="11.048544"
|
||||
d="m 28.549437,18.920233 c 0,6.101942 -4.946602,11.048544 -11.048544,11.048544 -6.101943,0 -11.0485443,-4.946602 -11.0485443,-11.048544 0,-6.101943 4.9466013,-11.0485442 11.0485443,-11.0485442 6.101942,0 11.048544,4.9466012 11.048544,11.0485442 z"
|
||||
transform="matrix(1.245743,0,0,1.245743,162.52773,279.92228)" />
|
||||
<rect
|
||||
style="opacity:0.43315507;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00003123;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="rect4495"
|
||||
width="19.048445"
|
||||
height="4.4404783"
|
||||
x="352.31552"
|
||||
y="106.37407"
|
||||
rx="2.1366615"
|
||||
ry="1.8879365"
|
||||
transform="matrix(0.75298577,0.6580368,-0.648902,0.760872,0,0)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient3155);fill-opacity:1;fill-rule:evenodd;stroke:#3063a3;stroke-width:0.71499395;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible"
|
||||
id="path4452"
|
||||
sodipodi:cx="17.589281"
|
||||
sodipodi:cy="18.478292"
|
||||
sodipodi:rx="8.3085051"
|
||||
sodipodi:ry="8.3085051"
|
||||
d="m 25.897786,18.478292 c 0,4.588661 -3.719844,8.308506 -8.308505,8.308506 -4.588661,0 -8.308505,-3.719845 -8.308505,-8.308506 0,-4.58866 3.719844,-8.308505 8.308505,-8.308505 4.588661,0 8.308505,3.719845 8.308505,8.308505 z"
|
||||
transform="matrix(1.398614,0,0,1.398614,159.72874,277.80035)" />
|
||||
<path
|
||||
style="opacity:0.83422457;color:#000000;fill:url(#radialGradient3160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="m 184.10999,293.496 c -5.20759,0 -9.42454,4.21696 -9.42454,9.42455 0,1.50398 0.42031,2.88777 1.04717,4.1499 1.25238,0.46162 2.58276,0.77569 3.99477,0.77569 6.17095,0 11.09928,-4.86164 11.4801,-10.93713 -1.73096,-2.04553 -4.21004,-3.41301 -7.0975,-3.41301 z"
|
||||
id="path4462" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 32 KiB |
|
@ -1,171 +0,0 @@
|
|||
/* GStreamer media browser
|
||||
* Copyright (C) 2010-2013 Stefan Sauer <ensonic@user.sf.net>
|
||||
*
|
||||
* 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 Steet,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using Gtk;
|
||||
using MediaInfo;
|
||||
|
||||
public class MediaInfo.App : Window
|
||||
{
|
||||
private FileChooserWidget chooser;
|
||||
private Info info;
|
||||
private string directory = null;
|
||||
private string uri = null;
|
||||
|
||||
public App (string? directory_or_uri) {
|
||||
GLib.Object (type : WindowType.TOPLEVEL);
|
||||
|
||||
if (directory_or_uri != null) {
|
||||
if (FileUtils.test (directory_or_uri, FileTest.IS_DIR)) {
|
||||
directory = directory_or_uri;
|
||||
} else if (Uri.parse_scheme (directory_or_uri) != null) {
|
||||
uri = directory_or_uri;
|
||||
}
|
||||
}
|
||||
|
||||
// configure the window
|
||||
set_title (_("GStreamer Media Info"));
|
||||
set_default_size (700, 500);
|
||||
try {
|
||||
set_default_icon_from_file (Config.PKGDATADIR + "/ui/icons/gst-mi.png");
|
||||
} catch (Error e) {
|
||||
debug ("Application icon missing: %s: %s", e.domain.to_string (), e.message);
|
||||
}
|
||||
destroy.connect (Gtk.main_quit);
|
||||
|
||||
Box vbox = new Box (Gtk.Orientation.VERTICAL, 0);
|
||||
add (vbox);
|
||||
|
||||
// add a menubar
|
||||
vbox.pack_start (create_menu (), false, false, 0);
|
||||
|
||||
Paned paned = new Paned (Gtk.Orientation.HORIZONTAL);
|
||||
paned.set_border_width (0);
|
||||
vbox.pack_start (paned, true, true, 3);
|
||||
|
||||
// add a file-chooser with info pane as preview widget
|
||||
chooser = new FileChooserWidget (FileChooserAction.OPEN);
|
||||
paned.pack1 (chooser, false, false);
|
||||
|
||||
chooser.set_show_hidden (false);
|
||||
|
||||
info = new Info ();
|
||||
paned.pack2 (info, true, true);
|
||||
|
||||
realize.connect ( () => {
|
||||
debug ("realized");
|
||||
if (uri != null) {
|
||||
chooser.set_sensitive (false);
|
||||
info.discover (uri);
|
||||
} else {
|
||||
if (directory != null) {
|
||||
//chooser.set_current_folder (GLib.Environment.get_home_dir ());
|
||||
chooser.set_current_folder (directory);
|
||||
}
|
||||
chooser.selection_changed.connect (on_update_preview);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// helper
|
||||
|
||||
private MenuBar create_menu () {
|
||||
MenuBar menu_bar = new MenuBar ();
|
||||
Gtk.MenuItem item;
|
||||
Gtk.Menu sub_menu;
|
||||
AccelGroup accel_group;
|
||||
|
||||
accel_group = new AccelGroup ();
|
||||
this.add_accel_group (accel_group);
|
||||
|
||||
item = new Gtk.MenuItem.with_label (_("File"));
|
||||
menu_bar.append (item);
|
||||
|
||||
sub_menu = new Gtk.Menu ();
|
||||
item.set_submenu (sub_menu);
|
||||
|
||||
// TODO: add "open uri" item
|
||||
// -> dialog with text entry (pre-file with clipboard content)
|
||||
// -> discover that uri and clear selection in browser
|
||||
|
||||
item = new Gtk.MenuItem.with_label (_("Quit"));
|
||||
sub_menu.append (item);
|
||||
item.activate.connect (Gtk.main_quit);
|
||||
|
||||
item = new Gtk.MenuItem.with_label (_("View"));
|
||||
menu_bar.append (item);
|
||||
|
||||
sub_menu = new Gtk.Menu ();
|
||||
item.set_submenu (sub_menu);
|
||||
|
||||
CheckMenuItem citem = new CheckMenuItem.with_label (_("Full Screen"));
|
||||
// see http://bugzilla.gnome.org/show_bug.cgi?id=551184
|
||||
// FIXME: we're also not getting a proper accelerator shown in the menu item
|
||||
citem.add_accelerator("activate", accel_group, Gdk.keyval_from_name ("F11"), 0, 0);
|
||||
//citem.set_accel_path ("<GstMi-Main>/MainMenu/View/FullScreen");
|
||||
//AccelMap.add_entry ("<GstMi-Main>/MainMenu/View/FullScreen", 0xffc8, 0);
|
||||
|
||||
sub_menu.append (citem);
|
||||
citem.toggled.connect (on_fullscreen_toggled);
|
||||
|
||||
// add "help" menu with "about" item
|
||||
item = new Gtk.MenuItem.with_label (_("Help"));
|
||||
menu_bar.append (item);
|
||||
|
||||
sub_menu = new Gtk.Menu ();
|
||||
item.set_submenu (sub_menu);
|
||||
|
||||
item = new Gtk.MenuItem.with_label (_("About"));
|
||||
sub_menu.append (item);
|
||||
item.activate.connect (on_about_clicked);
|
||||
|
||||
return (menu_bar);
|
||||
}
|
||||
|
||||
// signal handler
|
||||
|
||||
private void on_update_preview () {
|
||||
File file = chooser.get_file();
|
||||
bool res = false;
|
||||
|
||||
if (file != null && file.query_file_type (FileQueryInfoFlags.NONE, null) == FileType.REGULAR) {
|
||||
res = info.discover (chooser.get_uri());
|
||||
}
|
||||
chooser.set_preview_widget_active (res);
|
||||
}
|
||||
|
||||
private void on_fullscreen_toggled (CheckMenuItem item) {
|
||||
if (item.active) {
|
||||
fullscreen();
|
||||
} else {
|
||||
unfullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
private void on_about_clicked (Gtk.MenuItem item) {
|
||||
AboutDialog dlg = new AboutDialog ();
|
||||
|
||||
dlg.set_version(Config.PACKAGE_VERSION);
|
||||
dlg.set_program_name("GStreamer Media Info");
|
||||
dlg.set_comments(_("Quickly browse, play and analyze media files."));
|
||||
dlg.set_copyright("Stefan Sauer <ensonic@users.sf.net>");
|
||||
dlg.run();
|
||||
dlg.hide();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,982 +0,0 @@
|
|||
/* GStreamer media browser
|
||||
* Copyright (C) 2010-2013 Stefan Sauer <ensonic@user.sf.net>
|
||||
*
|
||||
* 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 Steet,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using Gtk;
|
||||
using Gst;
|
||||
using Gst.PbUtils;
|
||||
using Gee;
|
||||
|
||||
public class MediaInfo.Info : Box
|
||||
{
|
||||
// layout
|
||||
private bool compact_mode = false;
|
||||
// ui components
|
||||
private Label mime_type;
|
||||
private Label duration;
|
||||
private Image icon_image;
|
||||
private Notebook container_streams;
|
||||
private Notebook all_streams; // there is either all or separate a/mediainfo/v/st
|
||||
private Notebook video_streams; // depending on screen resolution
|
||||
private Notebook audio_streams;
|
||||
private Notebook subtitle_streams;
|
||||
private TreeView toc_entries;
|
||||
private Preview preview;
|
||||
private ScrolledWindow info_area;
|
||||
// gstreamer objects
|
||||
private Discoverer dc;
|
||||
private Pipeline pb;
|
||||
private Video.Overlay overlay;
|
||||
private bool have_video = false;
|
||||
private uint num_video_streams;
|
||||
private uint num_audio_streams;
|
||||
private uint num_subtitle_streams;
|
||||
private ArrayList<Gdk.Point?> video_resolutions = null;
|
||||
// stream data
|
||||
private Gdk.Pixbuf album_art = null;
|
||||
|
||||
private HashMap<string, string> resolutions;
|
||||
private HashSet<string> tag_black_list;
|
||||
private HashMap<string, string> wikilinks;
|
||||
|
||||
public Info () {
|
||||
Label label;
|
||||
Table table;
|
||||
AttachOptions fill = AttachOptions.FILL;
|
||||
AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL;
|
||||
uint row = 0;
|
||||
|
||||
// configure the view
|
||||
set_border_width (0);
|
||||
set_orientation (Gtk.Orientation.VERTICAL);
|
||||
|
||||
// setup lookup tables
|
||||
// TODO(ensonic); move to a data class
|
||||
// video resolutions: http://upload.wikimedia.org/wikipedia/mediainfo/commons/e/e5/Vector_Video_Standards2.svg
|
||||
// FIXME: these are only for PAR = 1:1
|
||||
// we could have another list for CIF (http://en.wikipedia.org/wiki/Common_Intermediate_Format)
|
||||
resolutions = new HashMap<string, string> ();
|
||||
// 5:4
|
||||
resolutions["1280 x 1024"] = "SXGA";
|
||||
resolutions["2560 x 2048"] = "QSXGA";
|
||||
// 4:3
|
||||
resolutions["320 x 240"] = "QVGA";
|
||||
resolutions["640 x 480"] = "VGA";
|
||||
resolutions["768 x 576"] = "PAL";
|
||||
resolutions["800 x 600"] = "SVGA";
|
||||
resolutions["1024 x 768"] = "XGA";
|
||||
resolutions["1400 x 1050"] = "SXGA+";
|
||||
resolutions["1600 x 1200"] = "UXGA";
|
||||
resolutions["2048 x 1536"] = "QXGA";
|
||||
// 8:5 (16:10)
|
||||
resolutions["320 x 200"] = "CGA";
|
||||
resolutions["1280 x 800"] = "WXGA";
|
||||
resolutions["1680 x 1050"] = "WXGA+";
|
||||
resolutions["1920 x 1200"] = "WUXGA";
|
||||
// 5:3
|
||||
resolutions["800 x 480"] = "WVGA";
|
||||
resolutions["1280 x 768"] = "WXGA";
|
||||
// 16:9
|
||||
resolutions["854 x 480"] = "WVGA";
|
||||
resolutions["1280 x 720"] = "HD 720";
|
||||
resolutions["1920 x 1080"] = "HD 1080";
|
||||
|
||||
// tags to skip (already extraced to specific discoverer fields)
|
||||
tag_black_list = new HashSet<string> ();
|
||||
tag_black_list.add ("bitrate");
|
||||
tag_black_list.add ("container-format");
|
||||
tag_black_list.add ("duration");
|
||||
tag_black_list.add ("language-code");
|
||||
tag_black_list.add ("nominal-bitrate");
|
||||
tag_black_list.add ("maximum-bitrate");
|
||||
|
||||
// map from media-type/codec-desc to wikipedia-articles, see set_wikilink()
|
||||
// where they are prefixed with 'http://en.wikipedia.org/wiki/'
|
||||
// alternative source could be http://codecdictionary.com/
|
||||
wikilinks = new HashMap<string, string> ();
|
||||
// container/tag formats
|
||||
wikilinks["application/mxf"] = "Material_Exchange_Format";
|
||||
wikilinks["audio/x-aiff"] = "Audio_Interchange_File_Format";
|
||||
wikilinks["application/x-apetag"] = "APE_tag";
|
||||
wikilinks["audio/ogg"] = "Ogg";
|
||||
wikilinks["application/vnd.rn-realmedia"] = "RealMedia";
|
||||
wikilinks["application/x-3gp"] = "3GP_and_3G2";
|
||||
wikilinks["application/x-annodex"] = "Ogg";
|
||||
wikilinks["application/x-id3"] = "ID3";
|
||||
wikilinks["application/x-pn-realaudio"] = "RealAudio";
|
||||
wikilinks["video/x-flv"] = "Flash_Video";
|
||||
wikilinks["video/x-matroska"] = "Matroska";
|
||||
wikilinks["video/mpeg"] = "MPEG-1#Part_1:_Systems";
|
||||
wikilinks["video/mpegts"] = "MPEG_transport_stream";
|
||||
wikilinks["video/ogg"] = "Ogg";
|
||||
wikilinks["video/webm"] = "WebM";
|
||||
wikilinks["video/x-ms-asf"] = "Advanced_Systems_Format";
|
||||
wikilinks["video/x-msvideo"] = "Audio_Video_Interleave";
|
||||
wikilinks["video/x-quicktime"] = "QuickTime_File_Format";
|
||||
wikilinks["video/quicktime"] = "QuickTime_File_Format";
|
||||
// audio codecs
|
||||
wikilinks["MPEG-1 Layer 2 (MP2)"] = "MPEG-1_Audio_Layer_II";
|
||||
wikilinks["MPEG-1 Layer 3 (MP3)"] = "MP3";
|
||||
wikilinks["MPEG-4 AAC"] = "Advanced_Audio_Coding";
|
||||
wikilinks["Windows Media Audio 8"] = "Windows_Media_Audio#Windows_Media_Audio";
|
||||
wikilinks["audio/x-ac3"] = "Dolby_AC-3";
|
||||
wikilinks["audio/x-flac"] = "Flac";
|
||||
wikilinks["audio/x-opus"] = "Opus_codec";
|
||||
wikilinks["audio/x-qdm"] = "QDesign";
|
||||
wikilinks["audio/x-vorbis"] = "Vorbis";
|
||||
wikilinks["audio/x-wav"] = "WAV";
|
||||
wikilinks["audio/x-wavpack"] = "Wavpack";
|
||||
// video codecs
|
||||
wikilinks["MPEG-1 Video"] = "MPEG-1#Part_2:_Video";
|
||||
wikilinks["MPEG-4 Video"] = "MPEG4";
|
||||
wikilinks["Windows Media Video 9 Screen"] = "Windows_Media_Video#Windows_Media_Video_Screen";
|
||||
wikilinks["image/gif"] = "GIF";
|
||||
wikilinks["image/jpeg"] = "JPEG";
|
||||
wikilinks["image/png"] = "Portable_Network_Graphics";
|
||||
wikilinks["video/x-divx"] = "MPEG-4_Part_2";
|
||||
wikilinks["video/x-flash-video"] = "Sorenson_codec#Sorenson_Spark_.28FLV1.29";
|
||||
wikilinks["video/x-h264"] = "H.264/MPEG-4_AVC";
|
||||
wikilinks["video/x-msmpeg"] = "MPEG-4_Part_2";
|
||||
wikilinks["video/x-svq"] = "Sorenson_codec#Sorenson_Video_.28SVQ1.2FSVQ3.29";
|
||||
wikilinks["video/x-theora"] = "Theora";
|
||||
wikilinks["video/x-vp8"] = "VP8";
|
||||
wikilinks["video/x-xvid"] = "Xvid";
|
||||
|
||||
video_resolutions = new ArrayList<Gdk.Point?> ();
|
||||
|
||||
int screen_height = Gdk.Screen.get_default().get_height();
|
||||
if (screen_height <= 600) {
|
||||
compact_mode = true;
|
||||
}
|
||||
|
||||
// add widgets
|
||||
preview = new Preview ();
|
||||
preview.add_events (Gdk.EventMask.STRUCTURE_MASK);
|
||||
preview.configure_event.connect (on_preview_configured);
|
||||
pack_start (preview, false, false, 0);
|
||||
|
||||
info_area = new ScrolledWindow (null, null);
|
||||
info_area.set_policy (PolicyType.NEVER, PolicyType.ALWAYS);
|
||||
pack_start (info_area, true, true, 0);
|
||||
|
||||
table = new Table (8, 3, false);
|
||||
info_area.add (table);
|
||||
|
||||
/* TODO(ensonic): add a 'Source' box ? maybe only for streams?
|
||||
Transport: {file, http, rtsp, ....} as wikilink
|
||||
Size: (in bytes)
|
||||
*/
|
||||
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Container</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1);
|
||||
|
||||
icon_image = new Image ();
|
||||
table.attach (icon_image, 2, 3, row, row+3, fill, 0, 0, 0);
|
||||
row++;
|
||||
|
||||
label = new Label ("Mime-Type:");
|
||||
label.set_alignment (1.0f, 0.5f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0);
|
||||
mime_type = new Label (null);
|
||||
mime_type.set_alignment (0.0f, 0.5f);
|
||||
mime_type.set_selectable (true);
|
||||
table.attach (mime_type, 1, 2, row, row+1, fill_exp, 0, 3, 1);
|
||||
row++;
|
||||
|
||||
label = new Label ("Duration:");
|
||||
label.set_alignment (1.0f, 0.5f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0);
|
||||
duration = new Label (null);
|
||||
duration.set_alignment (0.0f, 0.5f);
|
||||
duration.set_selectable (true);
|
||||
table.attach (duration, 1, 2, row, row+1, fill_exp, 0, 3, 1);
|
||||
row++;
|
||||
|
||||
container_streams = new Notebook ();
|
||||
table.attach (container_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
if (compact_mode) {
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Streams</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
all_streams = new Notebook ();
|
||||
all_streams.switch_page.connect (on_stream_switched);
|
||||
table.attach (all_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
} else {
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Video Streams</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
video_streams = new Notebook ();
|
||||
video_streams.switch_page.connect (on_video_stream_switched);
|
||||
table.attach (video_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Audio Streams</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
audio_streams = new Notebook ();
|
||||
audio_streams.switch_page.connect (on_audio_stream_switched);
|
||||
table.attach (audio_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Subtitle Streams</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
subtitle_streams = new Notebook ();
|
||||
subtitle_streams.switch_page.connect (on_subtitle_stream_switched);
|
||||
table.attach (subtitle_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
}
|
||||
|
||||
label = new Label (null);
|
||||
label.set_markup("<b>Toc</b>");
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
table.attach (label, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
// TODO(ensonic): use tabs for editions?
|
||||
toc_entries = new TreeView ();
|
||||
toc_entries.set_enable_search (false);
|
||||
toc_entries.set_headers_visible (false);
|
||||
toc_entries.get_selection ().set_mode (SelectionMode.BROWSE);
|
||||
toc_entries.cursor_changed.connect (on_toc_entry_changed);
|
||||
|
||||
TreeViewColumn column = new TreeViewColumn ();
|
||||
toc_entries.append_column (column);
|
||||
CellRendererText renderer = new CellRendererText ();
|
||||
column.pack_start (renderer, false);
|
||||
column.add_attribute (renderer, "text", 0);
|
||||
|
||||
table.attach (toc_entries, 0, 3, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
// TODO: add message list widget
|
||||
|
||||
// set up the gstreamer components
|
||||
try {
|
||||
dc = new Discoverer ((ClockTime)(Gst.SECOND * 10));
|
||||
dc.discovered.connect (on_uri_discovered);
|
||||
} catch (Error e) {
|
||||
debug ("Failed to create the discoverer: %s: %s", e.domain.to_string (), e.message);
|
||||
}
|
||||
|
||||
pb = ElementFactory.make ("playbin", "player") as Pipeline;
|
||||
Gst.Bus bus = pb.get_bus ();
|
||||
//bus.set_sync_handler ((Gst.BusSyncHandler)bus.sync_signal_handler);
|
||||
bus.enable_sync_message_emission();
|
||||
bus.sync_message["element"].connect (on_element_sync_message);
|
||||
bus.add_signal_watch();
|
||||
bus.message["elemnt"].connect (on_element_message);
|
||||
}
|
||||
|
||||
~Info () {
|
||||
// stop previous playback
|
||||
pb.set_state (State.NULL);
|
||||
}
|
||||
|
||||
// public methods
|
||||
|
||||
public bool discover (string uri) {
|
||||
bool res = true;
|
||||
|
||||
if (uri != null) {
|
||||
File file = File.new_for_uri(uri);
|
||||
|
||||
// stop previous playback
|
||||
pb.set_state (State.READY);
|
||||
album_art = null;
|
||||
|
||||
try {
|
||||
// TODO(ensonic): this does not work for streams
|
||||
FileInfo finfo = file.query_info ("standard::*", FileQueryInfoFlags.NONE, null);
|
||||
mime_type.set_text (finfo.get_attribute_string (FileAttribute.STANDARD_CONTENT_TYPE));
|
||||
icon_image.set_from_gicon ((Icon) finfo.get_attribute_object (FileAttribute.STANDARD_ICON), IconSize.DIALOG);
|
||||
} catch (Error e) {
|
||||
debug ("Failed to query file info from %s: %s: %s", uri, e.domain.to_string (), e.message);
|
||||
}
|
||||
|
||||
debug ("Discovering '%s'", uri);
|
||||
/*if (true) {*/
|
||||
// sync API
|
||||
try {
|
||||
process_new_uri (dc.discover_uri (uri));
|
||||
} catch (Error e) {
|
||||
// we're failing here when there are missing container plugins
|
||||
debug ("Failed to extract metadata from %s: %s: %s", uri, e.domain.to_string (), e.message);
|
||||
}
|
||||
/*} else {
|
||||
// TODO(ensonic): this breaks when discovering 'too quickly'
|
||||
// async API
|
||||
dc.stop();
|
||||
dc.start();
|
||||
dc.discover_uri_async (uri);
|
||||
}*/
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
|
||||
private void on_uri_discovered (DiscovererInfo info, Error e) {
|
||||
if (e != null) {
|
||||
debug ("Failed to extract metadata from %s: %s: %s", info.get_uri(), e.domain.to_string (), e.message);
|
||||
process_new_uri (null);
|
||||
} else {
|
||||
process_new_uri (info);
|
||||
}
|
||||
}
|
||||
|
||||
private void process_new_uri (DiscovererInfo? info) {
|
||||
GLib.List<DiscovererStreamInfo> l;
|
||||
DiscovererStreamInfo sinfo;
|
||||
Notebook nb;
|
||||
unowned Toc toc = null;
|
||||
// sort streams
|
||||
ArrayList<string> sids = new ArrayList<string> ();
|
||||
int six;
|
||||
int page_offset = 0;
|
||||
|
||||
// reset notebooks
|
||||
clear_notebook (container_streams);
|
||||
if (compact_mode) {
|
||||
clear_notebook (all_streams);
|
||||
} else {
|
||||
clear_notebook (video_streams);
|
||||
clear_notebook (audio_streams);
|
||||
clear_notebook (subtitle_streams);
|
||||
}
|
||||
|
||||
if (info == null) {
|
||||
toc_entries.set_model (null);
|
||||
duration.set_text ("");
|
||||
return;
|
||||
}
|
||||
|
||||
// prepare file from preview
|
||||
((GLib.Object)pb).set_property ("uri", info.get_uri());
|
||||
pb.set_state (State.PAUSED);
|
||||
|
||||
// update info view
|
||||
duration.set_text (format_time(info.get_duration ()));
|
||||
|
||||
/*
|
||||
< ensonic> bilboed-pi: is gst_discoverer_info_get_container_streams() containing the info for the conatiner or can those be multiple ones as well?
|
||||
< bilboed-pi> ensonic, if you have DV system-stream in MXF .... you'll have two container streams
|
||||
< bilboed-pi> (yes, they exist)
|
||||
< bilboed-pi> I'd recommend grabbing the top-level stream_info and walking your way down
|
||||
*/
|
||||
// do container streams
|
||||
nb = container_streams;
|
||||
sinfo = info.get_stream_info ();
|
||||
toc = sinfo.get_toc();
|
||||
nb.append_page (describe_container_stream (sinfo), new Label (@"container 0"));
|
||||
six = 1;
|
||||
//l = info.get_stream_list ();
|
||||
// FIXME: this is always null?
|
||||
l = info.get_container_streams ();
|
||||
for (int i = 0; i < l.length (); i++) {
|
||||
sinfo = l.nth_data (i);
|
||||
|
||||
// need to skip audio/video/subtitle streams
|
||||
string nick = sinfo.get_stream_type_nick();
|
||||
debug("container[%d]=%s : %s", i, nick,sinfo.get_stream_id());
|
||||
if ((nick != "container") && (nick != "unknown")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (toc == null) {
|
||||
toc = sinfo.get_toc();
|
||||
}
|
||||
|
||||
nb.append_page (describe_container_stream (sinfo), new Label (@"container $six"));
|
||||
six++;
|
||||
}
|
||||
nb.show_all();
|
||||
|
||||
// do video streams
|
||||
nb = compact_mode ? all_streams : video_streams;
|
||||
l = info.get_video_streams ();
|
||||
num_video_streams = l.length ();
|
||||
have_video = (num_video_streams > 0);
|
||||
video_resolutions.clear();
|
||||
sids.clear();
|
||||
for (int i = 0; i < num_video_streams; i++) {
|
||||
sinfo = l.nth_data (i);
|
||||
debug("video[%d]=%s", i, sinfo.get_stream_id());
|
||||
|
||||
if (toc == null) {
|
||||
toc = sinfo.get_toc();
|
||||
}
|
||||
|
||||
six = get_stream_index (sinfo, sids);
|
||||
nb.insert_page (describe_video_stream (sinfo), new Label (@"video $i"), page_offset + six);
|
||||
}
|
||||
if (compact_mode) {
|
||||
page_offset += (int)num_video_streams;
|
||||
} else {
|
||||
nb.show_all();
|
||||
}
|
||||
|
||||
// do audio streams
|
||||
nb = compact_mode ? all_streams : audio_streams;
|
||||
l = info.get_audio_streams ();
|
||||
num_audio_streams = l.length ();
|
||||
sids.clear();
|
||||
for (int i = 0; i < num_audio_streams; i++) {
|
||||
sinfo = l.nth_data (i);
|
||||
debug("audio[%d]=%s", i, sinfo.get_stream_id());
|
||||
|
||||
if (toc == null) {
|
||||
toc = sinfo.get_toc();
|
||||
}
|
||||
|
||||
six = get_stream_index (sinfo, sids);
|
||||
nb.insert_page (describe_audio_stream (sinfo), new Label (@"audio $i"), page_offset + six);
|
||||
}
|
||||
if (compact_mode) {
|
||||
page_offset += (int)num_audio_streams;
|
||||
} else {
|
||||
nb.show_all();
|
||||
}
|
||||
|
||||
// do subtitle streams
|
||||
nb = compact_mode ? all_streams : subtitle_streams;
|
||||
l = info.get_subtitle_streams ();
|
||||
num_subtitle_streams = l.length ();
|
||||
sids.clear();
|
||||
for (int i = 0; i < num_subtitle_streams; i++) {
|
||||
sinfo = l.nth_data (i);
|
||||
|
||||
if (toc == null) {
|
||||
toc = sinfo.get_toc();
|
||||
}
|
||||
|
||||
six = get_stream_index (sinfo, sids);
|
||||
nb.insert_page (describe_subtitle_stream (sinfo), new Label (@"subtitle $i"), page_offset + six);
|
||||
}
|
||||
if (compact_mode) {
|
||||
page_offset += (int)num_subtitle_streams;
|
||||
}
|
||||
nb.show_all();
|
||||
|
||||
toc_entries.set_model (build_toc_info (toc));
|
||||
toc_entries.expand_all ();
|
||||
|
||||
// TODO(ensonic): ideally do async wait for PAUSED
|
||||
if (have_video) {
|
||||
Gdk.Point res = video_resolutions[0];
|
||||
preview.set_content_size(res.x, res.y);
|
||||
preview.set_double_buffered (false);
|
||||
} else if (album_art != null) {
|
||||
preview.set_static_content(album_art);
|
||||
preview.set_double_buffered (true);
|
||||
} else {
|
||||
preview.reset();
|
||||
preview.set_double_buffered (true);
|
||||
}
|
||||
|
||||
// play file
|
||||
pb.set_state (State.PLAYING);
|
||||
}
|
||||
|
||||
// signal handlers
|
||||
|
||||
private bool on_preview_configured (Gdk.EventConfigure event) {
|
||||
if (overlay != null)
|
||||
overlay.expose();
|
||||
return false;
|
||||
}
|
||||
|
||||
private void on_element_sync_message (Gst.Bus bus, Message message) {
|
||||
if (Video.is_video_overlay_prepare_window_handle_message (message)) {
|
||||
Gdk.Window window = preview.get_window ();
|
||||
debug ("prepare overlay: %p", window);
|
||||
overlay = message.src as Gst.Video.Overlay;
|
||||
overlay.set_window_handle ((uint*) ((Gdk.X11.Window) window).get_xid ());
|
||||
debug ("prepared overlay");
|
||||
}
|
||||
}
|
||||
|
||||
private void on_element_message (Gst.Bus bus, Message message) {
|
||||
if (PbUtils.is_missing_plugin_message (message)) {
|
||||
string details = PbUtils.missing_plugin_message_get_description(message);
|
||||
debug ("Missing plugin: %s", details);
|
||||
// TODO(ensonic): use this in addition to e.. container/codec names
|
||||
}
|
||||
}
|
||||
|
||||
private void on_video_stream_switched (Notebook nb, Widget page, uint page_num) {
|
||||
if (pb.current_state > State.PAUSED) {
|
||||
debug ("Switching video to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-video", (int)page_num);
|
||||
Gdk.Point res = video_resolutions[(int)page_num];
|
||||
preview.set_content_size(res.x, res.y);
|
||||
}
|
||||
}
|
||||
|
||||
private void on_audio_stream_switched (Notebook nb, Widget page, uint page_num) {
|
||||
if (pb.current_state > State.PAUSED) {
|
||||
debug ("Switching audio to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-audio", (int)page_num);
|
||||
}
|
||||
}
|
||||
|
||||
private void on_subtitle_stream_switched (Notebook nb, Widget page, uint page_num) {
|
||||
if (pb.current_state > State.PAUSED) {
|
||||
debug ("Switching subtitle to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-text", (int)page_num);
|
||||
}
|
||||
}
|
||||
|
||||
private void on_stream_switched (Notebook nb, Widget page, uint page_num) {
|
||||
if (pb.current_state > State.PAUSED) {
|
||||
if (page_num < num_video_streams) {
|
||||
debug ("Switching video to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-video", (int)page_num);
|
||||
return;
|
||||
}
|
||||
page_num -= num_video_streams;
|
||||
if (page_num < num_audio_streams) {
|
||||
debug ("Switching audio to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-audio", (int)page_num);
|
||||
return;
|
||||
}
|
||||
page_num -= num_audio_streams;
|
||||
if (page_num < num_subtitle_streams) {
|
||||
debug ("Switching subtitle to: %u", page_num);
|
||||
((GLib.Object)pb).set_property ("current-text", (int)page_num);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void on_toc_entry_changed (TreeView view) {
|
||||
TreeSelection sel = view.get_selection ();
|
||||
if (sel == null)
|
||||
return;
|
||||
|
||||
TreeModel model;
|
||||
TreeIter iter;
|
||||
if (sel.get_selected (out model, out iter)) {
|
||||
int64 start;
|
||||
model.get(iter, 1, out start, -1);
|
||||
if (start != Gst.CLOCK_TIME_NONE) {
|
||||
// we ignore 'stop' right now
|
||||
pb.seek_simple (Gst.Format.TIME, Gst.SeekFlags.FLUSH, start);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// helpers
|
||||
|
||||
private Widget describe_container_stream (DiscovererStreamInfo sinfo) {
|
||||
Table table = new Table (2, 4, false);
|
||||
|
||||
uint row = 0;
|
||||
add_table_rows_for_caps (table, row, "Format:", sinfo.get_caps ());
|
||||
row+=2;
|
||||
|
||||
// gchar ** get_missing_elements_installer_details()
|
||||
if (add_table_row_for_structure (table, row, sinfo.get_misc ())) {
|
||||
row++;
|
||||
}
|
||||
if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) {
|
||||
row++;
|
||||
}
|
||||
|
||||
return (Widget)table;
|
||||
}
|
||||
|
||||
private Widget describe_video_stream (DiscovererStreamInfo sinfo) {
|
||||
DiscovererVideoInfo vinfo = (DiscovererVideoInfo)sinfo;
|
||||
Table table = new Table (2, 8, false);
|
||||
|
||||
Gdk.Point res = {
|
||||
(int)((DiscovererVideoInfo)sinfo).get_width(),
|
||||
(int)((DiscovererVideoInfo)sinfo).get_height()
|
||||
};
|
||||
video_resolutions.add(res);
|
||||
|
||||
string str;
|
||||
uint row = 0;
|
||||
add_table_rows_for_caps (table, row, "Codec:", sinfo.get_caps ());
|
||||
row+=2;
|
||||
|
||||
add_table_row_for_bitrates (table, row, vinfo.get_bitrate(), vinfo.get_max_bitrate());
|
||||
row++;
|
||||
|
||||
// add named resolutions: (640x480=VGA)
|
||||
string resolution = "%u x %u".printf (res.x, res.y);
|
||||
string named_res = resolutions[resolution];
|
||||
if (named_res != null) {
|
||||
str = "%s (%s)".printf (named_res, resolution);
|
||||
} else {
|
||||
str = resolution;
|
||||
}
|
||||
add_table_row_for_string (table, row, "Resolution:", str);
|
||||
row++;
|
||||
|
||||
double fps_num = (double)vinfo.get_framerate_num();
|
||||
double fps_denom = (double)vinfo.get_framerate_denom();
|
||||
if (fps_num != 0) {
|
||||
str = "%.3lf frames/second".printf (fps_num/fps_denom);
|
||||
} else {
|
||||
if (fps_denom == 1) {
|
||||
// TODO(ensonic): there are a few files where video is flaged as still image
|
||||
// ~/temp/Video/luc_00036.MTS
|
||||
// ~/temp/Video/lookinggood.asx
|
||||
str = "still image";
|
||||
} else {
|
||||
str = "unknown";
|
||||
}
|
||||
}
|
||||
add_table_row_for_string (table, row, "Framerate:", str);
|
||||
row++;
|
||||
|
||||
str = "%u : %u".printf (vinfo.get_par_num(),vinfo.get_par_denom());
|
||||
add_table_row_for_string (table, row, "PixelAspect:", str);
|
||||
row++;
|
||||
|
||||
str = "%u bits/pixel".printf (vinfo.get_depth());
|
||||
add_table_row_for_string (table, row, "Bitdepth:", str);
|
||||
row++;
|
||||
|
||||
str = "%s".printf (vinfo.is_interlaced() ? "true" : "false");
|
||||
add_table_row_for_string (table, row, "Interlaced:", str);
|
||||
row++;
|
||||
|
||||
if (add_table_row_for_structure (table, row, sinfo.get_misc ())) {
|
||||
row++;
|
||||
}
|
||||
if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) {
|
||||
row++;
|
||||
}
|
||||
|
||||
return (Widget)table;
|
||||
}
|
||||
|
||||
private Widget describe_audio_stream (DiscovererStreamInfo sinfo) {
|
||||
DiscovererAudioInfo ainfo = (DiscovererAudioInfo)sinfo;
|
||||
Table table = new Table (2, 7, false);
|
||||
|
||||
string str;
|
||||
uint row = 0;
|
||||
add_table_rows_for_caps (table, row, "Codec:", sinfo.get_caps ());
|
||||
row+=2;
|
||||
|
||||
add_table_row_for_bitrates (table, row, ainfo.get_bitrate(), ainfo.get_max_bitrate());
|
||||
row++;
|
||||
|
||||
str = "%u samples/second".printf (ainfo.get_sample_rate());
|
||||
add_table_row_for_string (table, row, "Samplerate:", str);
|
||||
row++;
|
||||
|
||||
// TODO: check channel layouts, can we have some nice names here ?
|
||||
// GstDiscoverer should expose channel positions
|
||||
str = "%u".printf (ainfo.get_channels());
|
||||
add_table_row_for_string (table, row, "Channels:", str);
|
||||
row++;
|
||||
|
||||
str = "%u bits/sample".printf (ainfo.get_depth());
|
||||
add_table_row_for_string (table, row, "Bitdepth:", str);
|
||||
row++;
|
||||
|
||||
add_table_row_for_string (table, row, "Language:", ainfo.get_language());
|
||||
row++;
|
||||
|
||||
if (add_table_row_for_structure (table, row, sinfo.get_misc ())) {
|
||||
row++;
|
||||
}
|
||||
if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) {
|
||||
row++;
|
||||
}
|
||||
|
||||
return (Widget)table;
|
||||
}
|
||||
|
||||
private Widget describe_subtitle_stream (DiscovererStreamInfo sinfo) {
|
||||
DiscovererSubtitleInfo tinfo = (DiscovererSubtitleInfo) sinfo;
|
||||
Table table = new Table (2, 5, false);
|
||||
|
||||
uint row = 0;
|
||||
add_table_rows_for_caps (table, row, "Codec:", sinfo.get_caps ());
|
||||
row+=2;
|
||||
|
||||
add_table_row_for_string (table, row, "Language:", tinfo.get_language());
|
||||
row++;
|
||||
|
||||
if (add_table_row_for_structure (table, row, sinfo.get_misc ())) {
|
||||
row++;
|
||||
}
|
||||
if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) {
|
||||
row++;
|
||||
}
|
||||
|
||||
return (Widget)table;
|
||||
}
|
||||
|
||||
private void clear_notebook (Notebook nb) {
|
||||
while (nb.get_n_pages() > 0) {
|
||||
nb.remove_page (-1);
|
||||
}
|
||||
}
|
||||
|
||||
private void set_wikilink (Label label, Caps caps) {
|
||||
string str = get_codec_description (caps);
|
||||
string wikilink = wikilinks[str];
|
||||
|
||||
if (wikilink == null) {
|
||||
wikilink = wikilinks[caps.get_structure(0).get_name()];
|
||||
}
|
||||
if (wikilink != null) {
|
||||
// FIXME: make prefix (en) and link translatable
|
||||
label.set_markup ("<a href=\"http://en.wikipedia.org/wiki/%s\">%s</a>".printf (wikilink, str));
|
||||
} else {
|
||||
label.set_text (str);
|
||||
}
|
||||
}
|
||||
|
||||
private void add_table_rows_for_caps (Table table, uint row, string title, Caps caps) {
|
||||
AttachOptions fill = AttachOptions.FILL;
|
||||
AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL;
|
||||
|
||||
// filter buffer entries from caps
|
||||
// TODO(ensonic): add filtering api to gstreamer
|
||||
Structure structure = caps.get_structure (0).copy();
|
||||
while (structure.foreach ( (id, val) => {
|
||||
if (val.holds(typeof (Gst.Buffer))) {
|
||||
structure.remove_field (id.to_string ());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}) == false) {}
|
||||
string str = structure.to_string( );
|
||||
Label label = new Label (str);
|
||||
label.set_ellipsize (Pango.EllipsizeMode.END);
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
label.set_selectable (true);
|
||||
label.set_tooltip_text (str);
|
||||
table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1);
|
||||
row++;
|
||||
|
||||
label = new Label (title);
|
||||
label.set_alignment (1.0f, 0.5f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0);
|
||||
label = new Label (null);
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
label.set_selectable (true);
|
||||
label.set_use_markup (true);
|
||||
set_wikilink (label, caps);
|
||||
table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1);
|
||||
}
|
||||
|
||||
private void add_table_row_for_bitrates (Table table, uint row, uint br, uint mbr) {
|
||||
string str;
|
||||
|
||||
if (br == mbr) {
|
||||
mbr = 0; // no point in printing this as a range
|
||||
}
|
||||
|
||||
if (mbr != 0) {
|
||||
str = "%.2f ... %.2f kbit/second".printf (br/1024.0, mbr/1024.0);
|
||||
} else {
|
||||
if (br != 0) {
|
||||
str = "%.2f kbit/second".printf (br/1024.0);
|
||||
} else {
|
||||
str = "unknown";
|
||||
}
|
||||
}
|
||||
add_table_row_for_string (table, row, "Bitrate:", str);
|
||||
}
|
||||
|
||||
private void add_table_row_for_string (Table table, uint row, string title, string? str) {
|
||||
AttachOptions fill = AttachOptions.FILL;
|
||||
AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL;
|
||||
|
||||
Label label = new Label (title);
|
||||
label.set_alignment (1.0f, 0.5f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0);
|
||||
label = new Label (str);
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
label.set_selectable (true);
|
||||
table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1);
|
||||
}
|
||||
|
||||
private bool add_table_row_for_structure (Table table, uint row, Structure? s) {
|
||||
if (s == null)
|
||||
return false;
|
||||
|
||||
AttachOptions fill = AttachOptions.FILL;
|
||||
AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL;
|
||||
|
||||
Label label = new Label ("Details:");
|
||||
label.set_alignment (1.0f, 0.5f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0);
|
||||
label = new Label (s.to_string ());
|
||||
label.set_ellipsize (Pango.EllipsizeMode.END);
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
label.set_selectable (true);
|
||||
table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool add_table_row_for_taglist (Table table, uint row, TagList? t) {
|
||||
if (t == null)
|
||||
return false;
|
||||
|
||||
AttachOptions fill = AttachOptions.FILL;
|
||||
AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL;
|
||||
|
||||
Label label = new Label ("Tags:");
|
||||
label.set_alignment (1.0f, 0.0f);
|
||||
table.attach (label, 0, 1, row, row+1, fill, fill, 0, 0);
|
||||
label = new Label (build_taglist_info (t));
|
||||
label.set_ellipsize (Pango.EllipsizeMode.END);
|
||||
label.set_alignment (0.0f, 0.5f);
|
||||
label.set_selectable (true);
|
||||
label.set_use_markup (true);
|
||||
table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
// get stream index where streams are orderd by stream_id
|
||||
private int get_stream_index (DiscovererStreamInfo sinfo, ArrayList<string> sids) {
|
||||
string sid = sinfo.get_stream_id ();
|
||||
int six = 0;
|
||||
|
||||
for (six = 0; six < sids.size; six++) {
|
||||
if (strcmp (sid, sids[six]) <= 0)
|
||||
break;
|
||||
}
|
||||
sids.insert (six, sid);
|
||||
|
||||
return six;
|
||||
}
|
||||
|
||||
private string build_taglist_info (TagList t) {
|
||||
uint i;
|
||||
string str, fn, vstr;
|
||||
GLib.Value v;
|
||||
|
||||
str = "";
|
||||
for (i = 0; i < t.n_tags(); i++) {
|
||||
fn = t.nth_tag_name (i);
|
||||
// skip a few tags
|
||||
if (tag_black_list.contains (fn))
|
||||
continue;
|
||||
if (fn.has_prefix("private-"))
|
||||
continue;
|
||||
|
||||
if (str.length > 0)
|
||||
str += "\n";
|
||||
|
||||
// decode images, we show them in the drawing area
|
||||
v = t.get_value_index (fn, 0);
|
||||
if (v.holds(typeof(Gst.Sample))) {
|
||||
Gst.Sample sample = (Gst.Sample)v.get_boxed();
|
||||
Gst.Buffer buf = sample.get_buffer();
|
||||
Caps c = sample.get_caps();
|
||||
Gst.MapInfo info;
|
||||
buf.map(out info, Gst.MapFlags.READ);
|
||||
|
||||
try {
|
||||
InputStream is = new MemoryInputStream.from_data (info.data,null);
|
||||
album_art = new Gdk.Pixbuf.from_stream (is, null);
|
||||
debug ("found album art");
|
||||
is.close(null);
|
||||
} catch (Error e) {
|
||||
debug ("Decoding album art failed: %s: %s", e.domain.to_string (), e.message);
|
||||
}
|
||||
buf.unmap(info);
|
||||
|
||||
vstr = c.to_string();
|
||||
} else {
|
||||
vstr = Gst.Value.serialize (v).compress ();
|
||||
if (vstr.has_prefix("http://") || vstr.has_prefix("https://")) {
|
||||
vstr = "<a href=\"" + vstr + "\">" + vstr + "</a>";
|
||||
}
|
||||
}
|
||||
str += fn + " = " + vstr;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
private string format_time(ClockTime t) {
|
||||
if (t == Gst.CLOCK_TIME_NONE)
|
||||
return "unknown";
|
||||
|
||||
return "%u:%02u:%02u.%09u".printf (
|
||||
(uint) (t / (SECOND * 60 * 60)),
|
||||
(uint) ((t / (SECOND * 60)) % 60),
|
||||
(uint) ((t / SECOND) % 60),
|
||||
(uint) ((t) % SECOND));
|
||||
}
|
||||
|
||||
private void build_toc_info_for_entry (TreeStore s, TocEntry e, TreeIter? p) {
|
||||
TreeIter iter;
|
||||
int64 start, stop;
|
||||
|
||||
e.get_start_stop_times(out start, out stop);
|
||||
string str = "";
|
||||
if (start != Gst.CLOCK_TIME_NONE) {
|
||||
str += "%s ".printf(format_time((ClockTime)start));
|
||||
}
|
||||
if (stop != Gst.CLOCK_TIME_NONE) {
|
||||
str += "- %s ".printf(format_time((ClockTime)stop));
|
||||
}
|
||||
str += TocEntryType.get_nick(e.get_entry_type());
|
||||
|
||||
s.append(out iter, p);
|
||||
s.set(iter, 0, str, 1, start, 2, stop, -1);
|
||||
|
||||
unowned GLib.List<TocEntry> entries = e.get_sub_entries ();
|
||||
if (entries != null) {
|
||||
foreach (TocEntry se in entries) {
|
||||
build_toc_info_for_entry (s, se, iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private TreeStore? build_toc_info (Toc? t) {
|
||||
if (t == null)
|
||||
return null;
|
||||
|
||||
TreeStore s = new TreeStore(3, typeof (string), typeof (int64), typeof (int64));
|
||||
unowned GLib.List<TocEntry> entries = t.get_entries ();
|
||||
foreach (TocEntry e in entries) {
|
||||
build_toc_info_for_entry (s, e, null);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
/* GStreamer media browser
|
||||
* Copyright (C) 2010-2013 Stefan Sauer <ensonic@user.sf.net>
|
||||
*
|
||||
* 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 Steet,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using Gtk;
|
||||
|
||||
public class MediaInfo.Preview : DrawingArea {
|
||||
private Gdk.Pixbuf content = null;
|
||||
private int width = 0;
|
||||
private int height = 0;
|
||||
private float ratio = 0.0f;
|
||||
private int alloc_width;
|
||||
private int alloc_height;
|
||||
|
||||
construct {
|
||||
set_has_window (true);
|
||||
}
|
||||
|
||||
public void reset () {
|
||||
content = null;
|
||||
ratio = 0.0f;
|
||||
debug ("no content: 0.0");
|
||||
queue_resize ();
|
||||
}
|
||||
|
||||
public void set_static_content (Gdk.Pixbuf? content) {
|
||||
this.content = content;
|
||||
if (content != null) {
|
||||
width = content.get_width ();
|
||||
height = content.get_height ();
|
||||
ratio = (float)width / (float)height;
|
||||
debug ("ratio from album art: %f", ratio);
|
||||
queue_resize ();
|
||||
}
|
||||
}
|
||||
|
||||
public void set_content_size (uint width, uint height) {
|
||||
if (height != 0) {
|
||||
ratio = (float)width / (float)height;
|
||||
} else {
|
||||
ratio = 0.0f;
|
||||
}
|
||||
debug ("ratio from video: %f", ratio);
|
||||
queue_resize ();
|
||||
}
|
||||
|
||||
// vmethods
|
||||
|
||||
public override SizeRequestMode get_request_mode () {
|
||||
return SizeRequestMode.HEIGHT_FOR_WIDTH;
|
||||
}
|
||||
|
||||
public override void get_preferred_width (out int minimal_width, out int natural_width) {
|
||||
if (ratio != 0.0) {
|
||||
minimal_width = 16;
|
||||
natural_width = (int)(alloc_height * ratio);
|
||||
natural_width = int.max (minimal_width, natural_width);
|
||||
} else {
|
||||
minimal_width = natural_width = 0;
|
||||
}
|
||||
debug ("width w,h: %d,%d", natural_width, alloc_height);
|
||||
}
|
||||
|
||||
public override void get_preferred_height (out int minimal_height, out int natural_height) {
|
||||
if (ratio != 0.0) {
|
||||
minimal_height = 12;
|
||||
natural_height = (int)(alloc_width / ratio);
|
||||
natural_height = int.max (minimal_height, natural_height);
|
||||
} else {
|
||||
minimal_height = natural_height = 0;
|
||||
}
|
||||
debug ("height w,h: %d,%d", alloc_width, natural_height);
|
||||
}
|
||||
|
||||
public override void get_preferred_width_for_height (int height, out int minimal_width, out int natural_width) {
|
||||
if (ratio != 0.0) {
|
||||
minimal_width = 16;
|
||||
natural_width = (int)(height * ratio);
|
||||
} else {
|
||||
minimal_width = natural_width = 0;
|
||||
}
|
||||
debug ("width_for_height w,h: %d,%d", natural_width, height);
|
||||
}
|
||||
|
||||
public override void get_preferred_height_for_width (int width, out int minimal_height, out int natural_height) {
|
||||
if (ratio != 0.0) {
|
||||
minimal_height = 12;
|
||||
natural_height = (int)(width / ratio);
|
||||
} else {
|
||||
minimal_height = natural_height = 0;
|
||||
}
|
||||
debug ("height_for_width w,h: %d,%d", width, natural_height);
|
||||
}
|
||||
|
||||
public override void size_allocate (Gtk.Allocation alloc) {
|
||||
base.size_allocate (alloc);
|
||||
|
||||
alloc_width = alloc.width;
|
||||
alloc_height = alloc.height;
|
||||
debug ("alloc x,y: %d,%d w,h: %d,%d",
|
||||
alloc.x, alloc.y, alloc_width, alloc_height);
|
||||
}
|
||||
|
||||
public override void realize () {
|
||||
base.realize();
|
||||
debug ("realize");
|
||||
if (!get_window ().ensure_native ())
|
||||
error ("Couldn't create native window needed for GstVideoOverlay!");
|
||||
}
|
||||
|
||||
public override bool draw (Cairo.Context cr) {
|
||||
if (content != null) {
|
||||
Gdk.Pixbuf pb = content.scale_simple (alloc_width, alloc_height, Gdk.InterpType.BILINEAR);
|
||||
Gdk.cairo_set_source_pixbuf (cr, pb, 0, 0);
|
||||
} else {
|
||||
cr.set_source_rgb (0, 0, 0);
|
||||
}
|
||||
cr.rectangle (0, 0, alloc_width, alloc_height);
|
||||
cr.fill ();
|
||||
debug ("draw w,h: %d,%d", alloc_width, alloc_height);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
/* GStreamer media browser
|
||||
* Copyright (C) 2010-2013 Stefan Sauer <ensonic@user.sf.net>
|
||||
*
|
||||
* 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 Steet,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
using MediaInfo;
|
||||
using GLib;
|
||||
|
||||
bool version;
|
||||
const OptionEntry[] options = {
|
||||
{ "version", 0, 0, OptionArg.NONE, ref version, "Display version number", null },
|
||||
{ null }
|
||||
};
|
||||
|
||||
int main(string[] args) {
|
||||
Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||
Intl.bind_textdomain_codeset (Config.GETTEXT_PACKAGE, "UTF-8");
|
||||
Intl.textdomain (Config.GETTEXT_PACKAGE);
|
||||
|
||||
OptionContext opt_context = new OptionContext (_("<directory|uri>"));
|
||||
opt_context.set_help_enabled (true);
|
||||
opt_context.add_main_entries (options, null);
|
||||
opt_context.add_group (Gst.init_get_option_group ());
|
||||
opt_context.add_group (Gtk.get_option_group (true));
|
||||
try {
|
||||
opt_context.parse (ref args);
|
||||
} catch (Error e) {
|
||||
stdout.printf ("%s", opt_context.get_help(true, null));
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (version) {
|
||||
stdout.printf ("%s\n", Config.PACKAGE_STRING);
|
||||
return (0);
|
||||
}
|
||||
|
||||
// take remaining arg and use as default dir
|
||||
string directory_or_uri = null;
|
||||
if (args.length > 1) {
|
||||
directory_or_uri = args[1];
|
||||
}
|
||||
|
||||
App app = new App (directory_or_uri);
|
||||
app.show_all ();
|
||||
|
||||
Gtk.main ();
|
||||
|
||||
return (0);
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
noinst_DATA = \
|
||||
config.vapi
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(noinst_DATA)
|
||||
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
|
@ -1,19 +0,0 @@
|
|||
[CCode (lower_case_cprefix = "", cheader_filename = "config.h")]
|
||||
namespace Config
|
||||
{
|
||||
/* Package information */
|
||||
public const string PACKAGE_NAME;
|
||||
public const string PACKAGE_STRING;
|
||||
public const string PACKAGE_VERSION;
|
||||
|
||||
/* Gettext package */
|
||||
public const string GETTEXT_PACKAGE;
|
||||
|
||||
/* Configured paths - these variables are not present in config.h, they are
|
||||
* passed to underlying C code as cmd line macros. */
|
||||
public const string G_LOG_DOMAIN;
|
||||
public const string LOCALEDIR; /* /usr/local/share/locale */
|
||||
public const string PKGDATADIR; /* /usr/local/share/gst-mi */
|
||||
public const string PKGLIBDIR; /* /usr/local/lib/mediainfo/gst-mi */
|
||||
}
|
||||
|
Loading…
Reference in a new issue