mirror of
https://github.com/jojo61/vdr-plugin-softhdcuvid.git
synced 2023-10-10 13:37:41 +02:00
Initial commit
This commit is contained in:
parent
9dfbe90a3f
commit
1038725182
662
AGPL-3.0.txt
Normal file
662
AGPL-3.0.txt
Normal file
@ -0,0 +1,662 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license
|
||||
for software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are
|
||||
designed to take away your freedom to share and change the works. By
|
||||
contrast, our General Public Licenses are intended to guarantee your
|
||||
freedom to share and change all versions of a program--to make sure it
|
||||
remains free software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, 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
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds
|
||||
of works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further restriction,
|
||||
you may remove that term. If a license document contains a further
|
||||
restriction but permits relicensing or conveying under this License, you
|
||||
may add to a covered work material governed by the terms of that license
|
||||
document, provided that the further restriction does not survive such
|
||||
relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If 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 convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have permission
|
||||
to link or combine any covered work with a work licensed under version 3
|
||||
of the GNU General Public License into a single combined work, and to
|
||||
convey the resulting work. The terms of this License will continue to
|
||||
apply to the part which is the covered work, but the work with which it is
|
||||
combined will remain governed by version 3 of the GNU General Public
|
||||
License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero 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
|
||||
Program specifies that a certain numbered version of the GNU Affero
|
||||
General Public License "or any later version" applies to it, you have
|
||||
the option of following the terms and conditions either of that
|
||||
numbered version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number
|
||||
of the GNU Affero General Public License, you may choose any version
|
||||
ever published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that
|
||||
proxy's public statement of acceptance of a version permanently
|
||||
authorizes you to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state 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 program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
659
ChangeLog
Normal file
659
ChangeLog
Normal file
@ -0,0 +1,659 @@
|
||||
User johns
|
||||
Date:
|
||||
|
||||
Preparations for new ffmpeg VDPAU API.
|
||||
Added VDPAU multi decoder loop changes to VA-API code.
|
||||
Reenabled VA-API auto detection.
|
||||
Check and enforce USE_PIP is defined, for new code.
|
||||
Fix comment spelling.
|
||||
Disabled old code before removement.
|
||||
Handle change of audio ac3 downmix direct.
|
||||
Speedup queuing output surface, when decoder buffers are full.
|
||||
Fix bug: info shows wrong decoded video surfaces.
|
||||
Calculate queued output surfaces and show them in info message.
|
||||
Add support for new API of vdr 2.3.1.
|
||||
Fix bug: EnableDPMSatBlackScreen only available with USE_SCREENSAVER.
|
||||
- H264_EOS_TRICKSPEED and USE_MPEG_COMPLETE enabled as default.
|
||||
|
||||
User master_red
|
||||
Date: Mon Aug 10 15:29:33 CEST 2015
|
||||
|
||||
Configurable enable DPMS, while black screen is displayed.
|
||||
|
||||
User johns
|
||||
Date: Tue Jun 30 10:12:09 CET 2015
|
||||
|
||||
Fix bug: wrong and crash, if vdr draws pixmaps outside OSD.
|
||||
Fix bug: wrong version number check for av_frame_alloc(), ...
|
||||
Workaround for ffmpeg 2.6 artifacts.
|
||||
Fix bug: brightness and .. are calculated wrong.
|
||||
Add automatic frame rate detection for older ffmpeg versions.
|
||||
Fix bug: destroyed vdpau surfaces still used in queue.
|
||||
Fix bug: need signed char, if compiler has unsigned chars.
|
||||
Try smaller audio puffer, if default size fails.
|
||||
Fix bug: center cut-out didn't use cut off pixels.
|
||||
Fix bug #2058: support for Make.plgcfg.
|
||||
Fix for compile with vdr 2.1.10, for older vdr versions.
|
||||
|
||||
User jinx
|
||||
Date: Mon Feb 16 09:58:06 CET 2015
|
||||
|
||||
Enable toggle AC3 downmix.
|
||||
|
||||
User johns
|
||||
Date: Thu Feb 12 10:30:50 CET 2015
|
||||
|
||||
Compile with vdr 2.1.10.
|
||||
Fix bug: AVCodecContext.framerate not supported.
|
||||
Use video stream frame rate for A/V sync.
|
||||
|
||||
User Antti Seppälä
|
||||
Date: Thu Oct 16 14:15:15 CEST 2014
|
||||
|
||||
Corrected black surface for va-api.
|
||||
|
||||
User johns
|
||||
Date: Thu Oct 16 14:05:17 CEST 2014
|
||||
|
||||
Newer va-api intel drivers support PutImage.
|
||||
Use more portable fork for vfork.
|
||||
Fix crash with VA-API vdpau backend.
|
||||
|
||||
User mini73
|
||||
Date: Sat Oct 11 16:53:18 CEST 2014
|
||||
|
||||
Fix bug: random rubbish at the end of letter.
|
||||
|
||||
User johns
|
||||
Date: Tue Sep 23 12:36:39 CEST 2014
|
||||
|
||||
Fix audio thread close race condition.
|
||||
Support ffmpeg new AVFrame API in the audio codec.
|
||||
Config for automatic AES parameters.
|
||||
Use GCC built-in functions for atomic operations.
|
||||
|
||||
User master_red
|
||||
Date: Wed Jun 4 14:44:32 CEST 2014
|
||||
|
||||
Support detach or suspend in plugin menu.
|
||||
|
||||
User johns
|
||||
Date: Fri May 30 10:18:20 CEST 2014
|
||||
|
||||
Fix "make clean-plugins".
|
||||
Fix compile with newer libav.
|
||||
Fix OSD bugs.
|
||||
Add some VA-API VPP info outputs.
|
||||
Remove build files for old unstable VDR.
|
||||
|
||||
User hd.brummy
|
||||
Date: Thu Jan 30 10:40:49 CET 2014
|
||||
|
||||
Update gentoo ebuild.
|
||||
|
||||
User johns
|
||||
Date: Thu Jan 30 10:36:53 CET 2014
|
||||
|
||||
Fix spelling in arguments help.
|
||||
Add Workaround for alsa blocking audio device.
|
||||
Improves thread handling for audio flush and close.
|
||||
|
||||
User mini73
|
||||
Date: Fri Jan 24 11:30:49 CET 2014
|
||||
|
||||
Fix bug: learing x11 remote keys fails.
|
||||
Add support for umlauts in input fields.
|
||||
|
||||
User johns
|
||||
Date: Tue Jan 14 14:59:44 CET 2014
|
||||
|
||||
Fix alternative OSD support with VDPAU bitmap surfaces.
|
||||
Fix compile error with VDR 2.1.3.
|
||||
Fix bug: memory leak.
|
||||
PIP close clears the last used PIP channel.
|
||||
Fix bug: -DOSD_DEBUG uses old (deleted) variable.
|
||||
Fix bug: Option softhddevice.BlackPicture has no effect.
|
||||
|
||||
User Dr. Seltsam
|
||||
Date: Tue Nov 5 16:46:34 CET 2013
|
||||
|
||||
Add support to configure and clear buffers on channel switch.
|
||||
|
||||
User johns
|
||||
Date: Tue Oct 8 10:18:04 CET 2013
|
||||
|
||||
CLOCK_REALTIME -> CLOCK_MONOTONIC to allow time changes.
|
||||
Add function VideoStreamOpen and always use VideoStreamClose.
|
||||
Softer audio/video sync.
|
||||
Add function GetStats to the video output module.
|
||||
Add function ResetStart to the video output module.
|
||||
Add function SetClosing to the video output module.
|
||||
Generalize GetVaapiContext to GetHwAccelContext.
|
||||
Add compile time configurable trickspeed packets dump.
|
||||
Fix bug #1410: wrong spelled AC-3 and E-AC-3.
|
||||
Add compile time selectable h264 trickspeed workaround.
|
||||
Use ffmpeg new names AVCodecID, AV_CODEC_... .
|
||||
Fix bug: video lagging behind after recording stop.
|
||||
Reduce PES error messages.
|
||||
Fix bug #1392: Wrong value for mixing LFE.
|
||||
Fix bug: wrong grab size, introduced with AMD VDPAU.
|
||||
Use VDR SPU decoder as default.
|
||||
Fix bug: grab image negative quality isn't the default 100.
|
||||
Support AMD VDPAU with surface size != requested size.
|
||||
Add cache for auto-crop buffer.
|
||||
Fix opengl and opengl threads bugs.
|
||||
Initial opengl support with va-api only.
|
||||
Fix "broken driver" message if empty ring buffer.
|
||||
Enable seamless audio track change.
|
||||
Fix bug #1302: Unsupported pixel format crash.
|
||||
Fix the fix, when sillpicture is called in suspend mode.
|
||||
Fix crash, when sillpicture is called in suspend mode.
|
||||
Add workaround for zero width+height and ffmpeg >= 1.2.
|
||||
|
||||
User johns
|
||||
Date: Sun Mar 17 15:52:42 CET 2013
|
||||
|
||||
Release Version 0.6.0
|
||||
Adds H264 only hardware decoder for still-pictures.
|
||||
Enable optional VDR-SPU deocder support.
|
||||
|
||||
User anbr
|
||||
Date: Sun Mar 17 15:49:46 CET 2013
|
||||
|
||||
Update german translation.
|
||||
|
||||
User cyril
|
||||
Date: Wed Mar 6 17:05:10 CET 2013
|
||||
|
||||
Adds raise softhddevice video window support.
|
||||
|
||||
User johns
|
||||
Date: Wed Mar 6 10:30:27 CET 2013
|
||||
|
||||
Adds optional only complete mpeg packets support.
|
||||
Fixes text of EAC-3 pass-through setup.
|
||||
Try to start or connect to X11 server with -xx.
|
||||
Try to use HBR (High Bit-Rate) for EAC3.
|
||||
Improved pass-through (PCM+EAC3) support.
|
||||
Support VDR 1.7.36 new build system.
|
||||
Improves VDPAU display preemption handling.
|
||||
Add modifiers to X11 remote key names (from Sibbi).
|
||||
Add compatibility with >=ffmpeg 1.1.
|
||||
Adds PIP (Picture-in-Picture) support.
|
||||
Split mpeg packets in receiver thread.
|
||||
|
||||
User horchi
|
||||
Date: Tue Jan 1 17:58:54 CET 2013
|
||||
|
||||
Adds VDR SeduAtmo Plugin support.
|
||||
|
||||
User johns
|
||||
Date: Tue Jan 1 15:21:28 CET 2013
|
||||
|
||||
Support multiple streams with ScaleVideo.
|
||||
Makes 4:3 and 16:9 display format configurable.
|
||||
Don't use DVB display format.
|
||||
|
||||
User Zoolook
|
||||
Date: Tue Jan 1 12:49:19 CET 2013
|
||||
|
||||
Add support for new vdr ScaleVideo API.
|
||||
|
||||
User johns
|
||||
Date: Tue Jan 1 12:40:12 CET 2013
|
||||
|
||||
Add support for old PES HDTV recording.
|
||||
Disable trickspeed hack, to prevent ffmpeg crash.
|
||||
Makes X11 server arguments configurable.
|
||||
Add german translation.
|
||||
|
||||
User FireFly
|
||||
Date: Sun Nov 18 21:15:50 CET 2012
|
||||
|
||||
Add german translation.
|
||||
|
||||
User johns
|
||||
Date: Thu Nov 15 22:28:55 CET 2012
|
||||
|
||||
Release Version 0.5.2
|
||||
|
||||
User maverick-me
|
||||
Date: Mon Nov 5 23:13:42 CET 2012
|
||||
|
||||
Fix 3d OSD position.
|
||||
|
||||
User maverick-me
|
||||
Date: Tue Oct 30 16:50:25 CET 2012
|
||||
|
||||
Add support to change the OSD for 3d SBS/TB streams.
|
||||
|
||||
User johns
|
||||
Date: Tue Oct 30 12:11:25 CEST 2012
|
||||
|
||||
Use software decoder for still-pictures.
|
||||
Add Feature #1103: change audio devices without vdr restart.
|
||||
Fix bug #1089: Vdpau decoder used wrong number of mpeg reference frames.
|
||||
Fix bug: with some streams endless loop in pes audio parser.
|
||||
Report correct video size in cSoftHdDevice::GetVideoSize.
|
||||
Add picture adjustment support for vdpau.
|
||||
Revert "mpeg_vdpau" back to "mpegvideo_vdpau".
|
||||
Fix bug: Can't use software decoder with VDPAU.
|
||||
Resume plugin, if suspend control stops.
|
||||
Removes old audio code (!USE_AUDIORING).
|
||||
Use -DOSD_DEBUG to debug OSD.
|
||||
|
||||
User arttupii
|
||||
Date: Tue Aug 7 16:46:23 2012 +0200
|
||||
|
||||
Fix bug #909: Subtitles destroy menu.
|
||||
Fix bug #1003: Subtitles overlapping.
|
||||
|
||||
User johns
|
||||
Date: Fri Jul 27 19:15:48 CEST 2012
|
||||
|
||||
Free used X11 resources colormap, pixmap, cursor.
|
||||
Fix bug: spelling USE_VAPI wrong, missing functions.
|
||||
|
||||
User johns
|
||||
Date: Tue Jul 3 16:35:46 CEST 2012
|
||||
|
||||
Release Version 0.5.1
|
||||
Add commandline support to disable hardware decoder.
|
||||
Display frame statistics in plugin menu.
|
||||
Fix bug: 100% CPU use during playback.
|
||||
Fix bug: audio use 100% CPU during pause.
|
||||
Guard audio skip against old PTS values.
|
||||
Improved audio skip, after channel switch.
|
||||
Setup add preview of collapsed tree.
|
||||
Fix bug: dvd plugin times out.
|
||||
Makes OSD size configurable.
|
||||
Support display with non-square pixels.
|
||||
Initial ADTS (AAC+) support.
|
||||
Fix bug #959: log flooded with service messages.
|
||||
|
||||
User durchflieger
|
||||
Date: Mon Apr 30 14:46:51 CEST 2012
|
||||
|
||||
Adds VDR DFAtmo Plugin support.
|
||||
|
||||
User johns
|
||||
Date: Mon Apr 30 13:56:26 CEST 2012
|
||||
|
||||
Fix bug: don't normalize or compress pass-through samples.
|
||||
Make audio ring buffer size a multiple of 3,5,7,8.
|
||||
Add reset ring buffer support.
|
||||
Fix bug: alloca wrong size for audio buffer.
|
||||
Handle jump in stream like stream start.
|
||||
Always compile audio drift correction.
|
||||
Add audio drift correction configuration to the setup.
|
||||
|
||||
User mini73
|
||||
Date: Fri Apr 20 16:51:14 CEST 2012
|
||||
|
||||
Add support for svdr command "stat".
|
||||
|
||||
User johns
|
||||
Date: Fri Apr 20 16:05:40 CEST 2012
|
||||
|
||||
Made showing black picture configurable.
|
||||
Show black picture, if no video stream is available.
|
||||
Setup split into foldable sections.
|
||||
Adds show cursor on pointer move and hide after 200ms.
|
||||
Adds Hot-key support for auto-crop enable/disable/toggle.
|
||||
Adds detached start mode.
|
||||
Fix bug: VDPAU looses preemption callback.
|
||||
Fix bug: X11 server keeps sending USR1 signals, which confuses suspend.
|
||||
Show message for hot-keys.
|
||||
Fix bug: playback errors with old PES recordings.
|
||||
Adds Hot-key support for 4:3 zoom modes.
|
||||
|
||||
User johns
|
||||
Date: Sat Apr 7 20:21:16 CEST 2012
|
||||
|
||||
Release Version 0.5.0
|
||||
Change audio/video delay with hot-key.
|
||||
Enable/disable/toggle fullscreen with hot-key (Feature #930).
|
||||
|
||||
User: CafeDelMar
|
||||
Date: Thu Apr 5 22:44:06 CEST 2012
|
||||
|
||||
Cutting pixels are now configured for each resolution.
|
||||
|
||||
User johns
|
||||
Date: Thu Apr 5 15:47:59 CEST 2012
|
||||
|
||||
Buffer less video and audio.
|
||||
Fix 100% cpu use, with mp3 plugin.
|
||||
Audio/Video sync rewrite, trick-speed support moved to video.
|
||||
Faster VdpauBlackSurface version.
|
||||
Fix bug: VideoSetPts wrong position for multi frame packets.
|
||||
|
||||
User: CafeDelMar
|
||||
Date: Mon Mar 26 20:45:54 CEST 2012
|
||||
|
||||
Add VideoSkipPixels support.
|
||||
|
||||
User johns
|
||||
Date: Fri Mar 23 18:43:20 CET 2012
|
||||
|
||||
Add optional argument (display) to ATTA svdrp commmand.
|
||||
Wakeup display to show OSD for remote learning mode.
|
||||
Support switching the primary device with svdrp.
|
||||
Disable and reenable screen saver and DPMS.
|
||||
Video source code cleanup.
|
||||
Fix fast backward with some h264 streams.
|
||||
Make soft start sync setup menu configurable.
|
||||
Fix bug: StillPicture NAL end of sequence is 10 and not 0x10.
|
||||
Fix bug: AudioEnqueue crash without sound card.
|
||||
|
||||
User johns
|
||||
Date: Sun Mar 4 22:35:36 CET 2012
|
||||
|
||||
Release Version 0.4.9
|
||||
Experimental ac3 audio drift correction support.
|
||||
Removes LPCM detection from TS parser.
|
||||
Rewrote video/audio start code.
|
||||
Add support for attach/detach plugin.
|
||||
OSS needs bigger audio buffers.
|
||||
Improved audio drift correction support.
|
||||
Experimental audio drift correction support.
|
||||
Add SVDRP HOTK command support.
|
||||
Increased audio buffer time for PES packets.
|
||||
Support configuration and set of video background.
|
||||
Survive lost X11 display.
|
||||
Fix bug: 100% cpu use with plugins like mp3.
|
||||
Wakeup display thread on channel switch, osd can now be shown without
|
||||
video.
|
||||
Makes 60Hz display mode configurable with setup.conf.
|
||||
Support downmix of AC-3 to stero.
|
||||
New audio PES packet parser.
|
||||
Fix bug: Grabbing a JPG image fails while suspended.
|
||||
Add support for hot keys.
|
||||
Add support to use characters input in edit mode.
|
||||
Adds trick speed support.
|
||||
|
||||
User johns
|
||||
Date: Thu Feb 16 09:59:14 CET 2012
|
||||
|
||||
Release Version 0.4.8
|
||||
Fix bug: wrong start of video packet.
|
||||
VDPAU: Enables inverse telecine configuration.
|
||||
Find AC3 (Dolby Digital) inside PES packet.
|
||||
Fix bug: audio increments invalid audio PTS.
|
||||
Fix bug: dvd plugin not working.
|
||||
Fix bug: used frame-> instead of video_ctx-> for old libav/ffmpeg.
|
||||
|
||||
User johns
|
||||
Date: Mon Feb 13 23:20:26 CET 2012
|
||||
|
||||
Release Version 0.4.7
|
||||
|
||||
User FireFly
|
||||
Date: Mon Feb 13 20:14:11 CET 2012
|
||||
|
||||
Fix bug: unscaled jpeg includes PNG header.
|
||||
|
||||
User johns
|
||||
Date: Mon Feb 13 14:58:26 CET 2012
|
||||
|
||||
VDPAU: Studio levels could be configured in the setup menu.
|
||||
Window size defaults to fullscreen, if no geometry is given.
|
||||
|
||||
User m.Rcu
|
||||
Date: Sun Feb 12 20:28:22 CET 2012
|
||||
|
||||
Jpeg screengrab use VDR RgbToJpeg function.
|
||||
|
||||
User johns
|
||||
Date: Sun Feb 12 20:14:43 CET 2012
|
||||
|
||||
Add play/pause audio support.
|
||||
Fix bug: audible glitch when switching AC-3 pass-through <-> none.
|
||||
Fix bug: mpeg stills not displayed.
|
||||
Detect audio stream type only after stream switch.
|
||||
Detect more h264 streams with leading zeros.
|
||||
VDPAU: support for studio levels added.
|
||||
Add support for skip chroma deinterlace to software deinterlacer.
|
||||
Type of software deinterlacer now configurable from setup menu.
|
||||
Mixer channel could be set through command line option.
|
||||
Fix bug: LFE moved to wrong position.
|
||||
Guard suspend/resume against multiple calls.
|
||||
Add support for AAC LATM audio streams.
|
||||
Fix bug: alsa and ffmpeg use different channel layout.
|
||||
Support more LPCM sample rates and number of channels.
|
||||
Quick&dirty support for mpeg LPCM streams.
|
||||
Workaround for text2skin undrawn OSD areas.
|
||||
Detect dvb LPCM stream and ignore it.
|
||||
|
||||
User johns
|
||||
Date: Thu Feb 2 23:29:35 CET 2012
|
||||
|
||||
Release Version 0.4.6
|
||||
Warn only on the first duplicated frame in sequence.
|
||||
Increase audio buffer, if bigger audio delay is used.
|
||||
Makes SkipLines configure in setup menu.
|
||||
Auto-crop only enabled with normal 4:3 display mode.
|
||||
Vaapi updates OSD when cropping changes.
|
||||
Add A-V info output and compile time option.
|
||||
Fix bug: VA-API intel software decoder broken by aspect commit.
|
||||
Add support for 4:3 output modes.
|
||||
Quicker auto-crop after channel switch.
|
||||
Add auto-crop support for Intel VA-API backend.
|
||||
Fix bug: Auto-Crop logo skip didn't use displayed width.
|
||||
Workaround for mpeg2 FFMpeg + VA-API + Intel GPU hung.
|
||||
Fix bug: Missing vaSyncSurface and vaDestroyImage.
|
||||
Fix bug: Only black picture with VA-API hw decoder.
|
||||
|
||||
User HelAu
|
||||
Date: Mon Jan 30 16:54:47 CET 2012
|
||||
|
||||
Add support to start the plugin in suspended mode.
|
||||
|
||||
User johns
|
||||
Date: Mon Jan 30 15:58:21 CET 2012
|
||||
|
||||
Finished rewrite of video code, to support output modules.
|
||||
Add aspect change support to software decoder path.
|
||||
Repair software decoder with vaapi vdpau backend.
|
||||
Add workaround for Intel VA-API MPEG GPU hung.
|
||||
|
||||
User johns
|
||||
Date: Sat Jan 28 13:32:12 CET 2012
|
||||
|
||||
Release Version 0.4.5
|
||||
Add configurable skip lines at video top and bottom.
|
||||
Add auto-crop tolerance configuration.
|
||||
Reduces audio latency, increases audio buffer time.
|
||||
Made video_test working again.
|
||||
Disabled VA-API Intel vaAssociateSubpicture workaround.
|
||||
Fix bug: Must release lock for VideoPollEvent.
|
||||
Allow faster video and audio sync.
|
||||
Fix bug: Software decoder use vaPutImage with intel backend.
|
||||
Fix bug: Artefacts are shown after mpeg2 channel switch.
|
||||
Fix bug: VideoReleaseSurface called after VideoExit.
|
||||
Support external players.
|
||||
Add VDPAU display preemption support.
|
||||
|
||||
User m.Rcu
|
||||
Date: Tue Jan 24 22:38:30 CET 2012
|
||||
|
||||
Add support for grab jpeg image.
|
||||
|
||||
User johns
|
||||
Date: Tue Jan 24 22:25:33 CET 2012
|
||||
|
||||
Fix bug: VaapiOsdExit doesn't deassociate osd surface.
|
||||
Fix bug: First OSD can show random pixels.
|
||||
Wait for X11 exit and kill it, if not.
|
||||
Fix still picture handling.
|
||||
Fix for dead-lock in VdpauExit.
|
||||
Workaround for dead-lock in VdpauExit.
|
||||
VDPAU: Add very primitive software scaler for grab image.
|
||||
VA-API: Add auto-crop support.
|
||||
Suspend can close/open X11 window, connection and audio device.
|
||||
|
||||
User Morone
|
||||
Date: Sun Jan 22 16:43:23 CET 2012
|
||||
|
||||
Use different alsa devices for AC3/pass-through and pcm.
|
||||
|
||||
User johns
|
||||
Date: Sun Jan 22 11:12:57 CET 2012
|
||||
|
||||
Add dummy player and control for suspend mode.
|
||||
Buffertime compile time configurable in ms.
|
||||
|
||||
Date: Sat Jan 21 15:49:16 CET 2012
|
||||
|
||||
Release Version 0.4.0
|
||||
VDPAU: Add grab image support.
|
||||
VDPAU: Add auto-crop support.
|
||||
VDPAU: Changed OSD alpha calculation.
|
||||
Fix bug: Used VideoSharpen for denoise settings.
|
||||
Instant update deinterlace/... configuration changes.
|
||||
Fix bug: AudioExit called without AudioInit crash.
|
||||
|
||||
Date: Thu Jan 19 15:58:40 CET 2012
|
||||
|
||||
Release Version 0.3.5
|
||||
OSD improvements:
|
||||
Use OSD size equal to video window.
|
||||
Update only dirty area(s) of OSD.
|
||||
Show/mix only used area of OSD.
|
||||
Fix bug: vpdau use previous resolution for deint, ...
|
||||
Fix software deinterlace with VA-API.
|
||||
Fix bug: transposed digits 567 should be 576.
|
||||
Audio module cleanup:
|
||||
Alsa + OSS can be included/build at the same time.
|
||||
Alsa or OSS can be runtime selected with -a.
|
||||
Add audio thread support to OSS module.
|
||||
Add polled audio support to alsa module.
|
||||
Removed some debug source code.
|
||||
|
||||
Date: Sun Jan 15 16:56:04 CET 2012
|
||||
|
||||
Release Version 0.3.1
|
||||
Fix bug: AudioFreeBytes didn't check if audio running/compiled.
|
||||
Fix bug: snd_pcm_state: Assertion `pcm' failed.
|
||||
Add support for fullscreen and fullscreen toogle.
|
||||
Instant update deinterlace configuration changes.
|
||||
Fix subtitle position.
|
||||
Add SVDRP support.
|
||||
Suspend when user is inactive.
|
||||
|
||||
User Christian Rupper
|
||||
Date: Tue Jan 10 22:33:14 CET 2012
|
||||
|
||||
Move objects before $LIBS to avoid link failures with --as-needed.
|
||||
Do not override CFLAGS for video test.
|
||||
Rearrange *FLAGS incl. some minor fixes.
|
||||
Don't override VDRDIR, LIBDIR and TMPDIR in makefile.
|
||||
Don't abuse LDFLAGS in makefile.
|
||||
Define CC in makefile.
|
||||
Include GL/gl.h for the GL_COLOR_BUFFER_BIT definition.
|
||||
VideoInit() needs an argument.
|
||||
|
||||
User johns
|
||||
Date: Tue Jan 10 22:32:50 CET 2012
|
||||
|
||||
Add main menu entry, which suspends the plugin.
|
||||
Add support for resize window.
|
||||
Close window sends "close" as remote key press.
|
||||
|
||||
Date: Mon Jan 9 22:09:38 CET 2012
|
||||
|
||||
Release Version 0.3.0
|
||||
Add support of resolution dependend video parameters (deint, scale, ...).
|
||||
Add support for recording play back.
|
||||
Add workaround for alsa crash in snd_pcm_prepare.
|
||||
Fix bug: audio crash on exit.
|
||||
Fix build with vdr without yaepg support.
|
||||
Support yaepghd video picture output position change.
|
||||
|
||||
Date: Sat Jan 7 13:20:07 CET 2012
|
||||
|
||||
Release Version 0.2.0
|
||||
Add support for ac3 audio pass through.
|
||||
Add workaround for alsa not playing hdmi sound.
|
||||
Fix bug: broken device plugin stop and exit.
|
||||
Show transparent cursor to hide cursor.
|
||||
VDPAU: Add color standard support.
|
||||
VDPAU: Add denoise and sharpness support.
|
||||
VDPAU: Add skip chroma deinterlace support.
|
||||
VDPAU: Show OSD only if something is to display, improves performance.
|
||||
VDPAU: Add deinterlace with only 4 surfaces.
|
||||
|
||||
Date: Thu Jan 4 17:00:00 CET 2012
|
||||
|
||||
Release Version 0.1.5
|
||||
Adds OSS mixer support.
|
||||
Fix bug: audio new stream is not thread safe.
|
||||
New audio driver OSS.
|
||||
Fix bug: needed down sampling of 3/5/6 to 2 channels not reported.
|
||||
Search audio sync inside PES packets, for insane dvb streams.
|
||||
Use only the needed number of surfaces.
|
||||
|
||||
Date: Thu Dec 29 19:44:43 CET 2011
|
||||
|
||||
Release Version 0.1.4
|
||||
Prepared vdpau noise reduction support.
|
||||
Vdpau also displays a black surface, when no video is available.
|
||||
Fix bug: CodecVideoDecode destroys avpkt.
|
||||
|
||||
Date: Thu Dec 29 00:55:57 CET 2011
|
||||
|
||||
Release Version 0.1.3
|
||||
Add missing VdpauDecoderDestroy.
|
||||
Cleanup video packet ringbuffer.
|
||||
Allow build without VDPAU.
|
||||
Fix bug: swapped end and start.
|
||||
Support other than "PCM" alsa mixer channels.
|
||||
|
||||
Date: Sat Dec 24 15:26:27 CET 2011
|
||||
|
||||
Release Version 0.1.2
|
||||
Fix wrong decoder->SurfaceField again.
|
||||
Remove interlaced_frame debug, it can't be used.
|
||||
Fix new video stream never resets, if buffers full.
|
||||
|
||||
Date: Fri Dec 23 21:31:27 CET 2011
|
||||
|
||||
Release Version 0.1.1
|
||||
Initial VDPAU decoder support.
|
||||
Initial VDPAU output support.
|
||||
Configurable audio delay.
|
||||
Make pts monotonic.
|
||||
Support old libav and ffmpeg libs.
|
||||
Support xcb_icccm_set_wm_protocols with xcb-util <0.3.8.
|
||||
New video/audio sync code.
|
||||
Support xcb-util <0.3.8.
|
||||
Use current configuration for setup menu.
|
||||
Initial support of replay.
|
||||
Workaround for libva-driver-intel 1080i problems.
|
||||
DisplayFrame displays now only a single frame.
|
||||
Add deinterlace/scaling modes to setup.
|
||||
|
||||
Date: Sat Dec 10 00:06:46 CET 2011
|
||||
|
||||
Release Version 0.0.9
|
||||
Pass audio/video PTS to codec.
|
||||
Fix libva-driver-intel OSD problems.
|
||||
Add audio resample support.
|
||||
Reduce program exit crashes.
|
||||
Add libva-driver-vdpau autodetection.
|
||||
Add workaround for bugs in libva-driver-vdpau.
|
||||
Threaded video display handler written.
|
||||
Add support for unscaled osd (f.e. supported by intel-vaapi)
|
||||
Add support for 16:9 and 4:3 video streams.
|
||||
Add buildin X11 server start.
|
||||
Remove ffmpeg deprecated functions.
|
||||
Disable display of window cursor.
|
||||
Can force self as primary device.
|
||||
Smaller audio buffer.
|
||||
Don't trust ffmpeg or stream interlace flag.
|
||||
Fix Makefile.
|
||||
Add setting analog volume.
|
||||
|
||||
Date: Thu Dec 1 20:48:35 CET 2011
|
||||
|
||||
Release Version 0.0.5
|
256
Makefile
Normal file
256
Makefile
Normal file
@ -0,0 +1,256 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: 2a41981a57e5e83036463c6a08c84b86ed9d2be3 $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
PLUGIN = softhdcuvid
|
||||
|
||||
### Configuration (edit this for your needs)
|
||||
|
||||
# support alsa audio output module
|
||||
ALSA ?= $(shell pkg-config --exists alsa && echo 1)
|
||||
# support OSS audio output module
|
||||
OSS ?= 1
|
||||
# support VDPAU video output module
|
||||
VDPAU ?= $(shell pkg-config --exists vdpau && echo 1)
|
||||
# support VA-API video output module (deprecated)
|
||||
VAAPI ?= $(shell pkg-config --exists libva && echo 1)
|
||||
# support glx output
|
||||
OPENGL ?= $(shell pkg-config --exists gl glu && echo 1)
|
||||
#OPENGL = 0
|
||||
# screensaver disable/enable
|
||||
SCREENSAVER ?= 1
|
||||
# use ffmpeg libswresample
|
||||
#SWRESAMPLE ?= $(shell pkg-config --exists libswresample && echo 1)
|
||||
SWRESAMPLE = 1
|
||||
# use libav libavresample
|
||||
ifneq ($(SWRESAMPLE),1)
|
||||
AVRESAMPLE ?= $(shell pkg-config --exists libavresample && echo 1)
|
||||
AVRESAMPLE = 0
|
||||
endif
|
||||
|
||||
CONFIG := #-DDEBUG #-DOSD_DEBUG # enable debug output+functions
|
||||
CONFIG += -DCUVID # enable CUVID decoder
|
||||
CONFIG += -DHAVE_GL # needed for mpv libs
|
||||
#CONFIG += -DSTILL_DEBUG=2 # still picture debug verbose level
|
||||
|
||||
CONFIG += -DAV_INFO -DAV_INFO_TIME=3000 # info/debug a/v sync
|
||||
CONFIG += -DUSE_PIP # PIP support
|
||||
#CONFIG += -DHAVE_PTHREAD_NAME # supports new pthread_setname_np
|
||||
#CONFIG += -DNO_TS_AUDIO # disable ts audio parser
|
||||
#CONFIG += -DUSE_TS_VIDEO # build new ts video parser
|
||||
CONFIG += -DUSE_MPEG_COMPLETE # support only complete mpeg packets
|
||||
CONFIG += -DH264_EOS_TRICKSPEED # insert seq end packets for trickspeed
|
||||
#CONDIF += -DDUMP_TRICKSPEED # dump trickspeed packets
|
||||
#CONFIG += -DUSE_BITMAP # VDPAU, use bitmap surface for OSD
|
||||
CONFIG += -DUSE_VDR_SPU # use VDR SPU decoder.
|
||||
#CONFIG += -DUSE_SOFTLIMIT # (tobe removed) limit the buffer fill
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*const VERSION *=' $(PLUGIN).cpp | awk '{ print $$7 }' | sed -e 's/[";]//g')
|
||||
GIT_REV = $(shell git describe --always 2>/dev/null)
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
|
||||
ifeq ($(CFLAGS),)
|
||||
$(warning CFLAGS not set)
|
||||
endif
|
||||
ifeq ($(CXXFLAGS),)
|
||||
$(warning CXXFLAGS not set)
|
||||
endif
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Parse softhddevice config
|
||||
|
||||
ifeq ($(ALSA),1)
|
||||
CONFIG += -DUSE_ALSA
|
||||
_CFLAGS += $(shell pkg-config --cflags alsa)
|
||||
LIBS += $(shell pkg-config --libs alsa)
|
||||
endif
|
||||
ifeq ($(OSS),1)
|
||||
CONFIG += -DUSE_OSS
|
||||
endif
|
||||
ifeq ($(VDPAU),1)
|
||||
CONFIG += -DUSE_VDPAU
|
||||
_CFLAGS += $(shell pkg-config --cflags vdpau)
|
||||
LIBS += $(shell pkg-config --libs vdpau)
|
||||
endif
|
||||
ifeq ($(VAAPI),1)
|
||||
CONFIG += -DUSE_VAAPI
|
||||
_CFLAGS += $(shell pkg-config --cflags libva-x11 libva)
|
||||
LIBS += $(shell pkg-config --libs libva-x11 libva)
|
||||
ifeq ($(OPENGL),1)
|
||||
_CFLAGS += $(shell pkg-config --cflags libva-glx)
|
||||
LIBS += $(shell pkg-config --libs libva-glx)
|
||||
endif
|
||||
endif
|
||||
ifeq ($(OPENGL),1)
|
||||
CONFIG += -DUSE_GLX
|
||||
_CFLAGS += $(shell pkg-config --cflags gl glu)
|
||||
LIBS += $(shell pkg-config --libs gl glu)
|
||||
endif
|
||||
ifeq ($(SCREENSAVER),1)
|
||||
CONFIG += -DUSE_SCREENSAVER
|
||||
_CFLAGS += $(shell pkg-config --cflags xcb-screensaver xcb-dpms)
|
||||
LIBS += $(shell pkg-config --libs xcb-screensaver xcb-dpms)
|
||||
endif
|
||||
ifeq ($(SWRESAMPLE),1)
|
||||
CONFIG += -DUSE_SWRESAMPLE
|
||||
#_CFLAGS += $(shell pkg-config --cflags libswresample)
|
||||
#LIBS += $(shell pkg-config --libs libswresample)
|
||||
endif
|
||||
#ifeq ($(AVRESAMPLE),1)
|
||||
#CONFIG += -DUSE_AVRESAMPLE
|
||||
#_CFLAGS += $(shell pkg-config --cflags libavresample)
|
||||
#LIBS += $(shell pkg-config --libs libavresample)
|
||||
#endif
|
||||
|
||||
#_CFLAGS += $(shell pkg-config --cflags libavcodec x11 x11-xcb xcb xcb-icccm)
|
||||
#LIBS += -lrt $(shell pkg-config --libs libavcodec x11 x11-xcb xcb xcb-icccm)
|
||||
_CFLAGS += $(shell pkg-config --cflags x11 x11-xcb xcb xcb-icccm)
|
||||
LIBS += -lrt $(shell pkg-config --libs x11 x11-xcb xcb xcb-icccm)
|
||||
|
||||
_CFLAGS += -I/usr/include/libavcodec -I/usr/local/cuda/include -std=c99
|
||||
LIBS += -lavcodec
|
||||
_CFLAGS += -I/usr/include/libavresample
|
||||
#LIBS += -lavresample
|
||||
_CFLAGS += -I/usr/include/libswresample
|
||||
_CFLAGS += -I./opengl -I./ -std=c99 -Wdeclaration-after-statement
|
||||
LIBS += -lavutil -lswresample -lswscale -lGLEW -lGLX -ldl -lcuda -L/usr/local/cuda-8.0/targets/x86_64-linux/lib -lcudart -lnvcuvid
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -D_GNU_SOURCE $(CONFIG) \
|
||||
$(if $(GIT_REV), -DGIT_REV='"$(GIT_REV)"')
|
||||
|
||||
### Make it standard
|
||||
|
||||
override CXXFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
|
||||
-g -Wextra -Winit-self -Werror=overloaded-virtual
|
||||
override CFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
|
||||
-g -W -Wextra -Winit-self -Wdeclaration-after-statement
|
||||
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o softhddev.o video.o audio.o codec.o ringbuffer.o
|
||||
|
||||
SRCS = $(wildcard $(OBJS:.o=.c)) $(PLUGIN).cpp
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(SRCS) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(SRCS)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP \
|
||||
-k_ -k_N --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) \
|
||||
--msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(OBJS): Makefile
|
||||
|
||||
|
||||
$(SOFILE): $(OBJS) shaders.h
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(LIBS) $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
||||
## Private Targets:
|
||||
|
||||
HDRS= $(wildcard *.h)
|
||||
|
||||
indent:
|
||||
for i in $(SRCS) $(HDRS); do \
|
||||
indent $$i; \
|
||||
unexpand -a $$i | sed -e s/constconst/const/ > $$i.up; \
|
||||
mv $$i.up $$i; \
|
||||
done
|
||||
|
||||
video_test: video.c Makefile
|
||||
$(CC) -DVIDEO_TEST -DVERSION='"$(VERSION)"' $(CFLAGS) $(LDFLAGS) $< \
|
||||
$(LIBS) -o $@
|
403
README.txt
Normal file
403
README.txt
Normal file
@ -0,0 +1,403 @@
|
||||
@file README.txt @brief A software HD output device for VDR
|
||||
|
||||
Copyright (c) 2011 - 2013 by Johns. All Rights Reserved.
|
||||
Copyright (c) 2018 by jojo61. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
|
||||
jojo61
|
||||
|
||||
License: AGPLv3
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
$Id: 5267da021a68b4a727b479417334bfbe67bbba14 $
|
||||
|
||||
A software and GPU emulated HD output device plugin for VDR.
|
||||
|
||||
o Video decoder CPU / VDPAU
|
||||
o Video output opengl
|
||||
o Audio FFMpeg / Alsa / Analog
|
||||
o Audio FFMpeg / Alsa / Digital
|
||||
o Audio FFMpeg / OSS / Analog
|
||||
o HDMI/SPDIF pass-through
|
||||
o Software volume, compression, normalize and channel resample
|
||||
o VDR ScaleVideo API
|
||||
o CUDA deinterlacer
|
||||
o Autocrop
|
||||
o Suspend / Dettach
|
||||
o PIP (Picture-in-Picture) (not working yet)
|
||||
|
||||
|
||||
To compile you must have the 'requires' installed.
|
||||
|
||||
|
||||
This is a fork of johns original softhddevice work and I reworked ist to support HEVC with CUDA and opengl output.
|
||||
Currently I have tested it with a GTX 1050 from NVIDIA. HD and UHD ist working, but SD ist instable.
|
||||
|
||||
Current Status NVIDA:
|
||||
The CUDA driver supports HEVC with 8 Bit and 10 Bit up to UHD resolution. Opengl is able to output also 10 Bit, but NVIDIA does not support to output 10 Bit via HDMI.
|
||||
Only via DisplayPort you can get 10 Bit output to a ompatible screen. Thias is a restriction from NVIDIA.
|
||||
|
||||
|
||||
You have to adapt the Makefile to your needs. I use FFMPEG 4.0
|
||||
The Makefile expects the CUDA SDK in /usr/local/cuda. Currently it is tested with CUDA 9.1
|
||||
|
||||
Unfortunatly FFMEG has a bug with deinterlacing cuda frames. So you have to patch the file in libavcodec/cuviddec.c
|
||||
|
||||
Somewhere near line 360 depending on your release:
|
||||
old:
|
||||
ctx->frame_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(CuvidParsedFrame));
|
||||
|
||||
new:
|
||||
ctx->frame_queue = av_fifo_alloc((ctx->nb_surfaces + 2 ) * sizeof(CuvidParsedFrame));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Good luck
|
||||
jojo61
|
||||
|
||||
Quickstart:
|
||||
-----------
|
||||
|
||||
Just type make and use.
|
||||
|
||||
Install:
|
||||
--------
|
||||
1a) git
|
||||
|
||||
git clone git://github.com/jojo61/vdr-plugin-softhdcuvid.git
|
||||
cd vdr-plugin-softhdcuvid
|
||||
make
|
||||
make install
|
||||
|
||||
You can edit Makefile to enable/disable Alsa / OSS
|
||||
support. The default is to autodetect as much as possible.
|
||||
|
||||
You have to start vdr with -P 'softhdcuvid -d :0.0 ..<more option>.. -v cuvid'
|
||||
|
||||
|
||||
Setup: environment
|
||||
------
|
||||
Following is supported:
|
||||
|
||||
DISPLAY=:0.0
|
||||
x11 display name
|
||||
|
||||
only if alsa is configured
|
||||
ALSA_DEVICE=default
|
||||
alsa PCM device name
|
||||
ALSA_PASSTHROUGH_DEVICE=
|
||||
alsa pass-though (AC-3,E-AC-3,DTS,...) device name
|
||||
ALSA_MIXER=default
|
||||
alsa control device name
|
||||
ALSA_MIXER_CHANNEL=PCM
|
||||
alsa control channel name
|
||||
|
||||
only if oss is configured
|
||||
OSS_AUDIODEV=/dev/dsp
|
||||
oss dsp device name
|
||||
OSS_PASSTHROUGHDEV=
|
||||
oss pass-though (AC-3,E-AC-3,DTS,...) device name
|
||||
OSS_MIXERDEV=/dev/mixer
|
||||
oss mixer device name
|
||||
OSS_MIXER_CHANNEL=pcm
|
||||
oss mixer channel name
|
||||
|
||||
Setup: /etc/vdr/setup.conf
|
||||
------
|
||||
Following is supported:
|
||||
|
||||
softhddevice.MakePrimary = 0
|
||||
0 = no change, 1 make softhddevice primary at start
|
||||
|
||||
softhddevice.HideMainMenuEntry = 0
|
||||
0 = show softhddevice main menu entry, 1 = hide entry
|
||||
|
||||
softhddevice.Osd.Width = 0
|
||||
0 = auto (=display, unscaled) n = fixed osd size scaled for display
|
||||
softhddevice.Osd.Height = 0
|
||||
0 = auto (=display, unscaled) n = fixed osd size scaled for display
|
||||
|
||||
<res> of the next parameters is 576i, 720p, 1080i_fake or 1080i.
|
||||
1080i_fake is 1280x1080 or 1440x1080
|
||||
1080i is "real" 1920x1080
|
||||
|
||||
softhddevice.<res>.Scaling = 0
|
||||
0 = normal, 1 = fast, 2 = HQ, 3 = anamorphic
|
||||
|
||||
softhddevice.<res>.Deinterlace = 0
|
||||
0 = bob, 1 = weave, 2 = temporal, 3 = temporal_spatial, 4 = software
|
||||
(only 0, 1, 4 supported with VA-API)
|
||||
|
||||
softhddevice.<res>.SkipChromaDeinterlace = 0
|
||||
0 = disabled, 1 = enabled (for slower cards, poor qualität)
|
||||
|
||||
softhddevice.<res>.InverseTelecine = 0
|
||||
0 = disabled, 1 = enabled
|
||||
|
||||
softhddevice.<res>.Denoise = 0
|
||||
0 .. 1000 noise reduction level (0 off, 1000 max)
|
||||
|
||||
softhddevice.<res>.Sharpness = 0
|
||||
-1000 .. 1000 noise reduction level (0 off, -1000 max blur,
|
||||
1000 max sharp)
|
||||
|
||||
softhddevice.<res>.CutTopBottom = 0
|
||||
Cut 'n' pixels at at top and bottom of the video picture.
|
||||
|
||||
softhddevice.<res>.CutLeftRight = 0
|
||||
Cut 'n' pixels at at left and right of the video picture.
|
||||
|
||||
softhddevice.AudioDelay = 0
|
||||
+n or -n ms
|
||||
delay audio or delay video
|
||||
|
||||
softhddevice.AudioPassthrough = 0
|
||||
0 = none, 1 = PCM, 2 = MPA, 4 = AC-3, 8 = EAC-3, -X disable
|
||||
|
||||
for PCM/AC-3/EAC-3 the pass-through device is used and the audio
|
||||
stream is passed undecoded to the output device.
|
||||
z.b. 12 = AC-3+EAC-3, 13 = PCM+AC-3+EAC-3
|
||||
note: MPA/DTS/TrueHD/... aren't supported yet
|
||||
negative values disable passthrough
|
||||
|
||||
softhddevice.AudioDownmix = 0
|
||||
0 = none, 1 = downmix
|
||||
Use ffmpeg/libav downmix of AC-3/EAC-3 audio to stereo.
|
||||
|
||||
softhddevice.AudioSoftvol = 0
|
||||
0 = off, use hardware volume control
|
||||
1 = on, use software volume control
|
||||
|
||||
softhddevice.AudioNormalize = 0
|
||||
0 = off, 1 = enable audio normalize
|
||||
|
||||
softhddevice.AudioMaxNormalize = 0
|
||||
maximal volume factor/1000 of the normalize filter
|
||||
|
||||
softhddevice.AudioCompression = 0
|
||||
0 = off, 1 = enable audio compression
|
||||
|
||||
softhddevice.AudioMaxCompression = 0
|
||||
maximal volume factor/1000 of the compression filter
|
||||
|
||||
softhddevice.AudioStereoDescent = 0
|
||||
reduce volume level (/1000) for stereo sources
|
||||
|
||||
softhddevice.AudioBufferTime = 0
|
||||
0 = default (336 ms)
|
||||
1 - 1000 = size of the buffer in ms
|
||||
|
||||
softhddevice.AutoCrop.Interval = 0
|
||||
0 disables auto-crop
|
||||
n each 'n' frames auto-crop is checked.
|
||||
|
||||
softhddevice.AutoCrop.Delay = 0
|
||||
if auto-crop is over 'n' intervals the same, the cropping is
|
||||
used.
|
||||
|
||||
softhddevice.AutoCrop.Tolerance = 0
|
||||
if detected crop area is too small, cut max 'n' pixels at top and
|
||||
bottom.
|
||||
|
||||
softhddevice.Background = 0
|
||||
32bit RGBA background color
|
||||
(Red * 16777216 + Green * 65536 + Blue * 256 + Alpha)
|
||||
or hex RRGGBBAA
|
||||
grey 127 * 16777216 + 127 * 65536 + 127 * 256 => 2139062016
|
||||
in the setup menu this is entered as (24bit RGB and 8bit Alpha)
|
||||
(Red * 65536 + Green * 256 + Blue)
|
||||
|
||||
softhddevice.StudioLevels = 0
|
||||
0 use PC levels (0-255) with vdpau.
|
||||
1 use studio levels (16-235) with vdpau.
|
||||
|
||||
softhddevice.Suspend.Close = 0
|
||||
1 suspend closes x11 window, connection and audio device.
|
||||
(use svdrpsend plug softhddevice RESU to resume, if you have no lirc)
|
||||
|
||||
softhddevice.Suspend.X11 = 0
|
||||
1 suspend stops X11 server (not working yet)
|
||||
|
||||
softhddevice.60HzMode = 0
|
||||
0 disable 60Hz display mode
|
||||
1 enable 60Hz display mode
|
||||
|
||||
softhddevice.SoftStartSync = 0
|
||||
0 disable soft start of audio/video sync
|
||||
1 enable soft start of audio/video sync
|
||||
|
||||
softhddevice.BlackPicture = 0
|
||||
0 disable black picture during channel switch
|
||||
1 enable black picture during channel switch
|
||||
|
||||
softhddevice.ClearOnSwitch = 0
|
||||
0 keep video und audio buffers during channel switch
|
||||
1 clear video and audio buffers on channel switch
|
||||
|
||||
softhddevice.Video4to3DisplayFormat = 1
|
||||
0 pan and scan
|
||||
1 letter box
|
||||
2 center cut-out
|
||||
|
||||
softhddevice.VideoOtherDisplayFormat = 1
|
||||
0 pan and scan
|
||||
1 pillar box
|
||||
2 center cut-out
|
||||
|
||||
softhddevice.pip.X = 79
|
||||
softhddevice.pip.Y = 78
|
||||
softhddevice.pip.Width = 18
|
||||
softhddevice.pip.Height = 18
|
||||
PIP pip window position and size in percent.
|
||||
|
||||
softhddevice.pip.VideoX = 0
|
||||
softhddevice.pip.VideoY = 0
|
||||
softhddevice.pip.VideoWidth = 0
|
||||
softhddevice.pip.VideoHeight = 0
|
||||
PIP video window position and size in percent.
|
||||
|
||||
softhddevice.pip.Alt.X = 0
|
||||
softhddevice.pip.Alt.Y = 50
|
||||
softhddevice.pip.Alt.Width = 0
|
||||
softhddevice.pip.Alt.Height = 50
|
||||
PIP alternative pip window position and size in percent.
|
||||
|
||||
softhddevice.pip.Alt.VideoX = 0
|
||||
softhddevice.pip.Alt.VideoY = 0
|
||||
softhddevice.pip.Alt.VideoWidth = 0
|
||||
softhddevice.pip.Alt.VideoHeight = 50
|
||||
PIP alternative video window position and size in percent.
|
||||
|
||||
|
||||
Setup: /etc/vdr/remote.conf
|
||||
------
|
||||
|
||||
Add "XKeySym." definitions to /etc/vdr/remote.conf to control
|
||||
the vdr and plugin with the connected input device.
|
||||
|
||||
fe.
|
||||
XKeySym.Up Up
|
||||
XKeySym.Down Down
|
||||
...
|
||||
|
||||
Additional to the x11 input sends the window close button "Close".
|
||||
|
||||
fe.
|
||||
XKeySym.Power Close
|
||||
|
||||
Commandline:
|
||||
------------
|
||||
|
||||
Use vdr -h to see the command line arguments supported by the plugin.
|
||||
|
||||
-a audio_device
|
||||
|
||||
Selects audio output module and device.
|
||||
"" to disable audio output
|
||||
/... to use oss audio module (if compiled with oss
|
||||
support)
|
||||
other to use alsa audio module (if compiled with alsa
|
||||
support)
|
||||
|
||||
SVDRP:
|
||||
------
|
||||
|
||||
Use 'svdrpsend.pl plug softhddevice HELP'
|
||||
or 'svdrpsend plug softhddevice HELP' to see the SVDRP commands help
|
||||
and which are supported by the plugin.
|
||||
|
||||
Keymacros:
|
||||
----------
|
||||
|
||||
See keymacros.conf how to setup the macros.
|
||||
|
||||
This are the supported key sequences:
|
||||
|
||||
@softhdcuvid Blue 1 0 disable pass-through
|
||||
@softhdcuvid Blue 1 1 enable pass-through
|
||||
@softhdcuvid Blue 1 2 toggle pass-through
|
||||
@softhdcuvid Blue 1 3 decrease audio delay by 10ms
|
||||
@softhdcuvid Blue 1 4 increase audio delay by 10ms
|
||||
@softhdcuvid Blue 1 5 toggle ac3 mixdown
|
||||
@softhdcuvid Blue 2 0 disable fullscreen
|
||||
@softhdcuvid Blue 2 1 enable fullscreen
|
||||
@softhdcuvid Blue 2 2 toggle fullscreen
|
||||
|
||||
Running:
|
||||
--------
|
||||
|
||||
Click into video window to toggle fullscreen/window mode, only if you
|
||||
have a window manager running.
|
||||
|
||||
|
||||
Known Bugs:
|
||||
-----------
|
||||
SD Stream not working very well
|
||||
RESUME starts wirh black screen (channelswitch needed)
|
||||
|
||||
Requires:
|
||||
---------
|
||||
media-video/vdr (version >=1.7.xx)
|
||||
Video Disk Recorder - turns a pc into a powerful set top box
|
||||
for DVB.
|
||||
http://www.tvdr.de/
|
||||
|
||||
media-video/ffmpeg (version >=0.7)
|
||||
Complete solution to record, convert and stream audio and
|
||||
video. Includes libavcodec and libswresample.
|
||||
http://ffmpeg.org
|
||||
media-libs/alsa-lib
|
||||
Advanced Linux Sound Architecture Library
|
||||
http://www.alsa-project.org
|
||||
or
|
||||
kernel support for oss/oss4 or alsa oss emulation
|
||||
|
||||
x11-libs/libva (deprecated)
|
||||
Video Acceleration (VA) API for Linux
|
||||
http://www.freedesktop.org/wiki/Software/vaapi
|
||||
x11-libs/libva-intel-driver
|
||||
HW video decode support for Intel integrated graphics
|
||||
http://www.freedesktop.org/wiki/Software/vaapi
|
||||
or
|
||||
x11-libs/vdpau-video
|
||||
VDPAU Backend for Video Acceleration (VA) API
|
||||
http://www.freedesktop.org/wiki/Software/vaapi
|
||||
or
|
||||
x11-libs/xvba-video
|
||||
XVBA Backend for Video Acceleration (VA) API
|
||||
http://www.freedesktop.org/wiki/Software/vaapi
|
||||
|
||||
x11-libs/libvdpau
|
||||
VDPAU wrapper and trace libraries
|
||||
http://www.freedesktop.org/wiki/Software/VDPAU
|
||||
|
||||
x11-libs/libxcb,
|
||||
X C-language Bindings library
|
||||
http://xcb.freedesktop.org
|
||||
x11-libs/xcb-util,
|
||||
x11-libs/xcb-util-wm,
|
||||
x11-libs/xcb-util-keysyms
|
||||
X C-language Bindings library
|
||||
http://xcb.freedesktop.org
|
||||
Only versions >= 0.3.8 are good supported
|
||||
|
||||
x11-libs/libX11
|
||||
X.Org X11 library
|
||||
http://xorg.freedesktop.org
|
||||
|
||||
GNU Make 3.xx
|
||||
http://www.gnu.org/software/make/make.html
|
||||
|
||||
Optional:
|
67
audio.h
Normal file
67
audio.h
Normal file
@ -0,0 +1,67 @@
|
||||
///
|
||||
/// @file audio.h @brief Audio module headerfile
|
||||
///
|
||||
/// Copyright (c) 2009 - 2014 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: da055758af70cfdb9ab1989d5fcfb218c5d6a366 $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup Audio
|
||||
/// @{
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Prototypes
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
extern void AudioEnqueue(const void *, int); ///< buffer audio samples
|
||||
extern void AudioFlushBuffers(void); ///< flush audio buffers
|
||||
extern void AudioPoller(void); ///< poll audio events/handling
|
||||
extern int AudioFreeBytes(void); ///< free bytes in audio output
|
||||
extern int AudioUsedBytes(void); ///< used bytes in audio output
|
||||
extern int64_t AudioGetDelay(void); ///< get current audio delay
|
||||
extern void AudioSetClock(int64_t); ///< set audio clock base
|
||||
extern int64_t AudioGetClock(); ///< get current audio clock
|
||||
extern void AudioSetVolume(int); ///< set volume
|
||||
extern int AudioSetup(int *, int *, int); ///< setup audio output
|
||||
|
||||
extern void AudioPlay(void); ///< play audio
|
||||
extern void AudioPause(void); ///< pause audio
|
||||
|
||||
extern void AudioSetBufferTime(int); ///< set audio buffer time
|
||||
extern void AudioSetSoftvol(int); ///< enable/disable softvol
|
||||
extern void AudioSetNormalize(int, int); ///< set normalize parameters
|
||||
extern void AudioSetCompression(int, int); ///< set compression parameters
|
||||
extern void AudioSetStereoDescent(int); ///< set stereo loudness descent
|
||||
|
||||
extern void AudioSetDevice(const char *); ///< set PCM audio device
|
||||
|
||||
/// set pass-through device
|
||||
extern void AudioSetPassthroughDevice(const char *);
|
||||
extern void AudioSetChannel(const char *); ///< set mixer channel
|
||||
extern void AudioSetAutoAES(int); ///< set automatic AES flag handling
|
||||
extern void AudioInit(void); ///< setup audio module
|
||||
extern void AudioExit(void); ///< cleanup and exit audio module
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
extern char AudioAlsaDriverBroken; ///< disable broken driver message
|
||||
extern char AudioAlsaNoCloseOpen; ///< disable alsa close/open fix
|
||||
extern char AudioAlsaCloseOpenDelay; ///< enable alsa close/open delay fix
|
||||
|
||||
/// @}
|
163
codec.h
Normal file
163
codec.h
Normal file
@ -0,0 +1,163 @@
|
||||
///
|
||||
/// @file codec.h @brief Codec module headerfile
|
||||
///
|
||||
/// Copyright (c) 2009 - 2013, 2015 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: bdb4d18dbe371e497d039e45faa7c134b019860a $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup Codec
|
||||
/// @{
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Defines
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#define CodecPCM 0x01 ///< PCM bit mask
|
||||
#define CodecMPA 0x02 ///< MPA bit mask (planned)
|
||||
#define CodecAC3 0x04 ///< AC-3 bit mask
|
||||
#define CodecEAC3 0x08 ///< E-AC-3 bit mask
|
||||
#define CodecDTS 0x10 ///< DTS bit mask (planned)
|
||||
|
||||
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000
|
||||
|
||||
enum HWAccelID {
|
||||
HWACCEL_NONE = 0,
|
||||
HWACCEL_AUTO,
|
||||
HWACCEL_VDPAU,
|
||||
HWACCEL_DXVA2,
|
||||
HWACCEL_VDA,
|
||||
HWACCEL_VIDEOTOOLBOX,
|
||||
HWACCEL_QSV,
|
||||
HWACCEL_VAAPI,
|
||||
HWACCEL_CUVID,
|
||||
};
|
||||
|
||||
AVBufferRef *hw_device_ctx;
|
||||
///
|
||||
/// Video decoder structure.
|
||||
///
|
||||
struct _video_decoder_
|
||||
{
|
||||
VideoHwDecoder *HwDecoder; ///< video hardware decoder
|
||||
|
||||
int GetFormatDone; ///< flag get format called!
|
||||
AVCodec *VideoCodec; ///< video codec
|
||||
AVCodecContext *VideoCtx; ///< video codec context
|
||||
//#ifdef FFMPEG_WORKAROUND_ARTIFACTS
|
||||
int FirstKeyFrame; ///< flag first frame
|
||||
//#endif
|
||||
AVFrame *Frame; ///< decoded video frame
|
||||
|
||||
/* hwaccel options */
|
||||
enum HWAccelID hwaccel_id;
|
||||
char *hwaccel_device;
|
||||
enum AVPixelFormat hwaccel_output_format;
|
||||
|
||||
/* hwaccel context */
|
||||
enum HWAccelID active_hwaccel_id;
|
||||
void *hwaccel_ctx;
|
||||
void (*hwaccel_uninit)(AVCodecContext *s);
|
||||
int (*hwaccel_get_buffer)(AVCodecContext *s, AVFrame *frame, int flags);
|
||||
int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
|
||||
enum AVPixelFormat hwaccel_pix_fmt;
|
||||
enum AVPixelFormat hwaccel_retrieved_pix_fmt;
|
||||
AVBufferRef *hw_frames_ctx;
|
||||
|
||||
void *hwdec_priv;
|
||||
// For HDR side-data caching
|
||||
double cached_hdr_peak;
|
||||
// From VO
|
||||
struct mp_hwdec_devices *hwdec_devs;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// Video decoder typedef.
|
||||
typedef struct _video_decoder_ VideoDecoder;
|
||||
|
||||
/// Audio decoder typedef.
|
||||
typedef struct _audio_decoder_ AudioDecoder;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// Flag prefer fast xhannel switch
|
||||
extern char CodecUsePossibleDefectFrames;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Prototypes
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// Allocate a new video decoder context.
|
||||
extern VideoDecoder *CodecVideoNewDecoder(VideoHwDecoder *);
|
||||
|
||||
/// Deallocate a video decoder context.
|
||||
extern void CodecVideoDelDecoder(VideoDecoder *);
|
||||
|
||||
/// Open video codec.
|
||||
extern void CodecVideoOpen(VideoDecoder *, int);
|
||||
|
||||
/// Close video codec.
|
||||
extern void CodecVideoClose(VideoDecoder *);
|
||||
|
||||
/// Decode a video packet.
|
||||
extern void CodecVideoDecode(VideoDecoder *, const AVPacket *);
|
||||
|
||||
/// Flush video buffers.
|
||||
extern void CodecVideoFlushBuffers(VideoDecoder *);
|
||||
|
||||
/// Allocate a new audio decoder context.
|
||||
extern AudioDecoder *CodecAudioNewDecoder(void);
|
||||
|
||||
/// Deallocate an audio decoder context.
|
||||
extern void CodecAudioDelDecoder(AudioDecoder *);
|
||||
|
||||
/// Open audio codec.
|
||||
extern void CodecAudioOpen(AudioDecoder *, int);
|
||||
|
||||
/// Close audio codec.
|
||||
extern void CodecAudioClose(AudioDecoder *);
|
||||
|
||||
/// Set audio drift correction.
|
||||
extern void CodecSetAudioDrift(int);
|
||||
|
||||
/// Set audio pass-through.
|
||||
extern void CodecSetAudioPassthrough(int);
|
||||
|
||||
/// Set audio downmix.
|
||||
extern void CodecSetAudioDownmix(int);
|
||||
|
||||
/// Decode an audio packet.
|
||||
extern void CodecAudioDecode(AudioDecoder *, const AVPacket *);
|
||||
|
||||
/// Flush audio buffers.
|
||||
extern void CodecAudioFlushBuffers(AudioDecoder *);
|
||||
|
||||
/// Setup and initialize codec module.
|
||||
extern void CodecInit(void);
|
||||
|
||||
/// Cleanup and exit codec module.
|
||||
extern void CodecExit(void);
|
||||
|
||||
/// @}
|
244
common.h
Normal file
244
common.h
Normal file
@ -0,0 +1,244 @@
|
||||
/*
|
||||
* This file is part of mpv.
|
||||
*
|
||||
* mpv 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.
|
||||
*
|
||||
* mpv 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 mpv. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MPLAYER_GL_COMMON_H
|
||||
#define MPLAYER_GL_COMMON_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#if 0
|
||||
#include "config.h"
|
||||
#include "common/msg.h"
|
||||
#include "misc/bstr.h"
|
||||
|
||||
#include "video/out/vo.h"
|
||||
#include "video/csputils.h"
|
||||
#include "video/mp_image.h"
|
||||
#endif
|
||||
|
||||
#if HAVE_GL_COCOA
|
||||
#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 1
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/gl3.h>
|
||||
#include <OpenGL/glext.h>
|
||||
#elif HAVE_IOS_GL
|
||||
#include <OpenGLES/ES2/glext.h>
|
||||
#include <OpenGLES/ES3/glext.h>
|
||||
#elif HAVE_ANDROID_GL
|
||||
#include <GLES3/gl3.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#endif
|
||||
|
||||
#define MP_GET_GL_WORKAROUNDS
|
||||
#include "header_fixes.h"
|
||||
|
||||
struct GL;
|
||||
typedef struct GL GL;
|
||||
|
||||
enum {
|
||||
MPGL_CAP_ROW_LENGTH = (1 << 4), // GL_[UN]PACK_ROW_LENGTH
|
||||
MPGL_CAP_FB = (1 << 5),
|
||||
MPGL_CAP_VAO = (1 << 6),
|
||||
MPGL_CAP_TEX_RG = (1 << 10), // GL_ARB_texture_rg / GL 3.x
|
||||
MPGL_CAP_VDPAU = (1 << 11), // GL_NV_vdpau_interop
|
||||
MPGL_CAP_APPLE_RGB_422 = (1 << 12), // GL_APPLE_rgb_422
|
||||
MPGL_CAP_1D_TEX = (1 << 14),
|
||||
MPGL_CAP_3D_TEX = (1 << 15),
|
||||
MPGL_CAP_DEBUG = (1 << 16),
|
||||
MPGL_CAP_DXINTEROP = (1 << 17), // WGL_NV_DX_interop
|
||||
MPGL_CAP_EXT16 = (1 << 18), // GL_EXT_texture_norm16
|
||||
MPGL_CAP_ARB_FLOAT = (1 << 19), // GL_ARB_texture_float
|
||||
MPGL_CAP_EXT_CR_HFLOAT = (1 << 20), // GL_EXT_color_buffer_half_float
|
||||
|
||||
MPGL_CAP_SW = (1 << 30), // indirect or sw renderer
|
||||
};
|
||||
|
||||
// E.g. 310 means 3.1
|
||||
// Code doesn't have to use the macros; they are for convenience only.
|
||||
#define MPGL_VER(major, minor) (((major) * 100) + (minor) * 10)
|
||||
#define MPGL_VER_GET_MAJOR(ver) ((unsigned)(ver) / 100)
|
||||
#define MPGL_VER_GET_MINOR(ver) ((unsigned)(ver) % 100 / 10)
|
||||
|
||||
#define MPGL_VER_P(ver) MPGL_VER_GET_MAJOR(ver), MPGL_VER_GET_MINOR(ver)
|
||||
|
||||
void mpgl_load_functions(GL *gl, void *(*getProcAddress)(const GLubyte *),
|
||||
const char *ext2, struct mp_log *log);
|
||||
void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
|
||||
void *fn_ctx, const char *ext2, struct mp_log *log);
|
||||
|
||||
typedef void (GLAPIENTRY *MP_GLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum,
|
||||
GLsizei, const GLchar *,const void *);
|
||||
|
||||
//function pointers loaded from the OpenGL library
|
||||
struct GL {
|
||||
int version; // MPGL_VER() mangled (e.g. 210 for 2.1)
|
||||
int es; // es version (e.g. 300), 0 for desktop GL
|
||||
int glsl_version; // e.g. 130 for GLSL 1.30
|
||||
char *extensions; // Equivalent to GL_EXTENSIONS
|
||||
int mpgl_caps; // Bitfield of MPGL_CAP_* constants
|
||||
bool debug_context; // use of e.g. GLX_CONTEXT_DEBUG_BIT_ARB
|
||||
GLuint main_fb; // framebuffer to render to (normally 0)
|
||||
|
||||
void (GLAPIENTRY *Viewport)(GLint, GLint, GLsizei, GLsizei);
|
||||
void (GLAPIENTRY *Clear)(GLbitfield);
|
||||
void (GLAPIENTRY *GenTextures)(GLsizei, GLuint *);
|
||||
void (GLAPIENTRY *DeleteTextures)(GLsizei, const GLuint *);
|
||||
void (GLAPIENTRY *ClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
|
||||
void (GLAPIENTRY *Enable)(GLenum);
|
||||
void (GLAPIENTRY *Disable)(GLenum);
|
||||
const GLubyte *(GLAPIENTRY * GetString)(GLenum);
|
||||
void (GLAPIENTRY *BlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum);
|
||||
void (GLAPIENTRY *Flush)(void);
|
||||
void (GLAPIENTRY *Finish)(void);
|
||||
void (GLAPIENTRY *PixelStorei)(GLenum, GLint);
|
||||
void (GLAPIENTRY *TexImage1D)(GLenum, GLint, GLint, GLsizei, GLint,
|
||||
GLenum, GLenum, const GLvoid *);
|
||||
void (GLAPIENTRY *TexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei,
|
||||
GLint, GLenum, GLenum, const GLvoid *);
|
||||
void (GLAPIENTRY *TexSubImage2D)(GLenum, GLint, GLint, GLint,
|
||||
GLsizei, GLsizei, GLenum, GLenum,
|
||||
const GLvoid *);
|
||||
void (GLAPIENTRY *TexParameteri)(GLenum, GLenum, GLint);
|
||||
void (GLAPIENTRY *GetIntegerv)(GLenum, GLint *);
|
||||
void (GLAPIENTRY *ReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum,
|
||||
GLenum, GLvoid *);
|
||||
void (GLAPIENTRY *ReadBuffer)(GLenum);
|
||||
void (GLAPIENTRY *DrawArrays)(GLenum, GLint, GLsizei);
|
||||
GLenum (GLAPIENTRY *GetError)(void);
|
||||
void (GLAPIENTRY *GetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *);
|
||||
void (GLAPIENTRY *Scissor)(GLint, GLint, GLsizei, GLsizei);
|
||||
|
||||
void (GLAPIENTRY *GenBuffers)(GLsizei, GLuint *);
|
||||
void (GLAPIENTRY *DeleteBuffers)(GLsizei, const GLuint *);
|
||||
void (GLAPIENTRY *BindBuffer)(GLenum, GLuint);
|
||||
void (GLAPIENTRY *BindBufferBase)(GLenum, GLuint, GLuint);
|
||||
GLvoid * (GLAPIENTRY *MapBufferRange)(GLenum, GLintptr, GLsizeiptr,
|
||||
GLbitfield);
|
||||
GLboolean (GLAPIENTRY *UnmapBuffer)(GLenum);
|
||||
void (GLAPIENTRY *BufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
|
||||
void (GLAPIENTRY *ActiveTexture)(GLenum);
|
||||
void (GLAPIENTRY *BindTexture)(GLenum, GLuint);
|
||||
int (GLAPIENTRY *SwapInterval)(int);
|
||||
void (GLAPIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei,
|
||||
GLsizei, GLint, GLenum, GLenum,
|
||||
const GLvoid *);
|
||||
|
||||
void (GLAPIENTRY *GenVertexArrays)(GLsizei, GLuint *);
|
||||
void (GLAPIENTRY *BindVertexArray)(GLuint);
|
||||
GLint (GLAPIENTRY *GetAttribLocation)(GLuint, const GLchar *);
|
||||
void (GLAPIENTRY *EnableVertexAttribArray)(GLuint);
|
||||
void (GLAPIENTRY *DisableVertexAttribArray)(GLuint);
|
||||
void (GLAPIENTRY *VertexAttribPointer)(GLuint, GLint, GLenum, GLboolean,
|
||||
GLsizei, const GLvoid *);
|
||||
void (GLAPIENTRY *DeleteVertexArrays)(GLsizei, const GLuint *);
|
||||
void (GLAPIENTRY *UseProgram)(GLuint);
|
||||
GLint (GLAPIENTRY *GetUniformLocation)(GLuint, const GLchar *);
|
||||
void (GLAPIENTRY *CompileShader)(GLuint);
|
||||
GLuint (GLAPIENTRY *CreateProgram)(void);
|
||||
GLuint (GLAPIENTRY *CreateShader)(GLenum);
|
||||
void (GLAPIENTRY *ShaderSource)(GLuint, GLsizei, const GLchar **,
|
||||
const GLint *);
|
||||
void (GLAPIENTRY *LinkProgram)(GLuint);
|
||||
void (GLAPIENTRY *AttachShader)(GLuint, GLuint);
|
||||
void (GLAPIENTRY *DeleteShader)(GLuint);
|
||||
void (GLAPIENTRY *DeleteProgram)(GLuint);
|
||||
void (GLAPIENTRY *GetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *);
|
||||
void (GLAPIENTRY *GetShaderiv)(GLuint, GLenum, GLint *);
|
||||
void (GLAPIENTRY *GetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *);
|
||||
void (GLAPIENTRY *GetProgramiv)(GLenum, GLenum, GLint *);
|
||||
const GLubyte* (GLAPIENTRY *GetStringi)(GLenum, GLuint);
|
||||
void (GLAPIENTRY *BindAttribLocation)(GLuint, GLuint, const GLchar *);
|
||||
void (GLAPIENTRY *BindFramebuffer)(GLenum, GLuint);
|
||||
void (GLAPIENTRY *GenFramebuffers)(GLsizei, GLuint *);
|
||||
void (GLAPIENTRY *DeleteFramebuffers)(GLsizei, const GLuint *);
|
||||
GLenum (GLAPIENTRY *CheckFramebufferStatus)(GLenum);
|
||||
void (GLAPIENTRY *FramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint,
|
||||
GLint);
|
||||
void (GLAPIENTRY *BlitFramebuffer)(GLint, GLint, GLint, GLint, GLint, GLint,
|
||||
GLint, GLint, GLbitfield, GLenum);
|
||||
void (GLAPIENTRY *GetFramebufferAttachmentParameteriv)(GLenum, GLenum,
|
||||
GLenum, GLint *);
|
||||
|
||||
void (GLAPIENTRY *Uniform1f)(GLint, GLfloat);
|
||||
void (GLAPIENTRY *Uniform2f)(GLint, GLfloat, GLfloat);
|
||||
void (GLAPIENTRY *Uniform3f)(GLint, GLfloat, GLfloat, GLfloat);
|
||||
void (GLAPIENTRY *Uniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
|
||||
void (GLAPIENTRY *Uniform1i)(GLint, GLint);
|
||||
void (GLAPIENTRY *UniformMatrix2fv)(GLint, GLsizei, GLboolean,
|
||||
const GLfloat *);
|
||||
void (GLAPIENTRY *UniformMatrix3fv)(GLint, GLsizei, GLboolean,
|
||||
const GLfloat *);
|
||||
|
||||
void (GLAPIENTRY *InvalidateFramebuffer)(GLenum, GLsizei, const GLenum *);
|
||||
|
||||
GLsync (GLAPIENTRY *FenceSync)(GLenum, GLbitfield);
|
||||
GLenum (GLAPIENTRY *ClientWaitSync)(GLsync, GLbitfield, GLuint64);
|
||||
void (GLAPIENTRY *DeleteSync)(GLsync sync);
|
||||
|
||||
void (GLAPIENTRY *GenQueries)(GLsizei, GLuint *);
|
||||
void (GLAPIENTRY *DeleteQueries)(GLsizei, const GLuint *);
|
||||
void (GLAPIENTRY *BeginQuery)(GLenum, GLuint);
|
||||
void (GLAPIENTRY *EndQuery)(GLenum);
|
||||
void (GLAPIENTRY *QueryCounter)(GLuint, GLenum);
|
||||
GLboolean (GLAPIENTRY *IsQuery)(GLuint);
|
||||
void (GLAPIENTRY *GetQueryObjectiv)(GLuint, GLenum, GLint *);
|
||||
void (GLAPIENTRY *GetQueryObjecti64v)(GLuint, GLenum, GLint64 *);
|
||||
void (GLAPIENTRY *GetQueryObjectuiv)(GLuint, GLenum, GLuint *);
|
||||
void (GLAPIENTRY *GetQueryObjectui64v)(GLuint, GLenum, GLuint64 *);
|
||||
|
||||
void (GLAPIENTRY *VDPAUInitNV)(const GLvoid *, const GLvoid *);
|
||||
void (GLAPIENTRY *VDPAUFiniNV)(void);
|
||||
GLvdpauSurfaceNV (GLAPIENTRY *VDPAURegisterOutputSurfaceNV)
|
||||
(GLvoid *, GLenum, GLsizei, const GLuint *);
|
||||
GLvdpauSurfaceNV (GLAPIENTRY *VDPAURegisterVideoSurfaceNV)
|
||||
(GLvoid *, GLenum, GLsizei, const GLuint *);
|
||||
void (GLAPIENTRY *VDPAUUnregisterSurfaceNV)(GLvdpauSurfaceNV);
|
||||
void (GLAPIENTRY *VDPAUSurfaceAccessNV)(GLvdpauSurfaceNV, GLenum);
|
||||
void (GLAPIENTRY *VDPAUMapSurfacesNV)(GLsizei, const GLvdpauSurfaceNV *);
|
||||
void (GLAPIENTRY *VDPAUUnmapSurfacesNV)(GLsizei, const GLvdpauSurfaceNV *);
|
||||
|
||||
#if HAVE_GL_WIN32
|
||||
// The HANDLE type might not be present on non-Win32
|
||||
BOOL (GLAPIENTRY *DXSetResourceShareHandleNV)(void *dxObject,
|
||||
HANDLE shareHandle);
|
||||
HANDLE (GLAPIENTRY *DXOpenDeviceNV)(void *dxDevice);
|
||||
BOOL (GLAPIENTRY *DXCloseDeviceNV)(HANDLE hDevice);
|
||||
HANDLE (GLAPIENTRY *DXRegisterObjectNV)(HANDLE hDevice, void *dxObject,
|
||||
GLuint name, GLenum type, GLenum access);
|
||||
BOOL (GLAPIENTRY *DXUnregisterObjectNV)(HANDLE hDevice, HANDLE hObject);
|
||||
BOOL (GLAPIENTRY *DXLockObjectsNV)(HANDLE hDevice, GLint count,
|
||||
HANDLE *hObjects);
|
||||
BOOL (GLAPIENTRY *DXUnlockObjectsNV)(HANDLE hDevice, GLint count,
|
||||
HANDLE *hObjects);
|
||||
#endif
|
||||
|
||||
GLint (GLAPIENTRY *GetVideoSync)(GLuint *);
|
||||
GLint (GLAPIENTRY *WaitVideoSync)(GLint, GLint, unsigned int *);
|
||||
|
||||
void (GLAPIENTRY *GetTranslatedShaderSourceANGLE)(GLuint, GLsizei,
|
||||
GLsizei*, GLchar* source);
|
||||
|
||||
void (GLAPIENTRY *DebugMessageCallback)(MP_GLDEBUGPROC callback,
|
||||
const void *userParam);
|
||||
|
||||
void *(GLAPIENTRY *MPGetNativeDisplay)(const char *name);
|
||||
};
|
||||
|
||||
#endif /* MPLAYER_GL_COMMON_H */
|
97
iatomic.h
Normal file
97
iatomic.h
Normal file
@ -0,0 +1,97 @@
|
||||
///
|
||||
/// @file iatomic.h @brief Misc function header file
|
||||
///
|
||||
/// Copyright (c) 2014 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: 59e1684aaa6678ecdebb6ce0df6ce5b5f461dd6e $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup iatomic
|
||||
/// @{
|
||||
|
||||
#define GCC_VERSION (__GNUC__ * 10000 \
|
||||
+ __GNUC_MINOR__ * 100 \
|
||||
+ __GNUC_PATCHLEVEL__)
|
||||
|
||||
// gcc before 4.7 didn't support atomic builtins,
|
||||
// use alsa atomic functions.
|
||||
#if GCC_VERSION < 40700
|
||||
|
||||
#include <alsa/iatomic.h>
|
||||
|
||||
#else
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Defines
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Declares
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///
|
||||
/// atomic type, 24 bit useable,
|
||||
///
|
||||
typedef volatile int atomic_t;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Prototypes
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Inlines
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///
|
||||
/// Set atomic value.
|
||||
///
|
||||
#define atomic_set(ptr, val) \
|
||||
__atomic_store_n(ptr, val, __ATOMIC_SEQ_CST)
|
||||
|
||||
///
|
||||
/// Read atomic value.
|
||||
///
|
||||
#define atomic_read(ptr) \
|
||||
__atomic_load_n(ptr, __ATOMIC_SEQ_CST)
|
||||
|
||||
///
|
||||
/// Increment atomic value.
|
||||
///
|
||||
#define atomic_inc(ptr) \
|
||||
__atomic_add_fetch(ptr, 1, __ATOMIC_SEQ_CST)
|
||||
|
||||
///
|
||||
/// Decrement atomic value.
|
||||
///
|
||||
#define atomic_dec(ptr) \
|
||||
__atomic_sub_fetch(ptr, 1, __ATOMIC_SEQ_CST)
|
||||
|
||||
///
|
||||
/// Add to atomic value.
|
||||
///
|
||||
#define atomic_add(val, ptr) \
|
||||
__atomic_add_fetch(ptr, val, __ATOMIC_SEQ_CST)
|
||||
|
||||
///
|
||||
/// Subtract from atomic value.
|
||||
///
|
||||
#define atomic_sub(val, ptr) \
|
||||
__atomic_sub_fetch(ptr, val, __ATOMIC_SEQ_CST)
|
||||
|
||||
#endif
|
||||
|
||||
/// @}
|
174
misc.h
Normal file
174
misc.h
Normal file
@ -0,0 +1,174 @@
|
||||
///
|
||||
/// @file misc.h @brief Misc function header file
|
||||
///
|
||||
/// Copyright (c) 2009 - 2012 by Lutz Sammer. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
/// Copied from uwm.
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: f5ff4b300aa33eb721d658c0c9374c8499b67318 $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup misc
|
||||
/// @{
|
||||
|
||||
#include <syslog.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h> // clock_gettime
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Defines
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Declares
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Variables
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern int SysLogLevel; ///< how much information wanted
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Prototypes
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline void Syslog(const int, const char *format, ...)
|
||||
__attribute__ ((format(printf, 2, 3)));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Inlines
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DebugLevel 4 /// private debug level
|
||||
#else
|
||||
#define DebugLevel 0 /// private debug level
|
||||
#endif
|
||||
|
||||
/**
|
||||
** Syslog output function.
|
||||
**
|
||||
** - 0 fatal errors and errors
|
||||
** - 1 warnings
|
||||
** - 2 info
|
||||
** - 3 important debug and fixme's
|
||||
*/
|
||||
static inline void Syslog(const int level, const char *format, ...)
|
||||
{
|
||||
if (SysLogLevel > level || DebugLevel > level) {
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vsyslog(LOG_ERR, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** Show error.
|
||||
*/
|
||||
#define Error(fmt...) Syslog(0, fmt)
|
||||
|
||||
/**
|
||||
** Show fatal error.
|
||||
*/
|
||||
#define Fatal(fmt...) do { Error(fmt); abort(); } while (0)
|
||||
|
||||
/**
|
||||
** Show warning.
|
||||
*/
|
||||
#define Warning(fmt...) Syslog(1, fmt)
|
||||
|
||||
/**
|
||||
** Show info.
|
||||
*/
|
||||
#define Info(fmt...) Syslog(2, fmt)
|
||||
|
||||
/**
|
||||
** Show debug.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
#define Debug(level, fmt...) Syslog(level, fmt)
|
||||
#else
|
||||
#define Debug(level, fmt...) /* disabled */
|
||||
#endif
|
||||
|
||||
#ifndef AV_NOPTS_VALUE
|
||||
#define AV_NOPTS_VALUE INT64_C(0x8000000000000000)
|
||||
#endif
|
||||
|
||||
/**
|
||||
** Nice time-stamp string.
|
||||
**
|
||||
** @param ts dvb time stamp
|
||||
*/
|
||||
static inline const char *Timestamp2String(int64_t ts)
|
||||
{
|
||||
static char buf[4][16];
|
||||
static int idx;
|
||||
|
||||
if (ts == (int64_t) AV_NOPTS_VALUE) {
|
||||
return "--:--:--.---";
|
||||
}
|
||||
idx = (idx + 1) % 3;
|
||||
snprintf(buf[idx], sizeof(buf[idx]), "%2d:%02d:%02d.%03d",
|
||||
(int)(ts / (90 * 3600000)), (int)((ts / (90 * 60000)) % 60),
|
||||
(int)((ts / (90 * 1000)) % 60), (int)((ts / 90) % 1000));
|
||||
|
||||
return buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
** Get ticks in ms.
|
||||
**
|
||||
** @returns ticks in ms,
|
||||
*/
|
||||
static inline uint32_t GetMsTicks(void)
|
||||
{
|
||||
#ifdef CLOCK_MONOTONIC
|
||||
struct timespec tspec;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &tspec);
|
||||
return (tspec.tv_sec * 1000) + (tspec.tv_nsec / (1000 * 1000));
|
||||
#else
|
||||
struct timeval tval;
|
||||
|
||||
if (gettimeofday(&tval, NULL) < 0) {
|
||||
return 0;
|
||||
}
|
||||
return (tval.tv_sec * 1000) + (tval.tv_usec / 1000);
|
||||
#endif
|
||||
}
|
||||
static inline uint64_t GetusTicks(void)
|
||||
{
|
||||
|
||||
#ifdef CLOCK_MONOTONIC
|
||||
struct timespec tspec;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &tspec);
|
||||
return (tspec.tv_sec * 1000000) + (tspec.tv_nsec) ;
|
||||
#else
|
||||
struct timeval tval;
|
||||
|
||||
if (gettimeofday(&tval, NULL) < 0) {
|
||||
return 0;
|
||||
}
|
||||
return (tval.tv_sec * 1000) + (tval.tv_usec / 1000);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// @}
|
3
po/.gitignore
vendored
Normal file
3
po/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# gitignore(5) file
|
||||
*.mo
|
||||
*.pot
|
968
po/de_DE.po
Normal file
968
po/de_DE.po
Normal file
@ -0,0 +1,968 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR \n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-08-18 15:05+0200\n"
|
||||
"PO-Revision-Date: blabla\n"
|
||||
"Last-Translator: blabla\n"
|
||||
"Language-Team: blabla\n"
|
||||
"Language: german\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#, c-format
|
||||
msgid "audio: %dHz sample-rate unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: %d channels unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio: out of ring buffers\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: avail underrun error? '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_avail_update(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: broken driver %d state '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_start(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/alsa: bytes lost -> out of sync\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: writei underrun error? '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_writei failed: %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/alsa: not all frames written\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_drop(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_prepare(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: wait underrun error? '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_wait(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: using %sdevice '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: playback open '%s' error: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: can't set block mode: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_hw_params_any: no configurations available: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: supports pause: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: can't open mixer '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: set params error: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_sw_params_current failed: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_sw_params_get_boundary failed: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_sw_params_set_silence_size failed: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: snd_pcm_sw_params failed: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: start delay %ums\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_pause(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/alsa: snd_pcm_prepare(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/alsa: still paused\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "snd_pcm_pause(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "snd_pcm_drop(): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_GETOSPACE): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: write error: %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/oss: error not all bytes written\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_HALT_OUTPUT): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: error poll %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: using %sdevice '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: can't open dsp device '%s': %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(MIXER_WRITE): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: can't open mixer device '%s': %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SOUND_MIXER_READ_DEVMASK): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: channel '%s' not supported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: channel '%s' not found\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/oss: should not happen\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_GETODELAY): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_SETFMT): %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio/oss: device doesn't support 16 bit sample format.\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_CHANNELS): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: device doesn't support %d channels.\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_SPEED): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: device doesn't support %dHz sample rate.\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: ioctl(SNDCTL_DSP_POLICY): %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio/oss: delay %ums\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: can't set channels %d sample-rate %dHz\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio: can't cancel play thread\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: can't place %d samples in ring buffer\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "audio: flush out of ring buffers\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: '%s' output module used\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: '%s' output module isn't supported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio: %6dHz supports %d %d %d %d %d %d %d %d channels\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: buggy libav, use ffmpeg\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate vodeo decoder\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: missing close\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "codec: codec ID %#06x not found\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate video codec context\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't set options to video codec!\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't open video codec!\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate video decoder frame buffer\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate audio decoder\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate audio decoder frame buffer\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't allocate audio codec context\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: can't open audio codec\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: decoded data smaller than encoded\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: resample setup error\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: overwrite resample\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: AvResample setup error\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: latm\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: error audio data\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec: error more than one frame data\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: can't setup resample\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: can't open resample\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: latm\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: bad audio frame\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: error more than one frame data\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "codec/audio: no frame\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "A software and GPU emulated UHD device"
|
||||
msgstr ""
|
||||
|
||||
msgid "SoftUHD"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev]: dirty area too big\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
msgstr "anzeigen"
|
||||
|
||||
msgid "hide"
|
||||
msgstr "verstecken"
|
||||
|
||||
msgid "General"
|
||||
msgstr "Allgemeines"
|
||||
|
||||
msgid "Make primary device"
|
||||
msgstr "Erzeuge primäres Gerät"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "Verstecke Hauptmenüeintrag"
|
||||
|
||||
msgid "Osd size"
|
||||
msgstr "OSD Größe"
|
||||
|
||||
msgid "Osd width"
|
||||
msgstr "OSD Breite"
|
||||
|
||||
msgid "Osd height"
|
||||
msgstr "OSD Höhe"
|
||||
|
||||
msgid "Suspend"
|
||||
msgstr "Unterbrechen"
|
||||
|
||||
msgid "Detach from main menu entry"
|
||||
msgstr "Detach durch Hauptmenüeintrag"
|
||||
|
||||
msgid "Suspend closes video+audio"
|
||||
msgstr "Unterbrechen schließt Video+Audio"
|
||||
|
||||
msgid "Suspend stops x11"
|
||||
msgstr "Unterbrechen stoppt X11"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "Enable Screensaver(DPMS) at black screen"
|
||||
msgstr "Bildschirmschoner(DPMS) bei schwarzen Bild aktivieren"
|
||||
|
||||
msgid "Video background color (RGB)"
|
||||
msgstr "Video Hintergrundfrabe (RGB)"
|
||||
|
||||
msgid "Video background color (Alpha)"
|
||||
msgstr "Video Hintergrundfarbe (Alpha)"
|
||||
|
||||
msgid "Use studio levels (vdpau only)"
|
||||
msgstr "Benutze Studio Levels (nur vdpau)"
|
||||
|
||||
msgid "60hz display mode"
|
||||
msgstr "60Hz Anzeigemodus"
|
||||
|
||||
msgid "Soft start a/v sync"
|
||||
msgstr "Sanftanlauf A/V Sync"
|
||||
|
||||
msgid "Black during channel switch"
|
||||
msgstr "Schwarz während Kanalwechsel"
|
||||
|
||||
msgid "Clear decoder on channel switch"
|
||||
msgstr "Decoder bei Kanalwechsel leeren"
|
||||
|
||||
msgid "Brightness (-1000..1000) (vdpau)"
|
||||
msgstr "Helligkeit (-1000..1000) (vdpau)"
|
||||
|
||||
msgid "min"
|
||||
msgstr "min"
|
||||
|
||||
msgid "max"
|
||||
msgstr "max"
|
||||
|
||||
msgid "Contrast (0..10000) (vdpau)"
|
||||
msgstr "Kontrast (0..10000) (vdpau)"
|
||||
|
||||
msgid "Saturation (0..10000) (vdpau)"
|
||||
msgstr "Sättigung (0..10000) (vdpau)"
|
||||
|
||||
msgid "Hue (-3141..3141) (vdpau)"
|
||||
msgstr "Farbton (-3141..3141) (vdpau)"
|
||||
|
||||
msgid "Scaling"
|
||||
msgstr "Skalierung"
|
||||
|
||||
msgid "Deinterlace"
|
||||
msgstr "Deinterlace"
|
||||
|
||||
msgid "SkipChromaDeinterlace (vdpau)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Inverse Telecine (vdpau)"
|
||||
msgstr "Inverse Filmübertragung (vdpau)"
|
||||
|
||||
msgid "Denoise (0..1000) (vdpau)"
|
||||
msgstr ""
|
||||
|
||||
msgid "off"
|
||||
msgstr "aus"
|
||||
|
||||
msgid "Sharpen (-1000..1000) (vdpau)"
|
||||
msgstr "Schärfen (-1000..1000) (vdpau)"
|
||||
|
||||
msgid "blur max"
|
||||
msgstr "Weichzeichnen max."
|
||||
|
||||
msgid "sharpen max"
|
||||
msgstr "Schärfen max."
|
||||
|
||||
msgid "Cut top and bottom (pixel)"
|
||||
msgstr "Schneide oben und unten ab (Pixel)"
|
||||
|
||||
msgid "Cut left and right (pixel)"
|
||||
msgstr "Schneide links und rechts ab (Pixel)"
|
||||
|
||||
msgid "Auto-crop"
|
||||
msgstr ""
|
||||
|
||||
msgid "Autocrop interval (frames)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Autocrop delay (n * interval)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Autocrop tolerance (pixel)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Audio/Video delay (ms)"
|
||||
msgstr "Audio/Video Verzögerung (ms)"
|
||||
|
||||
msgid "Audio drift correction"
|
||||
msgstr "Audio Driftkorrektur"
|
||||
|
||||
msgid "Pass-through default"
|
||||
msgstr "Pass-Through-Standard"
|
||||
|
||||
msgid "Enable (E-)AC-3 (decoder) downmix"
|
||||
msgstr "Aktiviere (E-)AC-3 (decoder) downmix"
|
||||
|
||||
msgid "Volume control"
|
||||
msgstr "Lautstärkesteuerung"
|
||||
|
||||
msgid "Hardware"
|
||||
msgstr "Hardware"
|
||||
|
||||
msgid "Software"
|
||||
msgstr "Software"
|
||||
|
||||
msgid "Enable normalize volume"
|
||||
msgstr "Aktiviere Lautstärkenormalisierung"
|
||||
|
||||
msgid " Max normalize factor (/1000)"
|
||||
msgstr " Max. Normalisierungsfaktor (/1000)"
|
||||
|
||||
msgid "Enable volume compression"
|
||||
msgstr "Aktivieren Lautstärkekompression"
|
||||
|
||||
msgid " Max compression factor (/1000)"
|
||||
msgstr " Max. Kompressionsfaktor (/1000)"
|
||||
|
||||
msgid "Reduce stereo volume (/1000)"
|
||||
msgstr "Reduziere Steropegel (/1000)"
|
||||
|
||||
msgid "Audio buffer size (ms)"
|
||||
msgstr "Audio Puffergröße (ms)"
|
||||
|
||||
msgid "Enable automatic AES"
|
||||
msgstr "Aktiviere automatiche AES"
|
||||
|
||||
msgid "Picture-In-Picture"
|
||||
msgstr "Bild in Bild (PIP)"
|
||||
|
||||
msgid "Pip X (%)"
|
||||
msgstr "PIP X (%)"
|
||||
|
||||
msgid "Pip Y (%)"
|
||||
msgstr "PIP Y (%)"
|
||||
|
||||
msgid "Pip Width (%)"
|
||||
msgstr "PIP Breite (%)"
|
||||
|
||||
msgid "Pip Height (%)"
|
||||
msgstr "PIP Höhe (%)"
|
||||
|
||||
msgid "Video X (%)"
|
||||
msgstr "Video X (%)"
|
||||
|
||||
msgid "Video Y (%)"
|
||||
msgstr "Video Y (%)"
|
||||
|
||||
msgid "Video Width (%)"
|
||||
msgstr "Videobreite (%)"
|
||||
|
||||
msgid "Video Height (%)"
|
||||
msgstr "Videohöhe (%)"
|
||||
|
||||
msgid "Alternative Pip X (%)"
|
||||
msgstr "Alternative PIP X (%)"
|
||||
|
||||
msgid "Alternative Pip Y (%)"
|
||||
msgstr "Alternative Pip Y (%)"
|
||||
|
||||
msgid "Alternative Pip Width (%)"
|
||||
msgstr "Alternative PIP Breite (%)"
|
||||
|
||||
msgid "Alternative Pip Height (%)"
|
||||
msgstr "Alternative PIP Höhe (%)"
|
||||
|
||||
msgid "Alternative Video X (%)"
|
||||
msgstr "Alternative Video X (%)"
|
||||
|
||||
msgid "Alternative Video Y (%)"
|
||||
msgstr "Alternative Video Y (%)"
|
||||
|
||||
msgid "Alternative Video Width (%)"
|
||||
msgstr "Alternative Videobreite (%)"
|
||||
|
||||
msgid "Alternative Video Height (%)"
|
||||
msgstr "Alternative Videohöhe (%)"
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev]pip: invalid PES packet %d\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev]pip: pes buffer too small\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev]tsdemux: transport stream out of sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "Channel not available!"
|
||||
msgstr "Kanal nicht verfügbar!"
|
||||
|
||||
msgid "Detach SoftHdDevice"
|
||||
msgstr ""
|
||||
|
||||
msgid "Suspend SoftHdDevice"
|
||||
msgstr "Unterbreche SoftHdDevice"
|
||||
|
||||
msgid "PIP toggle on/off: off"
|
||||
msgstr "PIP deaktivieren"
|
||||
|
||||
msgid "PIP toggle on/off: on"
|
||||
msgstr "PIP aktivieren"
|
||||
|
||||
msgid "PIP zapmode (not working)"
|
||||
msgstr ""
|
||||
|
||||
msgid "PIP channel +"
|
||||
msgstr "PIP Kanal +"
|
||||
|
||||
msgid "PIP channel -"
|
||||
msgstr "PIP Kanal -"
|
||||
|
||||
msgid "PIP on/swap channels: swap"
|
||||
msgstr ""
|
||||
|
||||
msgid "PIP on/swap channels: on"
|
||||
msgstr ""
|
||||
|
||||
msgid "PIP swap position: normal"
|
||||
msgstr ""
|
||||
|
||||
msgid "PIP swap position: alternative"
|
||||
msgstr ""
|
||||
|
||||
msgid "PIP close"
|
||||
msgstr "PIP schließen"
|
||||
|
||||
#, c-format
|
||||
msgid " Frames missed(%d) duped(%d) dropped(%d) total(%d)"
|
||||
msgstr " Frames verloren(%d) verdoppelt(%d) übersprungen(%d) Gesamt(%d)"
|
||||
|
||||
msgid "pass-through disabled"
|
||||
msgstr ""
|
||||
|
||||
msgid "pass-through enabled"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "audio delay changed to %d"
|
||||
msgstr ""
|
||||
|
||||
msgid "surround downmix enabled"
|
||||
msgstr ""
|
||||
|
||||
msgid "surround downmix disabled"
|
||||
msgstr ""
|
||||
|
||||
msgid "auto-crop disabled and freezed"
|
||||
msgstr ""
|
||||
|
||||
msgid "auto-crop enabled"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev]: hot key %d is not supported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "pesdemux: out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "pesdemux: mpeg1 pes packet unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "softhddev: LPCM %d bits per sample aren't supported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "softhddev: LPCM %d sample-rate is unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "softhddev: LPCM %d channels are unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "tsdemux: transport stream out of sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] invalid PES audio packet\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] empty audio packet\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] invalid audio packet %d bytes\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] audio buffer too small\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] invalid LPCM audio packet %d bytes\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] LPCM %d bits per sample aren't supported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] LPCM %d sample-rate is unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] LPCM %d channels are unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: packet buffer too small for %d\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: no empty slot in packet ringbuffer\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] too short PES video packet\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] invalid PES video packet\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] %d invalid PES video packet(s)\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] empty video packet\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] invalid video packet %d/%d bytes\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] empty video packet %d bytes\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "softhddev: %s called without hw decoder\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] invalid still video packet\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "[softhddev] no codec known for still picture\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Bad formated geometry please use: [=][<width>{xX}<height>][{+-}<xoffset>{+-}<yoffset>]\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Workaround '%s' unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "We need no long options\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Missing argument for option '%c'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Unknown option '%c'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Unhandled argument '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "x-setup: No X server configured!\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "x-setup: too many arguments for xserver\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "x-setup: Failed to start X server '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "[softhddev] ready%s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: can't make glx context current\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: no v-sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "glewinit failed\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: no GLX support\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/glx: glx version %d.%d\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "did not get FBconfig"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: can't get a RGB visual\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: no valid visual found\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: need atleast 8-bits per RGB\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: can't create glx context\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: can't disable v-sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: v-sync disabled\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: can't enable v-sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: v-sync enabled\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: SGI can't enable v-sync\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: SGI v-sync enabled\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "checkCudaErrors() Driver API error = %04d"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/cuvid: surface needed not set\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/cuvid: release surface %#08x, which is not in use\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/cuvid: out of decoders\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/cuvid: out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/cuvid: need 1 future, 1 current, 1 back and 1 work surface\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/cuvid: decoder not in decoder list.\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/glx: glx error\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/cuvid: SDL error %d: %d\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/vdpau: no valid vdpau pixfmt found\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/vdpau: no valid profile found\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "CUVID Init failed\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "CUVID Not found\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: can't get output surface parameters: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: can't render output surface: %s\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/vdpau: video surface size mismatch\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video/vdpau: out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: unsupported rgba format %d\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: can't get video surface bits native: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: can't get video surface parameters: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: unsupported chroma type %d\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: can't get video surface bits: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: output buffer full, dropping frame (%d/%d)\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/vdpau: pixel format %d not supported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "Kein Cuda device gefunden"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/cuvid: can't block queue: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/cuvid: missed frame (%d/%d)\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: decoder buffer empty, duping frame (%d/%d) %d v-buf\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: fatal i/o error\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video/event: No symbol for %d\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: can't lock thread\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: can't unlock thread\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: can't queue cancel video display thread\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: can't cancel video display thread\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: repeated pict %d found, but not handled\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "softhddev: grab unsupported\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: Can't connect to X11 server on '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: Can't initialize X11 thread support on '%s'\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: Can't convert XLIB display to XCB connection\n"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "video: '%s' output module isn't supported\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "video: error closing display\n"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "A software and GPU emulated HD device"
|
||||
#~ msgstr "Ein Software und GPU emulieres HD-Gerät"
|
||||
|
||||
#~ msgid "SoftHdDevice"
|
||||
#~ msgstr "SoftHdDevice"
|
337
ringbuffer.c
Normal file
337
ringbuffer.c
Normal file
@ -0,0 +1,337 @@
|
||||
///
|
||||
/// @file ringbuffer.c @brief Ringbuffer module
|
||||
///
|
||||
/// Copyright (c) 2009, 2011, 2014 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: c9497b197ce7e7a6ba397944edc7ccb161152efd $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///
|
||||
/// @defgroup Ringbuffer The ring buffer module.
|
||||
///
|
||||
/// Lock free ring buffer with only one writer and one reader.
|
||||
///
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iatomic.h"
|
||||
#include "ringbuffer.h"
|
||||
|
||||
/// ring buffer structure
|
||||
struct _ring_buffer_
|
||||
{
|
||||
char *Buffer; ///< ring buffer data
|
||||
const char *BufferEnd; ///< end of buffer
|
||||
size_t Size; ///< bytes in buffer (for faster calc)
|
||||
|
||||
const char *ReadPointer; ///< only used by reader
|
||||
char *WritePointer; ///< only used by writer
|
||||
|
||||
/// The only thing modified by both
|
||||
atomic_t Filled; ///< how many of the buffer is used
|
||||
};
|
||||
|
||||
/**
|
||||
** Reset ring buffer pointers.
|
||||
**
|
||||
** @param rb Ring buffer to reset read/write pointers.
|
||||
*/
|
||||
void RingBufferReset(RingBuffer * rb)
|
||||
{
|
||||
rb->ReadPointer = rb->Buffer;
|
||||
rb->WritePointer = rb->Buffer;
|
||||
atomic_set(&rb->Filled, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
** Allocate a new ring buffer.
|
||||
**
|
||||
** @param size Size of the ring buffer.
|
||||
**
|
||||
** @returns Allocated ring buffer, must be freed with
|
||||
** RingBufferDel(), NULL for out of memory.
|
||||
*/
|
||||
RingBuffer *RingBufferNew(size_t size)
|
||||
{
|
||||
RingBuffer *rb;
|
||||
|
||||
if (!(rb = malloc(sizeof(*rb)))) { // allocate structure
|
||||
return rb;
|
||||
}
|
||||
if (!(rb->Buffer = malloc(size))) { // allocate buffer
|
||||
free(rb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rb->Size = size;
|
||||
rb->BufferEnd = rb->Buffer + size;
|
||||
RingBufferReset(rb);
|
||||
|
||||
return rb;
|
||||
}
|
||||
|
||||
/**
|
||||
** Free an allocated ring buffer.
|
||||
*/
|
||||
void RingBufferDel(RingBuffer * rb)
|
||||
{
|
||||
free(rb->Buffer);
|
||||
free(rb);
|
||||
}
|
||||
|
||||
/**
|
||||
** Advance write pointer in ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to advance write pointer.
|
||||
** @param cnt Number of bytes to be adavanced.
|
||||
**
|
||||
** @returns Number of bytes that could be advanced in ring buffer.
|
||||
*/
|
||||
size_t RingBufferWriteAdvance(RingBuffer * rb, size_t cnt)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
n = rb->Size - atomic_read(&rb->Filled);
|
||||
if (cnt > n) { // not enough space
|
||||
cnt = n;
|
||||
}
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->WritePointer;
|
||||
if (n > cnt) { // don't cross the end
|
||||
rb->WritePointer += cnt;
|
||||
} else { // reached or cross the end
|
||||
rb->WritePointer = rb->Buffer;
|
||||
if (n < cnt) {
|
||||
n = cnt - n;
|
||||
rb->WritePointer += n;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Only atomic modification!
|
||||
//
|
||||
atomic_add(cnt, &rb->Filled);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Write to a ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to write to.
|
||||
** @param buf Buffer of @p cnt bytes.
|
||||
** @param cnt Number of bytes in buffer.
|
||||
**
|
||||
** @returns The number of bytes that could be placed in the ring
|
||||
** buffer.
|
||||
*/
|
||||
size_t RingBufferWrite(RingBuffer * rb, const void *buf, size_t cnt)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
n = rb->Size - atomic_read(&rb->Filled);
|
||||
if (cnt > n) { // not enough space
|
||||
cnt = n;
|
||||
}
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->WritePointer;
|
||||
if (n > cnt) { // don't cross the end
|
||||
memcpy(rb->WritePointer, buf, cnt);
|
||||
rb->WritePointer += cnt;
|
||||
} else { // reached or cross the end
|
||||
memcpy(rb->WritePointer, buf, n);
|
||||
rb->WritePointer = rb->Buffer;
|
||||
if (n < cnt) {
|
||||
buf += n;
|
||||
n = cnt - n;
|
||||
memcpy(rb->WritePointer, buf, n);
|
||||
rb->WritePointer += n;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Only atomic modification!
|
||||
//
|
||||
atomic_add(cnt, &rb->Filled);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Get write pointer and free bytes at this position of ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to write to.
|
||||
** @param[out] wp Write pointer is placed here
|
||||
**
|
||||
** @returns The number of bytes that could be placed in the ring
|
||||
** buffer at the write pointer.
|
||||
*/
|
||||
size_t RingBufferGetWritePointer(RingBuffer * rb, void **wp)
|
||||
{
|
||||
size_t n;
|
||||
size_t cnt;
|
||||
|
||||
// Total free bytes available in ring buffer
|
||||
cnt = rb->Size - atomic_read(&rb->Filled);
|
||||
|
||||
*wp = rb->WritePointer;
|
||||
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->WritePointer;
|
||||
if (n <= cnt) { // reached or cross the end
|
||||
return n;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Advance read pointer in ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to advance read pointer.
|
||||
** @param cnt Number of bytes to be advanced.
|
||||
**
|
||||
** @returns Number of bytes that could be advanced in ring buffer.
|
||||
*/
|
||||
size_t RingBufferReadAdvance(RingBuffer * rb, size_t cnt)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
n = atomic_read(&rb->Filled);
|
||||
if (cnt > n) { // not enough filled
|
||||
cnt = n;
|
||||
}
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->ReadPointer;
|
||||
if (n > cnt) { // don't cross the end
|
||||
rb->ReadPointer += cnt;
|
||||
} else { // reached or cross the end
|
||||
rb->ReadPointer = rb->Buffer;
|
||||
if (n < cnt) {
|
||||
n = cnt - n;
|
||||
rb->ReadPointer += n;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Only atomic modification!
|
||||
//
|
||||
atomic_sub(cnt, &rb->Filled);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Read from a ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to read from.
|
||||
** @param buf Buffer of @p cnt bytes.
|
||||
** @param cnt Number of bytes to be read.
|
||||
**
|
||||
** @returns Number of bytes that could be read from ring buffer.
|
||||
*/
|
||||
size_t RingBufferRead(RingBuffer * rb, void *buf, size_t cnt)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
n = atomic_read(&rb->Filled);
|
||||
if (cnt > n) { // not enough filled
|
||||
cnt = n;
|
||||
}
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->ReadPointer;
|
||||
if (n > cnt) { // don't cross the end
|
||||
memcpy(buf, rb->ReadPointer, cnt);
|
||||
rb->ReadPointer += cnt;
|
||||
} else { // reached or cross the end
|
||||
memcpy(buf, rb->ReadPointer, n);
|
||||
rb->ReadPointer = rb->Buffer;
|
||||
if (n < cnt) {
|
||||
buf += n;
|
||||
n = cnt - n;
|
||||
memcpy(buf, rb->ReadPointer, n);
|
||||
rb->ReadPointer += n;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Only atomic modification!
|
||||
//
|
||||
atomic_sub(cnt, &rb->Filled);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Get read pointer and used bytes at this position of ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer to read from.
|
||||
** @param[out] rp Read pointer is placed here
|
||||
**
|
||||
** @returns The number of bytes that could be read from the ring
|
||||
** buffer at the read pointer.
|
||||
*/
|
||||
size_t RingBufferGetReadPointer(RingBuffer * rb, const void **rp)
|
||||
{
|
||||
size_t n;
|
||||
size_t cnt;
|
||||
|
||||
// Total used bytes in ring buffer
|
||||
cnt = atomic_read(&rb->Filled);
|
||||
|
||||
*rp = rb->ReadPointer;
|
||||
|
||||
//
|
||||
// Hitting end of buffer?
|
||||
//
|
||||
n = rb->BufferEnd - rb->ReadPointer;
|
||||
if (n <= cnt) { // reached or cross the end
|
||||
return n;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
** Get free bytes in ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer.
|
||||
**
|
||||
** @returns Number of bytes free in buffer.
|
||||
*/
|
||||
size_t RingBufferFreeBytes(RingBuffer * rb)
|
||||
{
|
||||
return rb->Size - atomic_read(&rb->Filled);
|
||||
}
|
||||
|
||||
/**
|
||||
** Get used bytes in ring buffer.
|
||||
**
|
||||
** @param rb Ring buffer.
|
||||
**
|
||||
** @returns Number of bytes used in buffer.
|
||||
*/
|
||||
size_t RingBufferUsedBytes(RingBuffer * rb)
|
||||
{
|
||||
return atomic_read(&rb->Filled);
|
||||
}
|
62
ringbuffer.h
Normal file
62
ringbuffer.h
Normal file
@ -0,0 +1,62 @@
|
||||
///
|
||||
/// @file ringbuffer.h @brief Ringbuffer module header file
|
||||
///
|
||||
/// Copyright (c) 2009, 2011 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: 8a2b4c171f1024afb8b8a7a7add631b7ebe2d45e $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup Ringbuffer
|
||||
/// @{
|
||||
|
||||
/// ring buffer typedef
|
||||
typedef struct _ring_buffer_ RingBuffer;
|
||||
|
||||
/// reset ring buffer pointers
|
||||
extern void RingBufferReset(RingBuffer *);
|
||||
|
||||
/// create new ring buffer
|
||||
extern RingBuffer *RingBufferNew(size_t);
|
||||
|
||||
/// free ring buffer
|
||||
extern void RingBufferDel(RingBuffer *);
|
||||
|
||||
/// write into ring buffer
|
||||
extern size_t RingBufferWrite(RingBuffer *, const void *, size_t);
|
||||
|
||||
/// get write pointer of ring buffer
|
||||
extern size_t RingBufferGetWritePointer(RingBuffer *, void **);
|
||||
|
||||
/// advance write pointer of ring buffer
|
||||
extern size_t RingBufferWriteAdvance(RingBuffer *, size_t);
|
||||
|
||||
/// read from ring buffer
|
||||
extern size_t RingBufferRead(RingBuffer *, void *, size_t);
|
||||
|
||||
/// get read pointer of ring buffer
|
||||
extern size_t RingBufferGetReadPointer(RingBuffer *, const void **);
|
||||
|
||||
/// advance read pointer of ring buffer
|
||||
extern size_t RingBufferReadAdvance(RingBuffer *, size_t);
|
||||
|
||||
/// free bytes ring buffer
|
||||
extern size_t RingBufferFreeBytes(RingBuffer *);
|
||||
|
||||
/// used bytes ring buffer
|
||||
extern size_t RingBufferUsedBytes(RingBuffer *);
|
||||
|
||||
/// @}
|
280
shaders.h
Normal file
280
shaders.h
Normal file
@ -0,0 +1,280 @@
|
||||
|
||||
// shader
|
||||
|
||||
char vertex[] = {"\
|
||||
#version 330\n\
|
||||
in vec2 vertex_position;\n\
|
||||
in vec2 vertex_texcoord0;\n\
|
||||
out vec2 texcoord0;\n\
|
||||
in vec2 vertex_texcoord1;\n\
|
||||
out vec2 texcoord1;\n\
|
||||
in vec2 vertex_texcoord2;\n\
|
||||
out vec2 texcoord2;\n\
|
||||
in vec2 vertex_texcoord3;\n\
|
||||
out vec2 texcoord3;\n\
|
||||
in vec2 vertex_texcoord4;\n\
|
||||
out vec2 texcoord4;\n\
|
||||
in vec2 vertex_texcoord5;\n\
|
||||
out vec2 texcoord5;\n\
|
||||
void main() {\n\
|
||||
gl_Position = vec4(vertex_position, 1.0, 1.0);\n\
|
||||
texcoord0 = vertex_texcoord0;\n\
|
||||
texcoord1 = vertex_texcoord1;\n\
|
||||
texcoord2 = vertex_texcoord2;\n\
|
||||
texcoord3 = vertex_texcoord3;\n\
|
||||
texcoord4 = vertex_texcoord4;\n\
|
||||
texcoord5 = vertex_texcoord5;\n\
|
||||
}\n"};
|
||||
|
||||
|
||||
char fragment[] = {"\
|
||||
#version 330\n\
|
||||
#define texture1D texture\n\
|
||||
#define texture3D texture\n\
|
||||
out vec4 out_color;\n\
|
||||
in vec2 texcoord0;\n\
|
||||
in vec2 texcoord1;\n\
|
||||
in vec2 texcoord2;\n\
|
||||
in vec2 texcoord3;\n\
|
||||
in vec2 texcoord4;\n\
|
||||
in vec2 texcoord5;\n\
|
||||
uniform mat3 colormatrix;\n\
|
||||
uniform vec3 colormatrix_c;\n\
|
||||
uniform sampler2D texture0;\n\
|
||||
//uniform vec2 texture_size0;\n\
|
||||
//uniform mat2 texture_rot0;\n\
|
||||
//uniform vec2 pixel_size0;\n\
|
||||
uniform sampler2D texture1;\n\
|
||||
//uniform vec2 texture_size1;\n\
|
||||
//uniform mat2 texture_rot1;\n\
|
||||
//uniform vec2 pixel_size1;\n\
|
||||
//#define LUT_POS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x))\n\
|
||||
void main() {\n\
|
||||
vec4 color; // = vec4(0.0, 0.0, 0.0, 1.0);\n\
|
||||
color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r;\n\
|
||||
color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg;\n\
|
||||
// color conversion\n\
|
||||
color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;\n\
|
||||
color.a = 1.0;\n\
|
||||
// color mapping\n\
|
||||
out_color = color;\n\
|
||||
}\n"};
|
||||
|
||||
/* Color conversion matrix: RGB = m * YUV + c
|
||||
* m is in row-major matrix, with m[row][col], e.g.:
|
||||
* [ a11 a12 a13 ] float m[3][3] = { { a11, a12, a13 },
|
||||
* [ a21 a22 a23 ] { a21, a22, a23 },
|
||||
* [ a31 a32 a33 ] { a31, a32, a33 } };
|
||||
* This is accessed as e.g.: m[2-1][1-1] = a21
|
||||
* In particular, each row contains all the coefficients for one of R, G, B,
|
||||
* while each column contains all the coefficients for one of Y, U, V:
|
||||
* m[r,g,b][y,u,v] = ...
|
||||
* The matrix could also be viewed as group of 3 vectors, e.g. the 1st column
|
||||
* is the Y vector (1, 1, 1), the 2nd is the U vector, the 3rd the V vector.
|
||||
* The matrix might also be used for other conversions and colorspaces.
|
||||
*/
|
||||
struct mp_cmat {
|
||||
float m[3][3]; // colormatrix
|
||||
float c[3]; //colormatrix_c
|
||||
};
|
||||
|
||||
// YUV input limited range (16-235 for luma, 16-240 for chroma)
|
||||
// ITU-R BT.601 (SD)
|
||||
struct mp_cmat yuv_bt601 = {\
|
||||
{{ 1.164384, 1.164384, 1.164384 },\
|
||||
{ 0.00000, -0.391762, 2.017232 },\
|
||||
{ 1.596027, -0.812968 , 0.000000 }},\
|
||||
{-0.874202, 0.531668, -1.085631 } };
|
||||
|
||||
// ITU-R BT.709 (HD)
|
||||
struct mp_cmat yuv_bt709 = {\
|
||||
{{ 1.164384, 1.164384, 1.164384 },\
|
||||
{ 0.00000, -0.213249, 2.112402 },\
|
||||
{ 1.792741, -0.532909 , 0.000000 }},\
|
||||
{-0.972945, 0.301483, -1.133402 } };
|
||||
|
||||
// ITU-R BT.2020 non-constant luminance system
|
||||
struct mp_cmat yuv_bt2020ncl = {\
|
||||
{{ 1.164384, 1.164384, 1.164384 },\
|
||||
{ 0.00000, -0.187326, 2.141772 },\
|
||||
{ 1.678674, -0.650424 , 0.000000 }},\
|
||||
{-0.915688, 0.347459, -1.148145 } };
|
||||
|
||||
// ITU-R BT.2020 constant luminance system
|
||||
struct mp_cmat yuv_bt2020cl = {\
|
||||
{{ 0.0000, 1.164384, 0.000000 },\
|
||||
{ 0.00000, 0.000000, 1.138393 },\
|
||||
{ 1.138393, 0.000000 , 0.000000 }},\
|
||||
{-0.571429, -0.073059, -0.571429 } };
|
||||
|
||||
struct gl_vao_entry {
|
||||
// used for shader / glBindAttribLocation
|
||||
const char *name;
|
||||
// glVertexAttribPointer() arguments
|
||||
int num_elems; // size (number of elements)
|
||||
GLenum type;
|
||||
bool normalized;
|
||||
int offset;
|
||||
};
|
||||
|
||||
struct vertex_pt {
|
||||
float x, y;
|
||||
};
|
||||
|
||||
#define TEXUNIT_VIDEO_NUM 6
|
||||
struct vertex {
|
||||
struct vertex_pt position;
|
||||
struct vertex_pt texcoord[TEXUNIT_VIDEO_NUM];
|
||||
};
|
||||
|
||||
static const struct gl_vao_entry vertex_vao[] = {
|
||||
{"position", 2, GL_FLOAT, false, offsetof(struct vertex, position)},
|
||||
{"texcoord0", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[0])},
|
||||
{"texcoord1", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[1])},
|
||||
{"texcoord2", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[2])},
|
||||
{"texcoord3", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[3])},
|
||||
{"texcoord4", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[4])},
|
||||
{"texcoord5", 2, GL_FLOAT, false, offsetof(struct vertex, texcoord[5])},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void compile_attach_shader(GLuint program,
|
||||
GLenum type, const char *source)
|
||||
{
|
||||
|
||||
GLuint shader = glCreateShader(type);
|
||||
glShaderSource(shader, 1, &source, NULL);
|
||||
glCompileShader(shader);
|
||||
GLint status = 0;
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
||||
GLint log_length = 0;
|
||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
|
||||
Debug(3,"compile Status %d loglen %d\n",status,log_length);
|
||||
|
||||
GlxCheck();
|
||||
glAttachShader(program, shader);
|
||||
glDeleteShader(shader);
|
||||
}
|
||||
|
||||
static void link_shader(GLuint program)
|
||||
{
|
||||
glLinkProgram(program);
|
||||
GLint status = 0;
|
||||
glGetProgramiv(program, GL_LINK_STATUS, &status);
|
||||
GLint log_length = 0;
|
||||
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_length);
|
||||
Debug(3,"Link Status %d loglen %d\n",status,log_length);
|
||||
|
||||
|
||||
}
|
||||
|
||||
static GLuint sc_generate(GLuint gl_prog,char *vert, char *frag, int h) {
|
||||
|
||||
char vname[80];
|
||||
int n;
|
||||
GLint texLoc;
|
||||
float *m,*c;
|
||||
|
||||
Debug(3,"vor create\n");
|
||||
gl_prog = glCreateProgram();
|
||||
Debug(3,"vor compile vertex\n");
|
||||
compile_attach_shader(gl_prog, GL_VERTEX_SHADER, vert);
|
||||
Debug(3,"vor compile fragment\n");
|
||||
compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, frag);
|
||||
glBindAttribLocation(gl_prog,0,"vertex_position");
|
||||
|
||||
for (n=0;n<6;n++) {
|
||||
sprintf(vname,"vertex_texcoord%1d",n);
|
||||
glBindAttribLocation(gl_prog,n+1,vname);
|
||||
}
|
||||
|
||||
// dirty hack to find colormatrix
|
||||
// TODO find the right colormatrix in SEI message
|
||||
if (h < 720) {
|
||||
m = &yuv_bt601.m[0][0];
|
||||
c = &yuv_bt601.c[0];
|
||||
}
|
||||
if (h >= 720 && h <=1080) {
|
||||
m = &yuv_bt709.m[0][0];
|
||||
c = &yuv_bt709.c[0];
|
||||
}
|
||||
else {
|
||||
m = &yuv_bt2020ncl.m[0][0];
|
||||
c = &yuv_bt2020ncl.c[0];
|
||||
}
|
||||
|
||||
link_shader(gl_prog);
|
||||
gl_colormatrix = glGetUniformLocation(gl_prog,"colormatrix");
|
||||
Debug(3,"get uniform colormatrix %d \n",gl_colormatrix);
|
||||
if (gl_colormatrix != -1)
|
||||
glProgramUniformMatrix3fv(gl_prog,gl_colormatrix,1,0,m);
|
||||
GlxCheck();
|
||||
//glProgramUniform3fv(gl_prog,gl_colormatrix,3,&yuv_bt709.m[0][0]);
|
||||
gl_colormatrix_c = glGetUniformLocation(gl_prog,"colormatrix_c");
|
||||
Debug(3,"get uniform colormatrix_c %d %f\n",gl_colormatrix_c,*c);
|
||||
if (gl_colormatrix_c != -1)
|
||||
glProgramUniform3fv(gl_prog,gl_colormatrix_c,1,c);
|
||||
GlxCheck();
|
||||
|
||||
return gl_prog;
|
||||
}
|
||||
|
||||
static void render_pass_quad()
|
||||
{
|
||||
struct vertex va[4];
|
||||
int n;
|
||||
const struct gl_vao_entry *e;
|
||||
// uhhhh what a hack
|
||||
va[0].position.x = (float) -1.0;
|
||||
va[0].position.y = (float) 1.0;
|
||||
va[1].position.x = (float) -1.0;
|
||||
va[1].position.y = (float) -1.0;
|
||||
va[2].position.x = (float) 1.0;
|
||||
va[2].position.y = (float) 1.0;
|
||||
va[3].position.x = (float) 1.0;
|
||||
va[3].position.y = (float) -1.0;
|
||||
|
||||
va[0].texcoord[0].x = (float) 0.0;
|
||||
va[0].texcoord[0].y = (float) 0.0;
|
||||
va[0].texcoord[1].x = (float) 0.0;
|
||||
va[0].texcoord[1].y = (float) 0.0;
|
||||
va[1].texcoord[0].x = (float) 0.0;
|
||||
va[1].texcoord[0].y = (float) 1.0;
|
||||
va[1].texcoord[1].x = (float) 0.0;
|
||||
va[1].texcoord[1].y = (float) 1.0;
|
||||
va[2].texcoord[0].x = (float) 1.0;
|
||||
va[2].texcoord[0].y = (float) 0.0;
|
||||
va[2].texcoord[1].x = (float) 1.0;
|
||||
va[2].texcoord[1].y = (float) 0.0;
|
||||
va[3].texcoord[0].x = (float) 1.0;
|
||||
va[3].texcoord[0].y = (float) 1.0;
|
||||
va[3].texcoord[1].x = (float) 1.0;
|
||||
va[3].texcoord[1].y = (float) 1.0;
|
||||
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vao_buffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(struct vertex), va, GL_DYNAMIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
// enable attribs
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vao_buffer);
|
||||
for ( n = 0; vertex_vao[n].name; n++) {
|
||||
e = &vertex_vao[n];
|
||||
glEnableVertexAttribArray(n);
|
||||
glVertexAttribPointer(n, e->num_elems, e->type, e->normalized,
|
||||
sizeof(struct vertex), (void *)(intptr_t)e->offset);
|
||||
}
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
// draw quad
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
for ( n = 0; vertex_vao[n].name; n++)
|
||||
glDisableVertexAttribArray(n);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
92
shaders.txt
Normal file
92
shaders.txt
Normal file
@ -0,0 +1,92 @@
|
||||
Pro 7 1080i
|
||||
|
||||
[vo/opengl] [ 1] color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r;
|
||||
[vo/opengl] [ 2] color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg;
|
||||
[vo/opengl] [ 3] // color conversion
|
||||
[vo/opengl] [ 4] color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;
|
||||
[vo/opengl] [ 5] color.a = 1.0;
|
||||
[vo/opengl] [ 6] // color mapping
|
||||
|
||||
UHD 10 Bit
|
||||
[vo/opengl] [ 1] color.r = 1.003906 * vec4(texture(texture0, texcoord0)).r;
|
||||
[vo/opengl] [ 2] color.gb = 1.003906 * vec4(texture(texture1, texcoord1)).rg;
|
||||
[vo/opengl] [ 3] // color conversion
|
||||
[vo/opengl] [ 4] color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;
|
||||
[vo/opengl] [ 5] color.a = 1.0;
|
||||
[vo/opengl] [ 6] // color mapping
|
||||
|
||||
|
||||
HEVC 8 Bit
|
||||
[vo/opengl] [ 1] color.r = 1.003906 * vec4(texture(texture0, texcoord0)).r;
|
||||
[vo/opengl] [ 2] color.gb = 1.003906 * vec4(texture(texture1, texcoord1)).rg;
|
||||
[vo/opengl] [ 3] // color conversion
|
||||
[vo/opengl] [ 4] color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;
|
||||
[vo/opengl] [ 5] color.a = 1.0;
|
||||
[vo/opengl] [ 6] // color mapping
|
||||
|
||||
ZDF 720p
|
||||
[vo/opengl] [ 1] color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r;
|
||||
[vo/opengl] [ 2] color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg;
|
||||
[vo/opengl] [ 3] // color conversion
|
||||
[vo/opengl] [ 4] color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;
|
||||
[vo/opengl] [ 5] color.a = 1.0;
|
||||
[vo/opengl] [ 6] // color mapping
|
||||
|
||||
VERTEX
|
||||
#version 330
|
||||
in vec2 vertex_position;
|
||||
in vec2 vertex_texcoord0;
|
||||
out vec2 texcoord0;
|
||||
in vec2 vertex_texcoord1;
|
||||
out vec2 texcoord1;
|
||||
in vec2 vertex_texcoord2;
|
||||
out vec2 texcoord2;
|
||||
in vec2 vertex_texcoord3;
|
||||
out vec2 texcoord3;
|
||||
in vec2 vertex_texcoord4;
|
||||
out vec2 texcoord4;
|
||||
in vec2 vertex_texcoord5;
|
||||
out vec2 texcoord5;
|
||||
void main() {
|
||||
gl_Position = vec4(vertex_position, 1.0, 1.0);
|
||||
texcoord0 = vertex_texcoord0;
|
||||
texcoord1 = vertex_texcoord1;
|
||||
texcoord2 = vertex_texcoord2;
|
||||
texcoord3 = vertex_texcoord3;
|
||||
texcoord4 = vertex_texcoord4;
|
||||
texcoord5 = vertex_texcoord5;
|
||||
}
|
||||
|
||||
FRAGMENT
|
||||
#version 330
|
||||
#define texture1D texture
|
||||
#define texture3D texture
|
||||
out vec4 out_color;
|
||||
in vec2 texcoord0;
|
||||
in vec2 texcoord1;
|
||||
in vec2 texcoord2;
|
||||
in vec2 texcoord3;
|
||||
in vec2 texcoord4;
|
||||
in vec2 texcoord5;
|
||||
uniform mat3 colormatrix;
|
||||
uniform vec3 colormatrix_c;
|
||||
uniform sampler2D texture0;
|
||||
uniform vec2 texture_size0;
|
||||
uniform mat2 texture_rot0;
|
||||
uniform vec2 pixel_size0;
|
||||
uniform sampler2D texture1;
|
||||
uniform vec2 texture_size1;
|
||||
uniform mat2 texture_rot1;
|
||||
uniform vec2 pixel_size1;
|
||||
#define LUT_POS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x))
|
||||
void main() {
|
||||
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r;
|
||||
color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg;
|
||||
// color conversion
|
||||
color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c;
|
||||
color.a = 1.0;
|
||||
// color mapping
|
||||
out_color = color;
|
||||
}
|
||||
|
3584
softhdcuvid.cpp
Normal file
3584
softhdcuvid.cpp
Normal file
File diff suppressed because it is too large
Load Diff
3532
softhddev.c
Normal file
3532
softhddev.c
Normal file
File diff suppressed because it is too large
Load Diff
117
softhddev.h
Normal file
117
softhddev.h
Normal file
@ -0,0 +1,117 @@
|
||||
///
|
||||
/// @file softhddev.h @brief software HD device plugin header file.
|
||||
///
|
||||
/// Copyright (c) 2011 - 2015 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: efb2e251dd7082138ec21609478d2402be8208cf $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
/// C callback feed key press
|
||||
extern void FeedKeyPress(const char *, const char *, int, int,
|
||||
const char *);
|
||||
|
||||
/// C plugin get osd size and ascpect
|
||||
extern void GetOsdSize(int *, int *, double *);
|
||||
|
||||
/// C plugin close osd
|
||||
extern void OsdClose(void);
|
||||
/// C plugin draw osd pixmap
|
||||
extern void OsdDrawARGB(int, int, int, int, int, const uint8_t *, int,
|
||||
int);
|
||||
|
||||
/// C plugin play audio packet
|
||||
extern int PlayAudio(const uint8_t *, int, uint8_t);
|
||||
/// C plugin play TS audio packet
|
||||
extern int PlayTsAudio(const uint8_t *, int);
|
||||
/// C plugin set audio volume
|
||||
extern void SetVolumeDevice(int);
|
||||
/// C plugin reset channel id (restarts audio)
|
||||
extern void ResetChannelId(void);
|
||||
|
||||
/// C plugin play video packet
|
||||
extern int PlayVideo(const uint8_t *, int);
|
||||
/// C plugin play TS video packet
|
||||
extern void PlayTsVideo(const uint8_t *, int);
|
||||
/// C plugin grab an image
|
||||
extern uint8_t *GrabImage(int *, int, int, int, int);
|
||||
|
||||
/// C plugin set play mode
|
||||
extern int SetPlayMode(int);
|
||||
/// C plugin get current system time counter
|
||||
extern int64_t GetSTC(void);
|
||||
/// C plugin get video stream size and aspect
|
||||
extern void GetVideoSize(int *, int *, double *);
|
||||
/// C plugin set trick speed
|
||||
extern void TrickSpeed(int);
|
||||
/// C plugin clears all video and audio data from the device
|
||||
extern void Clear(void);
|
||||
/// C plugin sets the device into play mode
|
||||
extern void Play(void);
|
||||
/// C plugin sets the device into "freeze frame" mode
|
||||
extern void Freeze(void);
|
||||
/// C plugin mute audio
|
||||
extern void Mute(void);
|
||||
/// C plugin display I-frame as a still picture.
|
||||
extern void StillPicture(const uint8_t *, int);
|
||||
/// C plugin poll if ready
|
||||
extern int Poll(int);
|
||||
/// C plugin flush output buffers
|
||||
extern int Flush(int);
|
||||
|
||||
/// C plugin command line help
|
||||
extern const char *CommandLineHelp(void);
|
||||
/// C plugin process the command line arguments
|
||||
extern int ProcessArgs(int, char *const[]);
|
||||
|
||||
/// C plugin exit + cleanup
|
||||
extern void SoftHdDeviceExit(void);
|
||||
/// C plugin start code
|
||||
extern int Start(void);
|
||||
/// C plugin stop code
|
||||
extern void Stop(void);
|
||||
/// C plugin house keeping
|
||||
extern void Housekeeping(void);
|
||||
/// C plugin main thread hook
|
||||
extern void MainThreadHook(void);
|
||||
|
||||
/// Suspend plugin
|
||||
extern void Suspend(int, int, int);
|
||||
/// Resume plugin
|
||||
extern void Resume(void);
|
||||
|
||||
/// Get decoder statistics
|
||||
extern void GetStats(int *, int *, int *, int *);
|
||||
/// C plugin scale video
|
||||
extern void ScaleVideo(int, int, int, int);
|
||||
|
||||
/// Set Pip position
|
||||
extern void PipSetPosition(int, int, int, int, int, int, int, int);
|
||||
/// Pip start
|
||||
extern void PipStart(int, int, int, int, int, int, int, int);
|
||||
/// Pip stop
|
||||
extern void PipStop(void);
|
||||
/// Pip play video packet
|
||||
extern int PipPlayVideo(const uint8_t *, int);
|
||||
|
||||
extern const char *X11DisplayName; ///< x11 display name
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
21
softhddevice.h
Normal file
21
softhddevice.h
Normal file
@ -0,0 +1,21 @@
|
||||
///
|
||||
/// @file softhddevice.h @brief software HD device plugin header file.
|
||||
///
|
||||
/// Copyright (c) 2011, 2014 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: 3bc44809950ec019529638cad9223a85d4ab5576 $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
65
softhddevice_service.h
Normal file
65
softhddevice_service.h
Normal file
@ -0,0 +1,65 @@
|
||||
///
|
||||
/// @file softhddev_service.h @brief software HD device service header file.
|
||||
///
|
||||
/// Copyright (c) 2012 by durchflieger. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: c7c2d5e8b724515d7c767668aab717b27f4e4068 $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#define ATMO_GRAB_SERVICE "SoftHDDevice-AtmoGrabService-v1.0"
|
||||
#define ATMO1_GRAB_SERVICE "SoftHDDevice-AtmoGrabService-v1.1"
|
||||
#define OSD_3DMODE_SERVICE "SoftHDDevice-Osd3DModeService-v1.0"
|
||||
|
||||
enum
|
||||
{ GRAB_IMG_RGBA_FORMAT_B8G8R8A8 };
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int structSize;
|
||||
|
||||
// request data
|
||||
int analyseSize;
|
||||
int clippedOverscan;
|
||||
|
||||
// reply data
|
||||
int imgType;
|
||||
int imgSize;
|
||||
int width;
|
||||
int height;
|
||||
void *img;
|
||||
} SoftHDDevice_AtmoGrabService_v1_0_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int Mode;
|
||||
} SoftHDDevice_Osd3DModeService_v1_0_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// request/reply data
|
||||
|
||||
int width;
|
||||
int height;
|
||||
|
||||
// reply data
|
||||
|
||||
int size;
|
||||
|
||||
void *img;
|
||||
} SoftHDDevice_AtmoGrabService_v1_1_t;
|
238
video.h
Normal file
238
video.h
Normal file
@ -0,0 +1,238 @@
|
||||
///
|
||||
/// @file video.h @brief Video module header file
|
||||
///
|
||||
/// Copyright (c) 2009 - 2015 by Johns. All Rights Reserved.
|
||||
///
|
||||
/// Contributor(s):
|
||||
///
|
||||
/// License: AGPLv3
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU Affero General Public License as
|
||||
/// published by the Free Software Foundation, either version 3 of the
|
||||
/// License.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU Affero General Public License for more details.
|
||||
///
|
||||
/// $Id: 83cd827a8744e8c80c8adba6cb87653b0ad58c45 $
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// @addtogroup Video
|
||||
/// @{
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// Video hardware decoder typedef
|
||||
typedef struct _video_hw_decoder_ VideoHwDecoder;
|
||||
|
||||
/// Video output stream typedef
|
||||
typedef struct __video_stream__ VideoStream;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
extern signed char VideoHardwareDecoder; ///< flag use hardware decoder
|
||||
extern char VideoIgnoreRepeatPict; ///< disable repeat pict warning
|
||||
extern int VideoAudioDelay; ///< audio/video delay
|
||||
extern char ConfigStartX11Server; ///< flag start the x11 server
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Prototypes
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// Allocate new video hardware decoder.
|
||||
extern VideoHwDecoder *VideoNewHwDecoder(VideoStream *);
|
||||
|
||||
/// Deallocate video hardware decoder.
|
||||
extern void VideoDelHwDecoder(VideoHwDecoder *);
|
||||
|
||||
#ifdef LIBAVCODEC_VERSION
|
||||
/// Get and allocate a video hardware surface.
|
||||
extern unsigned VideoGetSurface(VideoHwDecoder *, const AVCodecContext *);
|
||||
|
||||
/// Release a video hardware surface
|
||||
extern void VideoReleaseSurface(VideoHwDecoder *, unsigned);
|
||||
|
||||
/// Callback to negotiate the PixelFormat.
|
||||
extern enum AVPixelFormat Video_get_format(VideoHwDecoder *, AVCodecContext *,
|
||||
const enum AVPixelFormat *);
|
||||
|
||||
/// Render a ffmpeg frame.
|
||||
extern void VideoRenderFrame(VideoHwDecoder *, const AVCodecContext *,
|
||||
const AVFrame *);
|
||||
|
||||
/// Get hwaccel context for ffmpeg.
|
||||
extern void *VideoGetHwAccelContext(VideoHwDecoder *);
|
||||
|
||||
#ifdef AVCODEC_VDPAU_H
|
||||
/// Draw vdpau render state.
|
||||
extern void VideoDrawRenderState(VideoHwDecoder *,
|
||||
struct vdpau_render_state *);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/// Poll video events.
|
||||
extern void VideoPollEvent(void);
|
||||
|
||||
/// Wakeup display handler.
|
||||
extern void VideoDisplayWakeup(void);
|
||||
|
||||
/// Set video device.
|
||||
extern void VideoSetDevice(const char *);
|
||||
|
||||
/// Get video driver name.
|
||||
extern const char *VideoGetDriverName(void);
|
||||
|
||||
/// Set video geometry.
|
||||
extern int VideoSetGeometry(const char *);
|
||||
|
||||
/// Set 60Hz display mode.
|
||||
extern void VideoSet60HzMode(int);
|
||||
|
||||
/// Set soft start audio/video sync.
|
||||
extern void VideoSetSoftStartSync(int);
|
||||
|
||||
/// Set show black picture during channel switch.
|
||||
extern void VideoSetBlackPicture(int);
|
||||
|
||||
/// Set brightness adjustment.
|
||||
extern void VideoSetBrightness(int);
|
||||
|
||||
/// Set contrast adjustment.
|
||||
extern void VideoSetContrast(int);
|
||||
|
||||
/// Set saturation adjustment.
|
||||
extern void VideoSetSaturation(int);
|
||||
|
||||
/// Set hue adjustment.
|
||||
extern void VideoSetHue(int);
|
||||
|
||||
/// Set video output position.
|
||||
extern void VideoSetOutputPosition(VideoHwDecoder *, int, int, int, int);
|
||||
|
||||
/// Set video mode.
|
||||
extern void VideoSetVideoMode(int, int, int, int);
|
||||
|
||||
/// Set 4:3 display format.
|
||||
extern void VideoSet4to3DisplayFormat(int);
|
||||
|
||||
/// Set other display format.
|
||||
extern void VideoSetOtherDisplayFormat(int);
|
||||
|
||||
/// Set video fullscreen mode.
|
||||
extern void VideoSetFullscreen(int);
|
||||
|
||||
/// Set deinterlace.
|
||||
extern void VideoSetDeinterlace(int[]);
|
||||
|
||||
/// Set skip chroma deinterlace.
|
||||
extern void VideoSetSkipChromaDeinterlace(int[]);
|
||||
|
||||
/// Set inverse telecine.
|
||||
extern void VideoSetInverseTelecine(int[]);
|
||||
|
||||
/// Set scaling.
|
||||
extern void VideoSetScaling(int[]);
|
||||
|
||||
/// Set denoise.
|
||||
extern void VideoSetDenoise(int[]);
|
||||
|
||||
/// Set sharpen.
|
||||
extern void VideoSetSharpen(int[]);
|
||||
|
||||
/// Set cut top and bottom.
|
||||
extern void VideoSetCutTopBottom(int[]);
|
||||
|
||||
/// Set cut left and right.
|
||||
extern void VideoSetCutLeftRight(int[]);
|
||||
|
||||
/// Set studio levels.
|
||||
extern void VideoSetStudioLevels(int);
|
||||
|
||||
/// Set background.
|
||||
extern void VideoSetBackground(uint32_t);
|
||||
|
||||
/// Set audio delay.
|
||||
extern void VideoSetAudioDelay(int);
|
||||
|
||||
/// Set auto-crop parameters.
|
||||
extern void VideoSetAutoCrop(int, int, int);
|
||||
|
||||
/// Clear OSD.
|
||||
extern void VideoOsdClear(void);
|
||||
|
||||
/// Draw an OSD ARGB image.
|
||||
extern void VideoOsdDrawARGB(int, int, int, int, int, const uint8_t *, int,
|
||||
int);
|
||||
|
||||
/// Get OSD size.
|
||||
extern void VideoGetOsdSize(int *, int *);
|
||||
|
||||
/// Set OSD size.
|
||||
extern void VideoSetOsdSize(int, int);
|
||||
|
||||
/// Set Osd 3D Mode
|
||||
extern void VideoSetOsd3DMode(int);
|
||||
|
||||
/// Set video clock.
|
||||
extern void VideoSetClock(VideoHwDecoder *, int64_t);
|
||||
|
||||
/// Get video clock.
|
||||
extern int64_t VideoGetClock(const VideoHwDecoder *);
|
||||
|
||||
/// Set closing flag.
|
||||
extern void VideoSetClosing(VideoHwDecoder *);
|
||||
|
||||
/// Reset start of frame counter
|
||||
extern void VideoResetStart(VideoHwDecoder *);
|
||||
|
||||
/// Set trick play speed.
|
||||
extern void VideoSetTrickSpeed(VideoHwDecoder *, int);
|
||||
|
||||
/// Grab screen.
|
||||
extern uint8_t *VideoGrab(int *, int *, int *, int);
|
||||
|
||||
/// Grab screen raw.
|
||||
extern uint8_t *VideoGrabService(int *, int *, int *);
|
||||
|
||||
/// Get decoder statistics.
|
||||
extern void VideoGetStats(VideoHwDecoder *, int *, int *, int *, int *);
|
||||
|
||||
/// Get video stream size
|
||||
extern void VideoGetVideoSize(VideoHwDecoder *, int *, int *, int *, int *);
|
||||
|
||||
extern void VideoOsdInit(void); ///< Setup osd.
|
||||
extern void VideoOsdExit(void); ///< Cleanup osd.
|
||||
|
||||
extern void VideoInit(const char *); ///< Setup video module.
|
||||
extern void VideoExit(void); ///< Cleanup and exit video module.
|
||||
|
||||
/// Poll video input buffers.
|
||||
extern int VideoPollInput(VideoStream *);
|
||||
|
||||
/// Decode video input buffers.
|
||||
extern int VideoDecodeInput(VideoStream *);
|
||||
|
||||
/// Get number of input buffers.
|
||||
extern int VideoGetBuffers(const VideoStream *);
|
||||
|
||||
/// Set DPMS at Blackscreen switch
|
||||
extern void SetDPMSatBlackScreen(int);
|
||||
|
||||
/// Raise the frontend window
|
||||
extern int VideoRaiseWindow(void);
|
||||
|
||||
#if 0
|
||||
long int gettid()
|
||||
{
|
||||
return (long int)syscall(224);
|
||||
}
|
||||
#endif
|
||||
|
||||
/// @}
|
Loading…
Reference in New Issue
Block a user