Compare commits
101 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c9864adf34 | ||
![]() |
7d10059aeb | ||
![]() |
69e8b43812 | ||
![]() |
2f504d7a90 | ||
![]() |
2dea9a1266 | ||
![]() |
84e6629de3 | ||
![]() |
fc038df32e | ||
![]() |
021054a196 | ||
![]() |
ee20f19b20 | ||
![]() |
2fcb56dab9 | ||
![]() |
96ca078b22 | ||
![]() |
7fd4cbb519 | ||
![]() |
557e065d5f | ||
![]() |
461243731d | ||
![]() |
fe95afe1e2 | ||
![]() |
775aa5f38c | ||
![]() |
578c32814c | ||
![]() |
c46038f6b7 | ||
![]() |
306eefc49f | ||
![]() |
eade5150e4 | ||
![]() |
6d767afb7c | ||
![]() |
015a7d7362 | ||
![]() |
922c55a09b | ||
![]() |
4c83c13bc8 | ||
![]() |
bd7e30ea00 | ||
![]() |
4fb58ecea8 | ||
![]() |
a317cd5722 | ||
![]() |
8e2149d7df | ||
![]() |
9d9f1ecfaa | ||
![]() |
53b90bb25e | ||
![]() |
a0244ae347 | ||
![]() |
26f74e832b | ||
![]() |
9593c80062 | ||
![]() |
48b98cdc67 | ||
![]() |
9d442d2d7d | ||
![]() |
afc97d4735 | ||
![]() |
e5bea45df7 | ||
9e3935dfd8 | |||
4f5ee3f87b | |||
736d36b792 | |||
dc5cc27d5a | |||
eb70d77e1e | |||
b8ec4c49bd | |||
49487dfd78 | |||
0d3f25eb48 | |||
9ef13f70f4 | |||
![]() |
beb0dc5f36 | ||
![]() |
f3fd428697 | ||
8811fe6987 | |||
![]() |
3835603e7e | ||
![]() |
4b360ee2ca | ||
![]() |
ab546a7463 | ||
![]() |
acac7858bd | ||
![]() |
c42640b200 | ||
![]() |
ef84190a1a | ||
![]() |
7db16a8173 | ||
![]() |
e91ba7dc9d | ||
![]() |
95f90d27d2 | ||
![]() |
1e9ac36f66 | ||
![]() |
7d061cfe17 | ||
![]() |
e21e76a914 | ||
![]() |
b18806f811 | ||
![]() |
478394bab7 | ||
![]() |
de3196da60 | ||
![]() |
49549033fd | ||
![]() |
15dfbc503d | ||
![]() |
f5c694972e | ||
![]() |
a9785f58c6 | ||
![]() |
7a5e131735 | ||
![]() |
93229681b5 | ||
![]() |
8819b9c600 | ||
![]() |
5d62141092 | ||
![]() |
44b20d1d74 | ||
![]() |
9ad437eafb | ||
![]() |
4fcef88c4d | ||
![]() |
dd2089dfd8 | ||
![]() |
df0ff1a029 | ||
![]() |
41a4fd7a61 | ||
![]() |
a4d8ebfaa1 | ||
![]() |
0ae7dcae2c | ||
![]() |
d6c23ec06a | ||
![]() |
3499f0f3e3 | ||
![]() |
7056dd763f | ||
![]() |
eade41f3ec | ||
![]() |
2f14399e40 | ||
![]() |
4f3ce00704 | ||
![]() |
d8ef221893 | ||
![]() |
8d003e22ca | ||
![]() |
b0b57fa13b | ||
![]() |
266f6af570 | ||
![]() |
241c55aabe | ||
![]() |
030896c76a | ||
![]() |
beb93f987c | ||
![]() |
8e8813a0a1 | ||
![]() |
c3c2325adc | ||
![]() |
f8429ed58c | ||
![]() |
df4763a782 | ||
![]() |
58af0caf04 | ||
![]() |
3aafe82485 | ||
![]() |
07679e680c | ||
![]() |
da835cc8a3 |
674
COPYING.GPLv3
Normal file
674
COPYING.GPLv3
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 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 General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is 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. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
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.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
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 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. Use with the GNU Affero General Public License.
|
||||
|
||||
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 Affero 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 special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU 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 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 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 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 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU 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 the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
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 GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
165
COPYING.LGPLv3
Normal file
165
COPYING.LGPLv3
Normal file
@@ -0,0 +1,165 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 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.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
39
Changelog
39
Changelog
@@ -1,3 +1,42 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
|
||||
version 0.5.3:
|
||||
|
||||
- build system improvements
|
||||
- performance fix for seekable HTTP
|
||||
- fix several potentially exploitable issues in the FLIC decoder
|
||||
(addresses CVE-2010-3429)
|
||||
|
||||
|
||||
|
||||
version 0.5.2:
|
||||
|
||||
- Hurd support
|
||||
- PowerPC without Altivec compilation issues
|
||||
- validate channels and samplerate in the Vorbis decoder
|
||||
|
||||
|
||||
|
||||
version 0.5.1:
|
||||
|
||||
- build system updates
|
||||
- documentation updates
|
||||
- libswscale now is LGPL except for x86 optimizations
|
||||
- fix for GPL code in libswscale that was erroneously activated
|
||||
- AltiVec code in libswscale is now LGPL
|
||||
- remaining GPL parts in AC-3 decoder converted to LGPL
|
||||
- (L)GPL license upgrade support
|
||||
- AMR-NB decoding/encoding, AMR-WB decoding via OpenCORE libraries
|
||||
- enable symbol versioning by default for linkers that support it
|
||||
- backport av_lockmgr_register(), see doc/APIchanges for details
|
||||
- security fixes for:
|
||||
- ASF, Ogg and MOV demuxers
|
||||
- FFv1, H.264, HuffYUV, MLP, MPEG audio and Snow decoders
|
||||
|
||||
|
||||
|
||||
version 0.5:
|
||||
|
||||
- The "device" muxers and demuxers are now in a new libavdevice library
|
||||
|
50
LICENSE
Normal file
50
LICENSE
Normal file
@@ -0,0 +1,50 @@
|
||||
FFmpeg:
|
||||
-------
|
||||
|
||||
Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
|
||||
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
|
||||
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
|
||||
FFmpeg.
|
||||
|
||||
Some optional parts of FFmpeg are licensed under the GNU General Public License
|
||||
version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
|
||||
these parts are used by default, you have to explicitly pass --enable-gpl to
|
||||
configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
|
||||
|
||||
Specifically, the GPL parts of FFmpeg are
|
||||
|
||||
- libpostproc
|
||||
- some x86 optimizations in libswscale
|
||||
- optional x86 optimizations in the files
|
||||
libavcodec/x86/h264_deblock_sse2.asm
|
||||
libavcodec/x86/h264_idct_sse2.asm
|
||||
libavcodec/x86/idct_mmx.c
|
||||
- the X11 grabber in libavdevice/x11grab.c
|
||||
|
||||
There are a handful of files under other licensing terms, namely:
|
||||
|
||||
* The files libavcodec/jfdctfst.c, libavcodec/jfdctint.c, libavcodec/jrevdct.c
|
||||
are taken from libjpeg, see the top of the files for licensing details.
|
||||
|
||||
Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
|
||||
the configure parameter --enable-version3 will activate this licensing option
|
||||
for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
|
||||
COPYING.GPLv3 to learn the exact legal terms that apply in this case.
|
||||
|
||||
|
||||
external libraries:
|
||||
-------------------
|
||||
|
||||
Some external libraries, e.g. libx264, are under GPL and can be used in
|
||||
conjunction with FFmpeg. They require --enable-gpl to be passed to configure
|
||||
as well.
|
||||
|
||||
The OpenCORE external libraries are under the Apache License 2.0. That license
|
||||
is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of
|
||||
those licenses. So to combine the OpenCORE libraries with FFmpeg, the license
|
||||
version needs to be upgraded by passing --enable-version3 to configure.
|
||||
|
||||
The nonfree external libraries libamrnb, libamrwb and libfaac can be hooked up
|
||||
in FFmpeg. You need to pass --enable-nonfree to configure to enable them. Employ
|
||||
this option with care as FFmpeg then becomes nonfree and unredistributable.
|
||||
Note that libfaac claims to be LGPL, but is not.
|
@@ -49,6 +49,7 @@ build system (configure,Makefiles) Diego Biurrun, Mans Rullgard
|
||||
project server Diego Biurrun, Mans Rullgard
|
||||
mailinglists Michael Niedermayer, Baptiste Coudurier
|
||||
presets Robert Swain
|
||||
release management Diego Biurrun, Reinhard Tartler
|
||||
|
||||
|
||||
libavutil
|
||||
@@ -329,5 +330,6 @@ Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
||||
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
||||
Peter Ross A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
|
||||
Reimar Döffinger C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
|
||||
Reinhard Tartler 9300 5DC2 7E87 6C37 ED7B CA9A 9808 3544 9453 48A4
|
||||
Reynaldo H. Verdejo Pinochet 6E27 CD34 170C C78E 4D4F 5F40 C18E 077F 3114 452A
|
||||
Sascha Sommer 38A0 F88B 868E 9D3A 97D4 D6A0 E823 706F 1E07 0D3C
|
||||
|
30
README
30
README
@@ -9,32 +9,4 @@ FFmpeg README
|
||||
2) Licensing
|
||||
------------
|
||||
|
||||
* Read the file COPYING.LGPL. FFmpeg and the associated libraries EXCEPT
|
||||
for libpostproc are licensed under the GNU Lesser General Public License.
|
||||
|
||||
* libpostproc is distributed under the GNU General Public License, see the
|
||||
file COPYING.GPL for details. Its compilation and use in FFmpeg is optional.
|
||||
|
||||
* libswscale contains some optional processor-specific optimizations that are
|
||||
distributed under the GNU General Public License.
|
||||
|
||||
* The files libavcodec/x86/idct_mmx.c, libavcodec/x86/h264_deblock_sse2.asm
|
||||
and libavcodec/x86/h264_idct_sse2.asm are distributed under the GNU General
|
||||
Public License. They are strictly optimizations and their use is optional.
|
||||
|
||||
* The file libavcodec/ac3dec.c is distributed under the GNU General Public
|
||||
License. In order for (E-)AC-3 decoding to work you need to enable GPL
|
||||
components.
|
||||
|
||||
* The file libavdevice/x11grab.c is distributed under the GNU General
|
||||
Public License. X11 grabbing is optional.
|
||||
|
||||
* The files libavcodec/jfdctfst.c, libavcodec/jfdctint.c, libavcodec/jrevdct.c
|
||||
are taken from libjpeg, see the top of the files for licensing details.
|
||||
|
||||
* The file libavcodec/fdctref.c is copyrighted by the MPEG Software Simulation
|
||||
Group with all rights reserved. It is only used to create a DCT test program
|
||||
and not compiled into libavcodec.
|
||||
|
||||
* Some external libraries are under GPL. If you wish to use them with FFmpeg,
|
||||
you have to configure FFmpeg as GPL as well.
|
||||
* See the LICENSE file.
|
||||
|
126
RELEASE
Normal file
126
RELEASE
Normal file
@@ -0,0 +1,126 @@
|
||||
Release Notes
|
||||
=============
|
||||
|
||||
* 0.5 "Bike Shed World Domination" March 3, 2009
|
||||
|
||||
General notes
|
||||
-------------
|
||||
|
||||
It has been so long since the last release that this should be considered the
|
||||
first FFmpeg release of recent times. Because of the way things have unfolded to
|
||||
date, the notes for this version cannot be entirely conventional.
|
||||
|
||||
See the Changelog file for a list of significant changes.
|
||||
|
||||
Please note that our policy on bug reports has not changed. We still only accept
|
||||
bug reports against HEAD of the FFmpeg trunk repository. If you are experiencing
|
||||
any issues with any formally released version of FFmpeg, please try a current
|
||||
version of the development code to check if the issue still exists. If it does,
|
||||
make your report against the development code following the usual bug reporting
|
||||
guidelines.
|
||||
|
||||
API notes
|
||||
---------
|
||||
|
||||
In the next release, it is intended to remove a number of deprecated APIs. We
|
||||
decided to put out a release that includes said APIs for the benefit of third
|
||||
party software.
|
||||
|
||||
As such, this release:
|
||||
- provides a sync point for said APIs
|
||||
- increases awareness of API changes
|
||||
- allows the next release to detail how to transition from the old to the new
|
||||
|
||||
The deprecated APIs to be removed are:
|
||||
- imgconvert (to be replaced by libswscale)
|
||||
- vhook (to be replaced by libavfilter)
|
||||
|
||||
If at all possible, do not use the deprecated APIs. All notes on API changes
|
||||
should appear in doc/APIchanges.
|
||||
|
||||
|
||||
|
||||
* 0.5.1 March 2, 2010
|
||||
|
||||
General notes
|
||||
-------------
|
||||
|
||||
This point release includes some minor updates to make the 0.5 release series
|
||||
usable for users that need to retain the existing behavior as closely as
|
||||
possible. The changes follow below:
|
||||
|
||||
Security fixes
|
||||
--------------
|
||||
|
||||
Various programming errors in container and codec implementations
|
||||
may lead to denial of service or the execution of arbitrary code
|
||||
if the user is tricked into opening a malformed media file or stream.
|
||||
|
||||
Affected and updated have been the implementations of the following
|
||||
codecs and container formats:
|
||||
|
||||
- the Vorbis audio codec
|
||||
- the FF Video 1 codec
|
||||
- the MPEG audio codec
|
||||
- the H264 video codec
|
||||
- the MLP codec
|
||||
- the HuffYUV codec
|
||||
- the ASF demuxer
|
||||
- the Ogg container implementation
|
||||
- the MOV container implementation
|
||||
|
||||
Symbol Versioning enabled
|
||||
-------------------------
|
||||
|
||||
The backported symbol versioning change is enabled on platforms that support
|
||||
it. This allows users to upgrade from 0.5.1 to the upcoming 0.6 release
|
||||
without having to recompile their applications. Please note that distributors
|
||||
have to recompile applications against 0.5.1 before upgrading to 0.6.
|
||||
|
||||
libx264.c backport
|
||||
------------------
|
||||
|
||||
This release includes a backport to the libx264 wrapper that allows FFmpeg to
|
||||
be compiled against newer versions of libx264 up to API version 85.
|
||||
|
||||
licensing changes
|
||||
-----------------
|
||||
|
||||
Previously both libswscale and our AC-3 decoder had GPLed parts. These have
|
||||
been replaced by fresh LGPL code. x86 optimizations for libswscale remain GPL,
|
||||
but the C code is fully functional. Optimizations for other architectures have
|
||||
been relicensed to LGPL.
|
||||
|
||||
AMR-NB decoding/encoding and AMR-WB decoding is now possible through the free
|
||||
software OpenCORE libraries as an alternative to the non-free libamr libraries.
|
||||
|
||||
We found out that libfaac contains non-free parts and is not LGPL as previously
|
||||
claimed. We have changed configure to reflect this. You now have to pass the
|
||||
--enable-nonfree option if you wish to compile with libfaac support enabled.
|
||||
|
||||
Furthermore the non-free bits in libavcodec/fdctref.c have been rewritten. Note
|
||||
well that they were only used in a test program and never compiled into any
|
||||
FFmpeg library.
|
||||
|
||||
|
||||
|
||||
* 0.5.2 May 25, 2010
|
||||
|
||||
General notes
|
||||
-------------
|
||||
|
||||
This is a maintenance only release that addresses a small number of security
|
||||
and portability issues. Distributors and system integrators are encouraged
|
||||
to update and share their patches against this branch.
|
||||
|
||||
|
||||
|
||||
* 0.5.3 Oct 18, 2010
|
||||
|
||||
General notes
|
||||
-------------
|
||||
|
||||
This is (again) another maintenance only release that addresses a fix
|
||||
for seekable HTTP and an exploitable bug in the FLIC decoder
|
||||
(cf. CVE-2010-3429 for details). Distributors and system integrators are
|
||||
encouraged to update and share their patches against this branch.
|
36
cmdutils.c
36
cmdutils.c
@@ -309,14 +309,26 @@ void show_version(void) {
|
||||
|
||||
void show_license(void)
|
||||
{
|
||||
#if CONFIG_NONFREE
|
||||
printf(
|
||||
#if CONFIG_NONFREE
|
||||
"This version of %s has nonfree parts compiled in.\n"
|
||||
"Therefore it is not legally redistributable.\n",
|
||||
program_name
|
||||
);
|
||||
#elif CONFIG_GPLV3
|
||||
"%s is free software; you can redistribute it and/or modify\n"
|
||||
"it under the terms of the GNU General Public License as published by\n"
|
||||
"the Free Software Foundation; either version 3 of the License, or\n"
|
||||
"(at your option) any later version.\n"
|
||||
"\n"
|
||||
"%s is distributed in the hope that it will be useful,\n"
|
||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||||
"GNU General Public License for more details.\n"
|
||||
"\n"
|
||||
"You should have received a copy of the GNU General Public License\n"
|
||||
"along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
|
||||
program_name, program_name, program_name
|
||||
#elif CONFIG_GPL
|
||||
printf(
|
||||
"%s is free software; you can redistribute it and/or modify\n"
|
||||
"it under the terms of the GNU General Public License as published by\n"
|
||||
"the Free Software Foundation; either version 2 of the License, or\n"
|
||||
@@ -331,9 +343,21 @@ void show_license(void)
|
||||
"along with %s; if not, write to the Free Software\n"
|
||||
"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
|
||||
program_name, program_name, program_name
|
||||
);
|
||||
#elif CONFIG_LGPLV3
|
||||
"%s is free software; you can redistribute it and/or modify\n"
|
||||
"it under the terms of the GNU Lesser General Public License as published by\n"
|
||||
"the Free Software Foundation; either version 3 of the License, or\n"
|
||||
"(at your option) any later version.\n"
|
||||
"\n"
|
||||
"%s is distributed in the hope that it will be useful,\n"
|
||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||||
"GNU Lesser General Public License for more details.\n"
|
||||
"\n"
|
||||
"You should have received a copy of the GNU Lesser General Public License\n"
|
||||
"along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
|
||||
program_name, program_name, program_name
|
||||
#else
|
||||
printf(
|
||||
"%s is free software; you can redistribute it and/or\n"
|
||||
"modify it under the terms of the GNU Lesser General Public\n"
|
||||
"License as published by the Free Software Foundation; either\n"
|
||||
@@ -348,8 +372,8 @@ void show_license(void)
|
||||
"License along with %s; if not, write to the Free Software\n"
|
||||
"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
|
||||
program_name, program_name, program_name
|
||||
);
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
void show_formats(void)
|
||||
|
@@ -9,6 +9,7 @@ vpath %.c $(SRC_DIR)
|
||||
vpath %.h $(SRC_DIR)
|
||||
vpath %.S $(SRC_DIR)
|
||||
vpath %.asm $(SRC_DIR)
|
||||
vpath %.v $(SRC_DIR)
|
||||
|
||||
ifeq ($(SRC_DIR),$(SRC_PATH_BARE))
|
||||
BUILD_ROOT_REL = .
|
||||
@@ -43,6 +44,9 @@ CFLAGS := -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
|
||||
|
||||
%$(EXESUF): %.c
|
||||
|
||||
%.ver: %.v
|
||||
sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
|
||||
|
||||
SVN_ENTRIES = $(SRC_PATH_BARE)/.svn/entries
|
||||
ifeq ($(wildcard $(SVN_ENTRIES)),$(SVN_ENTRIES))
|
||||
$(BUILD_ROOT_REL)/version.h: $(SVN_ENTRIES)
|
||||
@@ -77,7 +81,7 @@ checkheaders: $(filter-out %_template.ho,$(ALLHEADERS:.h=.ho))
|
||||
DEPS := $(OBJS:.o=.d)
|
||||
depend dep: $(DEPS)
|
||||
|
||||
CLEANSUFFIXES = *.o *~ *.ho
|
||||
CLEANSUFFIXES = *.o *~ *.ho *.ver
|
||||
LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a *.exp *.map
|
||||
DISTCLEANSUFFIXES = *.d *.pc
|
||||
|
||||
|
133
configure
vendored
133
configure
vendored
@@ -75,13 +75,14 @@ show_help(){
|
||||
echo " --enable-shared build shared libraries [no]"
|
||||
echo " --enable-gpl allow use of GPL code, the resulting libs"
|
||||
echo " and binaries will be under GPL [no]"
|
||||
echo " --enable-version3 upgrade (L)GPL to version 3 [no]"
|
||||
echo " --enable-nonfree allow use of nonfree code, the resulting libs"
|
||||
echo " and binaries will be unredistributable [no]"
|
||||
echo " --disable-ffmpeg disable ffmpeg build"
|
||||
echo " --disable-ffplay disable ffplay build"
|
||||
echo " --disable-ffserver disable ffserver build"
|
||||
echo " --enable-postproc enable GPLed postprocessing support [no]"
|
||||
echo " --enable-swscale enable GPLed software scaler support [no]"
|
||||
echo " --enable-swscale enable software scaler support [no]"
|
||||
echo " --enable-avfilter video filter support (replaces vhook) [no]"
|
||||
echo " --enable-avfilter-lavf video filters dependent on avformat [no]"
|
||||
echo " --disable-vhook disable video hooking support"
|
||||
@@ -102,6 +103,7 @@ show_help(){
|
||||
echo " --disable-golomb disable Golomb code"
|
||||
echo " --disable-mdct disable MDCT code"
|
||||
echo " --disable-rdft disable RDFT code"
|
||||
echo " --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)"
|
||||
echo " --enable-hardcoded-tables use hardcoded tables instead of runtime generation"
|
||||
echo " --enable-memalign-hack emulate memalign, interferes with memory debuggers"
|
||||
echo " --enable-beos-netserver enable BeOS netserver"
|
||||
@@ -148,6 +150,8 @@ show_help(){
|
||||
echo " --enable-bzlib enable bzlib [autodetect]"
|
||||
echo " --enable-libamr-nb enable libamr-nb floating point audio codec [no]"
|
||||
echo " --enable-libamr-wb enable libamr-wb floating point audio codec [no]"
|
||||
echo " --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]"
|
||||
echo " --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]"
|
||||
echo " --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394"
|
||||
echo " and libraw1394 [no]"
|
||||
echo " --enable-libdirac enable Dirac support via libdirac [no]"
|
||||
@@ -257,7 +261,6 @@ Include the log file "$logfile" produced by configure as this will help
|
||||
solving the problem.
|
||||
EOF
|
||||
fi
|
||||
rm -f $TMPC $TMPE $TMPH $TMPO $TMPS $TMPSH
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -563,13 +566,18 @@ int x;
|
||||
EOF
|
||||
}
|
||||
|
||||
check_ldflags(){
|
||||
log check_ldflags "$@"
|
||||
check_ld "$@" <<EOF && add_ldflags "$@"
|
||||
test_ldflags(){
|
||||
log test_ldflags "$@"
|
||||
check_ld "$@" <<EOF
|
||||
int main(void){ return 0; }
|
||||
EOF
|
||||
}
|
||||
|
||||
check_ldflags(){
|
||||
log check_ldflags "$@"
|
||||
test_ldflags "$@" && add_ldflags "$@"
|
||||
}
|
||||
|
||||
check_header(){
|
||||
log check_header "$@"
|
||||
header=$1
|
||||
@@ -779,6 +787,8 @@ CONFIG_LIST="
|
||||
libgsm
|
||||
libmp3lame
|
||||
libnut
|
||||
libopencore_amrnb
|
||||
libopencore_amrwb
|
||||
libopenjpeg
|
||||
libschroedinger
|
||||
libspeex
|
||||
@@ -795,12 +805,14 @@ CONFIG_LIST="
|
||||
postproc
|
||||
powerpc_perf
|
||||
rdft
|
||||
runtime_cpudetect
|
||||
shared
|
||||
small
|
||||
static
|
||||
swscale
|
||||
vdpau
|
||||
vhook
|
||||
version3
|
||||
x11grab
|
||||
zlib
|
||||
"
|
||||
@@ -917,6 +929,8 @@ HAVE_LIST="
|
||||
|
||||
# options emitted with CONFIG_ prefix but not available on command line
|
||||
CONFIG_EXTRA="
|
||||
gplv3
|
||||
lgplv3
|
||||
oldscaler
|
||||
"
|
||||
|
||||
@@ -990,7 +1004,6 @@ oldscaler_deps="!swscale"
|
||||
|
||||
# decoders / encoders
|
||||
aac_decoder_select="fft mdct"
|
||||
ac3_decoder_deps="gpl"
|
||||
ac3_decoder_select="fft mdct"
|
||||
atrac3_decoder_select="fft mdct"
|
||||
cavs_decoder_select="golomb"
|
||||
@@ -999,7 +1012,6 @@ cscd_decoder_suggest="zlib"
|
||||
dca_decoder_select="fft mdct"
|
||||
dnxhd_encoder_select="aandct"
|
||||
dxa_decoder_select="zlib"
|
||||
eac3_decoder_deps="gpl"
|
||||
eac3_decoder_select="fft mdct"
|
||||
eatgq_decoder_select="aandct"
|
||||
eatqi_decoder_select="aandct"
|
||||
@@ -1077,6 +1089,9 @@ libgsm_encoder_deps="libgsm"
|
||||
libgsm_ms_decoder_deps="libgsm"
|
||||
libgsm_ms_encoder_deps="libgsm"
|
||||
libmp3lame_encoder_deps="libmp3lame"
|
||||
libopencore_amrnb_decoder_deps="libopencore_amrnb"
|
||||
libopencore_amrnb_encoder_deps="libopencore_amrnb"
|
||||
libopencore_amrwb_decoder_deps="libopencore_amrwb"
|
||||
libopenjpeg_decoder_deps="libopenjpeg"
|
||||
libschroedinger_decoder_deps="libschroedinger"
|
||||
libschroedinger_encoder_deps="libschroedinger"
|
||||
@@ -1187,7 +1202,7 @@ vhook="default"
|
||||
# build settings
|
||||
add_cflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
|
||||
SHFLAGS='-shared -Wl,-soname,$$(@F)'
|
||||
VHOOKSHFLAGS='$(SHFLAGS)'
|
||||
VHOOKSHFLAGS='-shared -Wl,-soname,$$(@F)'
|
||||
FFSERVERLDFLAGS=-Wl,-E
|
||||
LIBPREF="lib"
|
||||
LIBSUF=".a"
|
||||
@@ -1342,12 +1357,36 @@ esac
|
||||
: ${TMPDIR:=$TMP}
|
||||
: ${TMPDIR:=/tmp}
|
||||
|
||||
TMPC="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.c"
|
||||
TMPE="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}${EXESUF}"
|
||||
TMPH="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.h"
|
||||
TMPO="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.o"
|
||||
TMPS="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.S"
|
||||
TMPSH="${TMPDIR}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.sh"
|
||||
|
||||
if ! check_cmd type mktemp; then
|
||||
# simple replacement for missing mktemp
|
||||
# NOT SAFE FOR GENERAL USE
|
||||
mktemp(){
|
||||
echo "${2%XXX*}.${HOSTNAME}.${UID}.$$"
|
||||
}
|
||||
fi
|
||||
|
||||
|
||||
tmpfile(){
|
||||
tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
|
||||
(set -C; exec > $tmp) 2>/dev/null ||
|
||||
die "Unable to create temoporary file in $TMPDIR."
|
||||
append TMPFILES $tmp
|
||||
eval $1=$tmp
|
||||
}
|
||||
|
||||
trap 'rm -f -- $TMPFILES' EXIT
|
||||
trap exit HUP INT TERM
|
||||
|
||||
tmpfile TMPC .c
|
||||
tmpfile TMPE $EXESUF
|
||||
tmpfile TMPH .h
|
||||
tmpfile TMPO .o
|
||||
tmpfile TMPS .S
|
||||
tmpfile TMPV .ver
|
||||
tmpfile TMPSH .sh
|
||||
|
||||
unset -f mktemp
|
||||
|
||||
# make sure we can execute files in $TMPDIR
|
||||
cat > $TMPSH 2>> $logfile <<EOF
|
||||
@@ -1361,7 +1400,6 @@ variable to another directory and make sure that it is not mounted noexec.
|
||||
EOF
|
||||
die "Sanity test failed."
|
||||
fi
|
||||
rm $TMPSH
|
||||
|
||||
if $cc --version 2>/dev/null | grep -qi gcc; then
|
||||
cc_type=gcc
|
||||
@@ -1572,6 +1610,7 @@ case $target_os in
|
||||
SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
|
||||
objformat="win32"
|
||||
enable dos_paths
|
||||
check_cflags -fno-common
|
||||
if ! enabled x86_64; then
|
||||
check_cpp_condition _mingw.h "(__MINGW32_MAJOR_VERSION > 3) || (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
|
||||
die "ERROR: MinGW runtime version must be >= 3.15."
|
||||
@@ -1596,6 +1635,7 @@ case $target_os in
|
||||
SHFLAGS='-shared -Wl,--enable-auto-image-base'
|
||||
objformat="win32"
|
||||
enable dos_paths
|
||||
check_cflags -fno-common
|
||||
;;
|
||||
*-dos|freedos|opendos)
|
||||
disable ffplay ffserver vhook
|
||||
@@ -1638,6 +1678,11 @@ case $target_os in
|
||||
interix)
|
||||
disable vhook
|
||||
;;
|
||||
gnu/kfreebsd)
|
||||
;;
|
||||
gnu)
|
||||
disable dv1394
|
||||
;;
|
||||
|
||||
*)
|
||||
die "Unknown OS '$target_os'."
|
||||
@@ -1680,23 +1725,24 @@ EOF
|
||||
fi
|
||||
|
||||
|
||||
if ! enabled gpl; then
|
||||
die_gpl_disabled(){
|
||||
name=$1
|
||||
shift
|
||||
enabled_any $@ && die "$name is under GPL and --enable-gpl is not specified."
|
||||
}
|
||||
die_gpl_disabled "The Postprocessing code" postproc
|
||||
die_gpl_disabled "libx264" libx264
|
||||
die_gpl_disabled "libxvidcore" libxvid
|
||||
die_gpl_disabled "FAAD2" libfaad2
|
||||
die_gpl_disabled "The X11 grabber" x11grab
|
||||
die_gpl_disabled "The software scaler" swscale
|
||||
fi
|
||||
die_license_disabled() {
|
||||
enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
|
||||
}
|
||||
|
||||
if ! enabled nonfree && enabled_any libamr_nb libamr_wb; then
|
||||
die "libamr is nonfree and --enable-nonfree is not specified."
|
||||
fi
|
||||
die_license_disabled gpl libfaad2
|
||||
die_license_disabled gpl libx264
|
||||
die_license_disabled gpl libxvid
|
||||
die_license_disabled gpl postproc
|
||||
die_license_disabled gpl x11grab
|
||||
|
||||
die_license_disabled nonfree libamr_nb
|
||||
die_license_disabled nonfree libamr_wb
|
||||
die_license_disabled nonfree libfaac
|
||||
|
||||
die_license_disabled version3 libopencore_amrnb
|
||||
die_license_disabled version3 libopencore_amrwb
|
||||
|
||||
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
|
||||
|
||||
check_deps $ARCH_EXT_LIST
|
||||
|
||||
@@ -1987,13 +2033,15 @@ enabled libfaad && require2 libfaad faad.h faacDecOpen -lfaad
|
||||
enabled libgsm && require libgsm gsm.h gsm_create -lgsm
|
||||
enabled libmp3lame && require libmp3lame lame/lame.h lame_init -lmp3lame -lm
|
||||
enabled libnut && require libnut libnut.h nut_demuxer_init -lnut
|
||||
enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb -lm
|
||||
enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb -lm
|
||||
enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
|
||||
enabled libschroedinger && add_cflags $(pkg-config --cflags schroedinger-1.0) &&
|
||||
require libschroedinger schroedinger/schro.h schro_init $(pkg-config --libs schroedinger-1.0)
|
||||
enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex
|
||||
enabled libtheora && require libtheora theora/theora.h theora_info_init -ltheora -logg
|
||||
enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
|
||||
enabled libx264 && require libx264 x264.h x264_encoder_open -lx264 -lm &&
|
||||
enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 -lm &&
|
||||
{ check_cpp_condition x264.h "X264_BUILD >= 65" ||
|
||||
die "ERROR: libx264 version must be >= 0.65."; }
|
||||
enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore
|
||||
@@ -2146,6 +2194,10 @@ check_ldflags -Wl,--as-needed
|
||||
check_ldflags '-Wl,-rpath-link,\$(BUILD_ROOT)/libpostproc -Wl,-rpath-link,\$(BUILD_ROOT)/libswscale -Wl,-rpath-link,\$(BUILD_ROOT)/libavfilter -Wl,-rpath-link,\$(BUILD_ROOT)/libavdevice -Wl,-rpath-link,\$(BUILD_ROOT)/libavformat -Wl,-rpath-link,\$(BUILD_ROOT)/libavcodec -Wl,-rpath-link,\$(BUILD_ROOT)/libavutil'
|
||||
check_ldflags -Wl,-Bsymbolic
|
||||
|
||||
echo "X{};" > $TMPV
|
||||
test_ldflags -Wl,--version-script,$TMPV &&
|
||||
append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
|
||||
|
||||
if enabled small; then
|
||||
check_cflags -Os # not all compilers support -Os
|
||||
optimizations="small"
|
||||
@@ -2191,7 +2243,7 @@ if enabled shared; then
|
||||
# LIBOBJFLAGS may have already been set in the OS configuration
|
||||
if test -z "$LIBOBJFLAGS" ; then
|
||||
case "${subarch-$arch}" in
|
||||
x86_64|ia64|alpha|sparc*|power*|parisc*|mips*) LIBOBJFLAGS='$(PIC)' ;;
|
||||
x86_64|ia64|alpha|sparc*|ppc|power*|parisc*|mips*) LIBOBJFLAGS='$(PIC)' ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
@@ -2244,6 +2296,7 @@ if test "$extra_version" != ""; then
|
||||
echo "version string suffix $extra_version"
|
||||
fi
|
||||
echo "big-endian ${bigendian-no}"
|
||||
echo "runtime cpu detection ${runtime_cpudetect-no}"
|
||||
if enabled x86; then
|
||||
echo "yasm ${yasm-no}"
|
||||
echo "MMX enabled ${mmx-no}"
|
||||
@@ -2314,6 +2367,8 @@ echo "libfaad dlopened ${libfaadbin-no}"
|
||||
echo "libgsm enabled ${libgsm-no}"
|
||||
echo "libmp3lame enabled ${libmp3lame-no}"
|
||||
echo "libnut enabled ${libnut-no}"
|
||||
echo "libopencore-amrnb support ${libopencore_amrnb-no}"
|
||||
echo "libopencore-amrwb support ${libopencore_amrwb-no}"
|
||||
echo "libopenjpeg enabled ${libopenjpeg-no}"
|
||||
echo "libschroedinger enabled ${libschroedinger-no}"
|
||||
echo "libspeex enabled ${libspeex-no}"
|
||||
@@ -2335,11 +2390,15 @@ for type in decoder encoder parser demuxer muxer protocol filter bsf indev outde
|
||||
echo
|
||||
done
|
||||
|
||||
license="LGPL"
|
||||
license="LGPL version 2.1 or later"
|
||||
if enabled nonfree; then
|
||||
license="unredistributable"
|
||||
license="nonfree and unredistributable"
|
||||
elif enabled gplv3; then
|
||||
license="GPL version 3 or later"
|
||||
elif enabled lgplv3; then
|
||||
license="LGPL version 3 or later"
|
||||
elif enabled gpl; then
|
||||
license="GPL"
|
||||
license="GPL version 2 or later"
|
||||
fi
|
||||
|
||||
echo "License: $license"
|
||||
@@ -2484,8 +2543,6 @@ cmp -s $TMPH config.h &&
|
||||
echo "config.h is unchanged" ||
|
||||
mv -f $TMPH config.h
|
||||
|
||||
rm -f $TMPC $TMPE $TMPH $TMPO $TMPS $TMPSH
|
||||
|
||||
# build tree in object directory if source path is different from current one
|
||||
if enabled source_path_used; then
|
||||
DIRS="\
|
||||
|
@@ -1,3 +1,11 @@
|
||||
20090601 - r19025 - lavc 52.30.0 - av_lockmgr_register()
|
||||
av_lockmgr_register() can be used to register a callback function
|
||||
that lavc (and in the future, libraries that depend on lavc) can use
|
||||
to implement mutexes. The application should provide a callback function
|
||||
the implements the AV_LOCK_* operations described in avcodec.h.
|
||||
When the lock manager is registered FFmpeg is guaranteed to behave
|
||||
correct also in a multi-threaded application.
|
||||
|
||||
20090301 - r17682 - lavf 52.31.0 - Generic metadata API
|
||||
This version introduce a new metadata API (see av_metadata_get() and friends).
|
||||
The old API is now deprecated and shouldn't be used anymore. This especially
|
||||
|
1
doc/TODO
1
doc/TODO
@@ -81,7 +81,6 @@ unassigned TODO: (unordered)
|
||||
- add support for using mplayers video filters to ffmpeg
|
||||
- H264 encoder
|
||||
- per MB ratecontrol (so VCD and such do work better)
|
||||
- replace/rewrite libavcodec/fdctref.c
|
||||
- write a script which iteratively changes all functions between always_inline and noinline and benchmarks the result to find the best set of inlined functions
|
||||
- convert all the non SIMD asm into small asm vs. C testcases and submit them to the gcc devels so they can improve gcc
|
||||
- generic audio mixing API
|
||||
|
@@ -141,8 +141,9 @@ to get the desired audio language.
|
||||
|
||||
NOTE: To see the supported input formats, use @code{ffmpeg -formats}.
|
||||
|
||||
* You can extract images from a video:
|
||||
* You can extract images from a video, or create a video from many images:
|
||||
|
||||
For extracting images from a video:
|
||||
@example
|
||||
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
|
||||
@end example
|
||||
@@ -151,15 +152,20 @@ This will extract one video frame per second from the video and will
|
||||
output them in files named @file{foo-001.jpeg}, @file{foo-002.jpeg},
|
||||
etc. Images will be rescaled to fit the new WxH values.
|
||||
|
||||
If you want to extract just a limited number of frames, you can use the
|
||||
above command in combination with the -vframes or -t option, or in
|
||||
combination with -ss to start extracting from a certain point in time.
|
||||
|
||||
For creating a video from many images:
|
||||
@example
|
||||
ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi
|
||||
@end example
|
||||
|
||||
The syntax @code{foo-%03d.jpeg} specifies to use a decimal number
|
||||
composed of three digits padded with zeroes to express the sequence
|
||||
number. It is the same syntax supported by the C printf function, but
|
||||
only formats accepting a normal integer are suitable.
|
||||
|
||||
If you want to extract just a limited number of frames, you can use the
|
||||
above command in combination with the -vframes or -t option, or in
|
||||
combination with -ss to start extracting from a certain point in time.
|
||||
|
||||
* You can put many streams of the same type in the output:
|
||||
|
||||
@example
|
||||
@@ -276,29 +282,16 @@ The offset is added to the timestamps of the input files.
|
||||
Specifying a positive offset means that the corresponding
|
||||
streams are delayed by 'offset' seconds.
|
||||
|
||||
@item -title @var{string}
|
||||
Set the title.
|
||||
|
||||
@item -timestamp @var{time}
|
||||
Set the timestamp.
|
||||
|
||||
@item -author @var{string}
|
||||
Set the author.
|
||||
@item -metadata @var{key}=@var{value}
|
||||
Set a metadata key/value pair.
|
||||
|
||||
@item -copyright @var{string}
|
||||
Set the copyright.
|
||||
|
||||
@item -comment @var{string}
|
||||
Set the comment.
|
||||
|
||||
@item -album @var{string}
|
||||
Set the album.
|
||||
|
||||
@item -track @var{number}
|
||||
Set the track.
|
||||
|
||||
@item -year @var{number}
|
||||
Set the year.
|
||||
For example, for setting the title in the output file:
|
||||
@example
|
||||
ffmpeg -i in.avi -metadata title="my title" out.flv
|
||||
@end example
|
||||
|
||||
@item -v @var{number}
|
||||
Set the logging verbosity level.
|
||||
@@ -687,6 +680,8 @@ Set the number of audio frames to record.
|
||||
Set the audio sampling frequency (default = 44100 Hz).
|
||||
@item -ab @var{bitrate}
|
||||
Set the audio bitrate in bit/s (default = 64k).
|
||||
@item -aq @var{q}
|
||||
Set the audio quality (codec-specific, VBR).
|
||||
@item -ac @var{channels}
|
||||
Set the number of audio channels (default = 1).
|
||||
@item -an
|
||||
@@ -728,6 +723,8 @@ Force subtitle codec ('copy' to copy stream).
|
||||
Add a new subtitle stream to the current output stream.
|
||||
@item -slang @var{code}
|
||||
Set the ISO 639 language code (3 letters) of the current subtitle stream.
|
||||
@item -sn
|
||||
Disable subtitle recording.
|
||||
@item -sbsf @var{bitstream_filter}
|
||||
Bitstream filters available are "mov2textsub", "text2movsub".
|
||||
@example
|
||||
|
@@ -18,7 +18,22 @@ explicitly requested by passing the appropriate flags to @file{./configure}.
|
||||
|
||||
AMR comes in two different flavors, wideband and narrowband. FFmpeg can make
|
||||
use of the AMR wideband (floating-point mode) and the AMR narrowband
|
||||
(floating-point mode) reference decoders and encoders.
|
||||
(floating-point mode) reference decoders and encoders (libamr) as well as
|
||||
the OpenCORE libraries for AMR-NB decoding/encoding and AMR-WB decoding.
|
||||
|
||||
@subsection OpenCORE
|
||||
|
||||
Go to @url{http://gitorious.org/opencore-amr/} and follow the instructions for
|
||||
installing the libraries. Then pass @code{--enable-libopencore-amrnb} and/or
|
||||
@code{--enable-libopencore-amrwb} to configure to enable the libraries.
|
||||
|
||||
Note that OpenCORE is under the Apache License 2.0 (see
|
||||
@url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
|
||||
incompatible with the LGPL version 2.1 and GPL version 2. You have to
|
||||
upgrade FFmpeg's license to LGPL version 3 (or if you have enabled
|
||||
GPL components, GPL version 3) to use it.
|
||||
|
||||
@subsection libamr
|
||||
|
||||
Go to @url{http://www.penguin.cz/~utx/amr} and follow the instructions for
|
||||
installing the libraries. Then pass @code{--enable-libamr-nb} and/or
|
||||
@@ -511,9 +526,10 @@ following image formats are supported:
|
||||
@tab Used in Westwood Studios games like Command and Conquer.
|
||||
@item ADPCM Yamaha @tab X @tab X
|
||||
@item AMR-NB @tab E @tab E
|
||||
@tab supported through external library libamrnb
|
||||
@tab supported through external libraries libamrnb and libopencore-amrnb
|
||||
@item AMR-WB @tab E @tab E
|
||||
@tab supported through external library libamrwb
|
||||
@tab decoding supported through external libraries libamrwb and libopencore-amrwb,
|
||||
encoding supported through external library libamrwb
|
||||
@item Apple lossless audio @tab X @tab X
|
||||
@tab QuickTime fourcc 'alac'
|
||||
@item Atrac 3 @tab @tab X
|
||||
|
5
ffmpeg.c
5
ffmpeg.c
@@ -2102,10 +2102,7 @@ static int av_encode(AVFormatContext **output_files,
|
||||
|
||||
/* read a frame from it and output it in the fifo */
|
||||
is = input_files[file_index];
|
||||
ret= av_read_frame(is, &pkt);
|
||||
if(ret == AVERROR(EAGAIN) && strcmp(is->iformat->name, "ffm"))
|
||||
continue;
|
||||
if (ret < 0) {
|
||||
if (av_read_frame(is, &pkt) < 0) {
|
||||
file_table[file_index].eof_reached = 1;
|
||||
if (opt_shortest)
|
||||
break;
|
||||
|
@@ -1,3 +1,4 @@
|
||||
coder=0
|
||||
bf=0
|
||||
flags2=-wpred-dct8x8
|
||||
flags2=-wpred-dct8x8+mbtree
|
||||
wpredp=0
|
||||
|
@@ -3,7 +3,7 @@ flags=+loop
|
||||
cmp=+chroma
|
||||
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
|
||||
me_method=hex
|
||||
subq=6
|
||||
subq=7
|
||||
me_range=16
|
||||
g=250
|
||||
keyint_min=25
|
||||
@@ -14,5 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=3
|
||||
refs=3
|
||||
directpred=1
|
||||
flags2=+fastpskip
|
||||
trellis=1
|
||||
flags2=+mixed_refs+wpred+dct8x8+fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -3,7 +3,7 @@ flags=+loop
|
||||
cmp=+chroma
|
||||
partitions=-parti8x8-parti4x4-partp8x8-partp4x4-partb8x8
|
||||
me_method=dia
|
||||
subq=1
|
||||
subq=2
|
||||
me_range=16
|
||||
g=250
|
||||
keyint_min=25
|
||||
@@ -14,8 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=4
|
||||
bf=3
|
||||
refs=1
|
||||
directpred=3
|
||||
trellis=0
|
||||
flags2=-bpyramid-wpred-mixed_refs-dct8x8+fastpskip
|
||||
flags2=-bpyramid-wpred-mixed_refs-dct8x8+fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -14,8 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=4
|
||||
bf=3
|
||||
refs=4
|
||||
directpred=3
|
||||
trellis=1
|
||||
flags2=+bpyramid+wpred+mixed_refs+dct8x8+fastpskip
|
||||
flags2=+wpred+mixed_refs+dct8x8+fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -1,6 +1,7 @@
|
||||
coder=0
|
||||
bf=0
|
||||
flags2=-wpred-dct8x8
|
||||
flags2=-wpred-dct8x8+mbtree
|
||||
level=13
|
||||
maxrate=768000
|
||||
bufsize=3000000
|
||||
wpredp=0
|
||||
|
@@ -1,7 +1,8 @@
|
||||
coder=0
|
||||
bf=0
|
||||
refs=1
|
||||
flags2=-wpred-dct8x8
|
||||
flags2=-wpred-dct8x8+mbtree
|
||||
level=30
|
||||
maxrate=10000000
|
||||
bufsize=10000000
|
||||
wpredp=0
|
||||
|
@@ -15,5 +15,6 @@ qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
directpred=1
|
||||
flags2=+fastpskip
|
||||
flags2=+fastpskip+mbtree
|
||||
cqp=0
|
||||
wpredp=0
|
||||
|
@@ -16,5 +16,6 @@ qmax=51
|
||||
qdiff=4
|
||||
refs=16
|
||||
directpred=1
|
||||
flags2=+mixed_refs+dct8x8+fastpskip
|
||||
flags2=+mixed_refs+dct8x8+fastpskip+mbtree
|
||||
cqp=0
|
||||
wpredp=2
|
||||
|
@@ -15,5 +15,6 @@ qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
directpred=1
|
||||
flags2=+fastpskip
|
||||
flags2=+fastpskip+mbtree
|
||||
cqp=0
|
||||
wpredp=2
|
||||
|
@@ -16,5 +16,6 @@ qmax=51
|
||||
qdiff=4
|
||||
refs=2
|
||||
directpred=1
|
||||
flags2=+dct8x8+fastpskip
|
||||
flags2=+dct8x8+fastpskip+mbtree
|
||||
cqp=0
|
||||
wpredp=2
|
||||
|
@@ -16,5 +16,6 @@ qmax=51
|
||||
qdiff=4
|
||||
refs=4
|
||||
directpred=1
|
||||
flags2=+mixed_refs+dct8x8+fastpskip
|
||||
flags2=+mixed_refs+dct8x8+fastpskip+mbtree
|
||||
cqp=0
|
||||
wpredp=2
|
||||
|
@@ -15,5 +15,5 @@ qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
directpred=1
|
||||
flags2=+fastpskip
|
||||
flags2=+fastpskip+mbtree
|
||||
cqp=0
|
||||
|
@@ -1 +1 @@
|
||||
flags2=-dct8x8
|
||||
flags2=-dct8x8+mbtree
|
||||
|
@@ -3,8 +3,8 @@ flags=+loop
|
||||
cmp=+chroma
|
||||
partitions=+parti8x8+parti4x4+partp8x8+partp4x4+partb8x8
|
||||
me_method=tesa
|
||||
subq=9
|
||||
me_range=32
|
||||
subq=10
|
||||
me_range=24
|
||||
g=250
|
||||
keyint_min=25
|
||||
sc_threshold=40
|
||||
@@ -14,8 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=4
|
||||
bf=3
|
||||
refs=16
|
||||
directpred=3
|
||||
trellis=2
|
||||
flags2=+bpyramid+wpred+mixed_refs+dct8x8-fastpskip
|
||||
flags2=+wpred+mixed_refs+dct8x8-fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -14,8 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=4
|
||||
bf=3
|
||||
refs=2
|
||||
directpred=3
|
||||
trellis=0
|
||||
flags2=+bpyramid+wpred+dct8x8+fastpskip
|
||||
flags2=+wpred+dct8x8+fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -14,8 +14,9 @@ qcomp=0.6
|
||||
qmin=10
|
||||
qmax=51
|
||||
qdiff=4
|
||||
bf=4
|
||||
bf=3
|
||||
refs=1
|
||||
directpred=3
|
||||
trellis=0
|
||||
flags2=+bpyramid+wpred+dct8x8+fastpskip
|
||||
flags2=+wpred+dct8x8+fastpskip+mbtree
|
||||
wpredp=2
|
||||
|
@@ -366,6 +366,8 @@ OBJS-$(CONFIG_LIBFAAC) += libfaac.o
|
||||
OBJS-$(CONFIG_LIBFAAD) += libfaad.o
|
||||
OBJS-$(CONFIG_LIBGSM) += libgsm.o
|
||||
OBJS-$(CONFIG_LIBMP3LAME) += libmp3lame.o
|
||||
OBJS-$(CONFIG_LIBOPENCORE_AMRNB) += libopencore-amr.o
|
||||
OBJS-$(CONFIG_LIBOPENCORE_AMRWB) += libopencore-amr.o
|
||||
OBJS-$(CONFIG_LIBOPENJPEG) += libopenjpeg.o
|
||||
OBJS-$(CONFIG_LIBSCHROEDINGER_DECODER) += libschroedingerdec.o libschroedinger.o libdirac_libschro.o
|
||||
OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER) += libschroedingerenc.o libschroedinger.o libdirac_libschro.o
|
||||
@@ -533,5 +535,4 @@ DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86
|
||||
|
||||
include $(SUBDIR)../subdir.mak
|
||||
|
||||
$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)fdctref.o $(SUBDIR)aandcttab.o
|
||||
$(SUBDIR)fft-test$(EXESUF): $(SUBDIR)fdctref.o
|
||||
$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)aandcttab.o
|
||||
|
100
libavcodec/aac.c
100
libavcodec/aac.c
@@ -97,6 +97,56 @@ static VLC vlc_scalefactors;
|
||||
static VLC vlc_spectral[11];
|
||||
|
||||
|
||||
static ChannelElement* get_che(AACContext *ac, int type, int elem_id) {
|
||||
static const int8_t tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
if (ac->tag_che_map[type][elem_id]) {
|
||||
return ac->tag_che_map[type][elem_id];
|
||||
}
|
||||
if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) {
|
||||
return NULL;
|
||||
}
|
||||
switch (ac->m4ac.chan_config) {
|
||||
case 7:
|
||||
if (ac->tags_mapped == 3 && type == TYPE_CPE) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2];
|
||||
}
|
||||
case 6:
|
||||
/* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1]
|
||||
instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have
|
||||
encountered such a stream, transfer the LFE[0] element to SCE[1] */
|
||||
if (ac->tags_mapped == tags_per_config[ac->m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0];
|
||||
}
|
||||
case 5:
|
||||
if (ac->tags_mapped == 2 && type == TYPE_CPE) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1];
|
||||
}
|
||||
case 4:
|
||||
if (ac->tags_mapped == 2 && ac->m4ac.chan_config == 4 && type == TYPE_SCE) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1];
|
||||
}
|
||||
case 3:
|
||||
case 2:
|
||||
if (ac->tags_mapped == (ac->m4ac.chan_config != 2) && type == TYPE_CPE) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0];
|
||||
} else if (ac->m4ac.chan_config == 2) {
|
||||
return NULL;
|
||||
}
|
||||
case 1:
|
||||
if (!ac->tags_mapped && type == TYPE_SCE) {
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0];
|
||||
}
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure output channel order based on the current program configuration element.
|
||||
*
|
||||
@@ -106,7 +156,7 @@ static VLC vlc_spectral[11];
|
||||
* @return Returns error status. 0 - OK, !0 - error
|
||||
*/
|
||||
static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_ELEM_ID],
|
||||
enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]) {
|
||||
enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], int channel_config) {
|
||||
AVCodecContext *avctx = ac->avccontext;
|
||||
int i, type, channels = 0;
|
||||
|
||||
@@ -140,7 +190,16 @@ static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_
|
||||
}
|
||||
}
|
||||
|
||||
if (channel_config) {
|
||||
memset(ac->tag_che_map, 0, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
|
||||
ac->tags_mapped = 0;
|
||||
} else {
|
||||
memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
|
||||
ac->tags_mapped = 4*MAX_ELEM_ID;
|
||||
}
|
||||
|
||||
avctx->channels = channels;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -286,7 +345,7 @@ static int decode_ga_specific_config(AACContext * ac, GetBitContext * gb, int ch
|
||||
if((ret = set_default_channel_config(ac, new_che_pos, channel_config)))
|
||||
return ret;
|
||||
}
|
||||
if((ret = output_configure(ac, ac->che_pos, new_che_pos)))
|
||||
if((ret = output_configure(ac, ac->che_pos, new_che_pos, channel_config)))
|
||||
return ret;
|
||||
|
||||
if (extension_flag) {
|
||||
@@ -394,7 +453,7 @@ static av_cold int aac_decode_init(AVCodecContext * avccontext) {
|
||||
memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
|
||||
if(set_default_channel_config(ac, new_che_pos, avccontext->channels - (avccontext->channels == 8)))
|
||||
return -1;
|
||||
if(output_configure(ac, ac->che_pos, new_che_pos))
|
||||
if(output_configure(ac, ac->che_pos, new_che_pos, 1))
|
||||
return -1;
|
||||
ac->m4ac.sample_rate = avccontext->sample_rate;
|
||||
} else {
|
||||
@@ -1538,19 +1597,20 @@ static int parse_adts_frame_header(AACContext * ac, GetBitContext * gb) {
|
||||
ac->m4ac.sample_rate = hdr_info.sample_rate;
|
||||
ac->m4ac.sampling_index = hdr_info.sampling_index;
|
||||
ac->m4ac.object_type = hdr_info.object_type;
|
||||
}
|
||||
if (hdr_info.num_aac_frames == 1) {
|
||||
if (!hdr_info.crc_absent)
|
||||
skip_bits(gb, 16);
|
||||
} else {
|
||||
ff_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0);
|
||||
return -1;
|
||||
if (hdr_info.num_aac_frames == 1) {
|
||||
if (!hdr_info.crc_absent)
|
||||
skip_bits(gb, 16);
|
||||
} else {
|
||||
ff_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data_size, const uint8_t * buf, int buf_size) {
|
||||
AACContext * ac = avccontext->priv_data;
|
||||
ChannelElement * che = NULL;
|
||||
GetBitContext gb;
|
||||
enum RawDataBlockType elem_type;
|
||||
int err, elem_id, data_size_tmp;
|
||||
@@ -1573,15 +1633,7 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data
|
||||
elem_id = get_bits(&gb, 4);
|
||||
err = -1;
|
||||
|
||||
if(elem_type == TYPE_SCE && elem_id == 1 &&
|
||||
!ac->che[TYPE_SCE][elem_id] && ac->che[TYPE_LFE][0]) {
|
||||
/* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1]
|
||||
instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have
|
||||
encountered such a stream, transfer the LFE[0] element to SCE[1] */
|
||||
ac->che[TYPE_SCE][elem_id] = ac->che[TYPE_LFE][0];
|
||||
ac->che[TYPE_LFE][0] = NULL;
|
||||
}
|
||||
if(elem_type < TYPE_DSE && !ac->che[elem_type][elem_id]) {
|
||||
if(elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) {
|
||||
av_log(ac->avccontext, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id);
|
||||
return -1;
|
||||
}
|
||||
@@ -1589,19 +1641,19 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data
|
||||
switch (elem_type) {
|
||||
|
||||
case TYPE_SCE:
|
||||
err = decode_ics(ac, &ac->che[TYPE_SCE][elem_id]->ch[0], &gb, 0, 0);
|
||||
err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
|
||||
break;
|
||||
|
||||
case TYPE_CPE:
|
||||
err = decode_cpe(ac, &gb, ac->che[TYPE_CPE][elem_id]);
|
||||
err = decode_cpe(ac, &gb, che);
|
||||
break;
|
||||
|
||||
case TYPE_CCE:
|
||||
err = decode_cce(ac, &gb, ac->che[TYPE_CCE][elem_id]);
|
||||
err = decode_cce(ac, &gb, che);
|
||||
break;
|
||||
|
||||
case TYPE_LFE:
|
||||
err = decode_ics(ac, &ac->che[TYPE_LFE][elem_id]->ch[0], &gb, 0, 0);
|
||||
err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
|
||||
break;
|
||||
|
||||
case TYPE_DSE:
|
||||
@@ -1615,7 +1667,7 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data
|
||||
memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
|
||||
if((err = decode_pce(ac, new_che_pos, &gb)))
|
||||
break;
|
||||
err = output_configure(ac, ac->che_pos, new_che_pos);
|
||||
err = output_configure(ac, ac->che_pos, new_che_pos, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -260,6 +260,8 @@ typedef struct {
|
||||
* first index as the first 4 raw data block types
|
||||
*/
|
||||
ChannelElement * che[4][MAX_ELEM_ID];
|
||||
ChannelElement * tag_che_map[4][MAX_ELEM_ID];
|
||||
int tags_mapped;
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@@ -7,24 +7,19 @@
|
||||
* Copyright (c) 2007-2008 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
|
||||
* Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com>
|
||||
*
|
||||
* Portions of this code are derived from liba52
|
||||
* http://liba52.sourceforge.net
|
||||
* Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
|
||||
* Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg 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
|
||||
* General Public License for more details.
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
@@ -438,12 +433,12 @@ static void calc_transform_coeffs_cpl(AC3DecodeContext *s)
|
||||
* Grouped mantissas for 3-level 5-level and 11-level quantization
|
||||
*/
|
||||
typedef struct {
|
||||
int b1_mant[3];
|
||||
int b2_mant[3];
|
||||
int b4_mant[2];
|
||||
int b1ptr;
|
||||
int b2ptr;
|
||||
int b4ptr;
|
||||
int b1_mant[2];
|
||||
int b2_mant[2];
|
||||
int b4_mant;
|
||||
int b1;
|
||||
int b2;
|
||||
int b4;
|
||||
} mant_groups;
|
||||
|
||||
/**
|
||||
@@ -452,73 +447,72 @@ typedef struct {
|
||||
*/
|
||||
static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, mant_groups *m)
|
||||
{
|
||||
int start_freq = s->start_freq[ch_index];
|
||||
int end_freq = s->end_freq[ch_index];
|
||||
uint8_t *baps = s->bap[ch_index];
|
||||
int8_t *exps = s->dexps[ch_index];
|
||||
int *coeffs = s->fixed_coeffs[ch_index];
|
||||
GetBitContext *gbc = &s->gbc;
|
||||
int i, gcode, tbap, start, end;
|
||||
uint8_t *exps;
|
||||
uint8_t *bap;
|
||||
int *coeffs;
|
||||
int freq;
|
||||
|
||||
exps = s->dexps[ch_index];
|
||||
bap = s->bap[ch_index];
|
||||
coeffs = s->fixed_coeffs[ch_index];
|
||||
start = s->start_freq[ch_index];
|
||||
end = s->end_freq[ch_index];
|
||||
|
||||
for (i = start; i < end; i++) {
|
||||
tbap = bap[i];
|
||||
switch (tbap) {
|
||||
for(freq = start_freq; freq < end_freq; freq++){
|
||||
int bap = baps[freq];
|
||||
int mantissa;
|
||||
switch(bap){
|
||||
case 0:
|
||||
coeffs[i] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
|
||||
mantissa = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if(m->b1ptr > 2) {
|
||||
gcode = get_bits(gbc, 5);
|
||||
m->b1_mant[0] = b1_mantissas[gcode][0];
|
||||
m->b1_mant[1] = b1_mantissas[gcode][1];
|
||||
m->b1_mant[2] = b1_mantissas[gcode][2];
|
||||
m->b1ptr = 0;
|
||||
if(m->b1){
|
||||
m->b1--;
|
||||
mantissa = m->b1_mant[m->b1];
|
||||
}
|
||||
else{
|
||||
int bits = get_bits(gbc, 5);
|
||||
mantissa = b1_mantissas[bits][0];
|
||||
m->b1_mant[1] = b1_mantissas[bits][1];
|
||||
m->b1_mant[0] = b1_mantissas[bits][2];
|
||||
m->b1 = 2;
|
||||
}
|
||||
coeffs[i] = m->b1_mant[m->b1ptr++];
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if(m->b2ptr > 2) {
|
||||
gcode = get_bits(gbc, 7);
|
||||
m->b2_mant[0] = b2_mantissas[gcode][0];
|
||||
m->b2_mant[1] = b2_mantissas[gcode][1];
|
||||
m->b2_mant[2] = b2_mantissas[gcode][2];
|
||||
m->b2ptr = 0;
|
||||
if(m->b2){
|
||||
m->b2--;
|
||||
mantissa = m->b2_mant[m->b2];
|
||||
}
|
||||
else{
|
||||
int bits = get_bits(gbc, 7);
|
||||
mantissa = b2_mantissas[bits][0];
|
||||
m->b2_mant[1] = b2_mantissas[bits][1];
|
||||
m->b2_mant[0] = b2_mantissas[bits][2];
|
||||
m->b2 = 2;
|
||||
}
|
||||
coeffs[i] = m->b2_mant[m->b2ptr++];
|
||||
break;
|
||||
|
||||
case 3:
|
||||
coeffs[i] = b3_mantissas[get_bits(gbc, 3)];
|
||||
mantissa = b3_mantissas[get_bits(gbc, 3)];
|
||||
break;
|
||||
|
||||
case 4:
|
||||
if(m->b4ptr > 1) {
|
||||
gcode = get_bits(gbc, 7);
|
||||
m->b4_mant[0] = b4_mantissas[gcode][0];
|
||||
m->b4_mant[1] = b4_mantissas[gcode][1];
|
||||
m->b4ptr = 0;
|
||||
if(m->b4){
|
||||
m->b4 = 0;
|
||||
mantissa = m->b4_mant;
|
||||
}
|
||||
else{
|
||||
int bits = get_bits(gbc, 7);
|
||||
mantissa = b4_mantissas[bits][0];
|
||||
m->b4_mant = b4_mantissas[bits][1];
|
||||
m->b4 = 1;
|
||||
}
|
||||
coeffs[i] = m->b4_mant[m->b4ptr++];
|
||||
break;
|
||||
|
||||
case 5:
|
||||
coeffs[i] = b5_mantissas[get_bits(gbc, 4)];
|
||||
mantissa = b5_mantissas[get_bits(gbc, 4)];
|
||||
break;
|
||||
|
||||
default: {
|
||||
/* asymmetric dequantization */
|
||||
int qlevel = quantization_tab[tbap];
|
||||
coeffs[i] = get_sbits(gbc, qlevel) << (24 - qlevel);
|
||||
default: /* 6 to 15 */
|
||||
mantissa = get_bits(gbc, quantization_tab[bap]);
|
||||
/* Shift mantissa and sign-extend it. */
|
||||
mantissa = (mantissa << (32-quantization_tab[bap]))>>8;
|
||||
break;
|
||||
}
|
||||
}
|
||||
coeffs[i] >>= exps[i];
|
||||
coeffs[freq] = mantissa >> exps[freq];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +575,7 @@ static void decode_transform_coeffs(AC3DecodeContext *s, int blk)
|
||||
int got_cplchan = 0;
|
||||
mant_groups m;
|
||||
|
||||
m.b1ptr = m.b2ptr = m.b4ptr = 3;
|
||||
m.b1 = m.b2 = m.b4 = 0;
|
||||
|
||||
for (ch = 1; ch <= s->channels; ch++) {
|
||||
/* transform coefficients for full-bandwidth channel */
|
||||
|
@@ -294,6 +294,8 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCDEC (LIBGSM, libgsm);
|
||||
REGISTER_ENCDEC (LIBGSM_MS, libgsm_ms);
|
||||
REGISTER_ENCODER (LIBMP3LAME, libmp3lame);
|
||||
REGISTER_ENCDEC (LIBOPENCORE_AMRNB, libopencore_amrnb);
|
||||
REGISTER_DECODER (LIBOPENCORE_AMRWB, libopencore_amrwb);
|
||||
REGISTER_DECODER (LIBOPENJPEG, libopenjpeg);
|
||||
REGISTER_ENCDEC (LIBSCHROEDINGER, libschroedinger);
|
||||
REGISTER_DECODER (LIBSPEEX, libspeex);
|
||||
|
@@ -31,7 +31,7 @@
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 52
|
||||
#define LIBAVCODEC_VERSION_MINOR 20
|
||||
#define LIBAVCODEC_VERSION_MICRO 0
|
||||
#define LIBAVCODEC_VERSION_MICRO 1
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||
LIBAVCODEC_VERSION_MINOR, \
|
||||
@@ -501,6 +501,7 @@ typedef struct RcOverride{
|
||||
#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
|
||||
#define CODEC_FLAG2_NON_LINEAR_QUANT 0x00010000 ///< Use MPEG-2 nonlinear quantizer.
|
||||
#define CODEC_FLAG2_BIT_RESERVOIR 0x00020000 ///< Use a bit reservoir when encoding if possible
|
||||
#define CODEC_FLAG2_MBTREE 0x00040000 ///< Use macroblock tree ratecontrol (x264 only)
|
||||
|
||||
/* Unsupported options :
|
||||
* Syntax Arithmetic coding (SAC)
|
||||
@@ -2332,6 +2333,16 @@ typedef struct AVCodecContext {
|
||||
* Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
|
||||
*/
|
||||
int ticks_per_frame;
|
||||
|
||||
/**
|
||||
* explicit P-frame weighted prediction analysis method
|
||||
* 0: off
|
||||
* 1: fast blind weighting (one reference duplicate with -1 offset)
|
||||
* 2: smart weighting (full fade detection analysis)
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
int weighted_p_pred;
|
||||
} AVCodecContext;
|
||||
|
||||
/**
|
||||
@@ -3344,4 +3355,30 @@ void av_register_hwaccel(AVHWAccel *hwaccel);
|
||||
*/
|
||||
AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel);
|
||||
|
||||
|
||||
/**
|
||||
* Lock operation used by lockmgr
|
||||
*/
|
||||
enum AVLockOp {
|
||||
AV_LOCK_CREATE, ///< Create a mutex
|
||||
AV_LOCK_OBTAIN, ///< Lock the mutex
|
||||
AV_LOCK_RELEASE, ///< Unlock the mutex
|
||||
AV_LOCK_DESTROY, ///< Free mutex resources
|
||||
};
|
||||
|
||||
/**
|
||||
* Register a user provided lock manager supporting the operations
|
||||
* specified by AVLockOp. \p mutex points to a (void *) where the
|
||||
* lockmgr should store/get a pointer to a user allocated mutex. It's
|
||||
* NULL upon AV_LOCK_CREATE and != NULL for all other ops.
|
||||
*
|
||||
* @param cb User defined callback. Note: FFmpeg may invoke calls to this
|
||||
* callback during the call to av_lockmgr_register().
|
||||
* Thus, the application must be prepared to handle that.
|
||||
* If cb is set to NULL the lockmgr will be unregistered.
|
||||
* Also note that during unregistration the previously registered
|
||||
* lockmgr callback may also be invoked.
|
||||
*/
|
||||
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
|
||||
|
||||
#endif /* AVCODEC_AVCODEC_H */
|
||||
|
@@ -46,9 +46,9 @@
|
||||
void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
|
||||
|
||||
/* reference fdct/idct */
|
||||
void fdct(DCTELEM *block);
|
||||
void idct(DCTELEM *block);
|
||||
void init_fdct(void);
|
||||
void ff_ref_fdct(DCTELEM *block);
|
||||
void ff_ref_idct(DCTELEM *block);
|
||||
void ff_ref_dct_init(void);
|
||||
|
||||
void ff_mmx_idct(DCTELEM *data);
|
||||
void ff_mmxext_idct(DCTELEM *data);
|
||||
@@ -90,57 +90,57 @@ struct algo {
|
||||
static int cpu_flags;
|
||||
|
||||
struct algo algos[] = {
|
||||
{"REF-DBL", 0, fdct, fdct, NO_PERM},
|
||||
{"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
|
||||
{"FAANI", 1, ff_faanidct, idct, NO_PERM},
|
||||
{"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
|
||||
{"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
|
||||
{"REF-DBL", 1, idct, idct, NO_PERM},
|
||||
{"INT", 1, j_rev_dct, idct, MMX_PERM},
|
||||
{"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
|
||||
{"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM},
|
||||
{"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE},
|
||||
{"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM},
|
||||
{"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM},
|
||||
{"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM},
|
||||
{"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM},
|
||||
{"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM},
|
||||
{"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM},
|
||||
|
||||
#if HAVE_MMX
|
||||
{"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, FF_MM_MMX},
|
||||
{"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, FF_MM_MMX},
|
||||
#if HAVE_MMX2
|
||||
{"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, FF_MM_MMXEXT},
|
||||
{"SSE2", 0, ff_fdct_sse2, fdct, NO_PERM, FF_MM_SSE2},
|
||||
{"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, FF_MM_MMXEXT},
|
||||
{"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, FF_MM_SSE2},
|
||||
#endif
|
||||
|
||||
#if CONFIG_GPL
|
||||
{"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, FF_MM_MMX},
|
||||
{"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, FF_MM_MMXEXT},
|
||||
{"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, FF_MM_MMX},
|
||||
{"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, FF_MM_MMXEXT},
|
||||
#endif
|
||||
{"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, FF_MM_MMX},
|
||||
{"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, FF_MM_MMX},
|
||||
{"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, FF_MM_MMXEXT},
|
||||
{"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, FF_MM_SSE2},
|
||||
{"SIMPLE-MMX", 1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, FF_MM_MMX},
|
||||
{"XVID-MMX", 1, ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, FF_MM_MMX},
|
||||
{"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, FF_MM_MMXEXT},
|
||||
{"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, FF_MM_SSE2},
|
||||
#endif
|
||||
|
||||
#if HAVE_ALTIVEC
|
||||
{"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, FF_MM_ALTIVEC},
|
||||
{"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, FF_MM_ALTIVEC},
|
||||
#endif
|
||||
|
||||
#if ARCH_BFIN
|
||||
{"BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM},
|
||||
{"BFINidct", 1, ff_bfin_idct, idct, NO_PERM},
|
||||
{"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM},
|
||||
{"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM},
|
||||
#endif
|
||||
|
||||
#if ARCH_ARM
|
||||
{"SIMPLE-ARM", 1, simple_idct_ARM, idct, NO_PERM },
|
||||
{"INT-ARM", 1, j_rev_dct_ARM, idct, MMX_PERM },
|
||||
{"SIMPLE-ARM", 1, simple_idct_ARM, ff_ref_idct, NO_PERM },
|
||||
{"INT-ARM", 1, j_rev_dct_ARM, ff_ref_idct, MMX_PERM },
|
||||
#if HAVE_ARMV5TE
|
||||
{"SIMPLE-ARMV5TE", 1, simple_idct_armv5te, idct, NO_PERM },
|
||||
{"SIMPLE-ARMV5TE", 1, simple_idct_armv5te, ff_ref_idct, NO_PERM },
|
||||
#endif
|
||||
#if HAVE_ARMV6
|
||||
{"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, idct, MMX_PERM },
|
||||
{"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM },
|
||||
#endif
|
||||
#if HAVE_NEON
|
||||
{"SIMPLE-NEON", 1, ff_simple_idct_neon, idct, PARTTRANS_PERM },
|
||||
{"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM },
|
||||
#endif
|
||||
#endif /* ARCH_ARM */
|
||||
|
||||
#if ARCH_ALPHA
|
||||
{"SIMPLE-ALPHA", 1, ff_simple_idct_axp, idct, NO_PERM },
|
||||
{"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM },
|
||||
#endif
|
||||
|
||||
{ 0 }
|
||||
@@ -222,7 +222,7 @@ void dct_error(const char *name, int is_idct,
|
||||
for(i=0;i<64;i++)
|
||||
block1[i] = (random() % 512) -256;
|
||||
if (is_idct){
|
||||
fdct(block1);
|
||||
ff_ref_fdct(block1);
|
||||
|
||||
for(i=0;i<64;i++)
|
||||
block1[i]>>=3;
|
||||
@@ -336,7 +336,7 @@ void dct_error(const char *name, int is_idct,
|
||||
for(i=0;i<64;i++)
|
||||
block1[i] = (random() % 512) -256;
|
||||
if (is_idct){
|
||||
fdct(block1);
|
||||
ff_ref_fdct(block1);
|
||||
|
||||
for(i=0;i<64;i++)
|
||||
block1[i]>>=3;
|
||||
@@ -559,7 +559,7 @@ int main(int argc, char **argv)
|
||||
int test=1;
|
||||
cpu_flags = mm_support();
|
||||
|
||||
init_fdct();
|
||||
ff_ref_dct_init();
|
||||
idct_mmx_init();
|
||||
|
||||
for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
|
||||
|
121
libavcodec/dctref.c
Normal file
121
libavcodec/dctref.c
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* reference discrete cosine transform (double precision)
|
||||
* Copyright (C) 2009 Dylan Yudaken
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg 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.
|
||||
*
|
||||
* FFmpeg 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 FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file libavcodec/dctref.c
|
||||
* reference discrete cosine transform (double precision)
|
||||
*
|
||||
* @author Dylan Yudaken (dyudaken at gmail)
|
||||
*
|
||||
* @note This file could be optimized a lot, but is for
|
||||
* reference and so readability is better.
|
||||
*/
|
||||
|
||||
#include "libavutil/mathematics.h"
|
||||
static double coefficients[8 * 8];
|
||||
|
||||
/**
|
||||
* Initialize the double precision discrete cosine transform
|
||||
* functions fdct & idct.
|
||||
*/
|
||||
av_cold void ff_ref_dct_init(void)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
for (j = 0; j < 8; ++j) {
|
||||
coefficients[j] = sqrt(0.125);
|
||||
for (i = 8; i < 64; i += 8) {
|
||||
coefficients[i + j] = 0.5 * cos(i * (j + 0.5) * M_PI / 64.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform 8x8 block of data with a double precision forward DCT <br>
|
||||
* This is a reference implementation.
|
||||
*
|
||||
* @param block pointer to 8x8 block of data to transform
|
||||
*/
|
||||
void ff_ref_fdct(short *block)
|
||||
{
|
||||
/* implement the equation: block = coefficients * block * coefficients' */
|
||||
|
||||
unsigned int i, j, k;
|
||||
double out[8 * 8];
|
||||
|
||||
/* out = coefficients * block */
|
||||
for (i = 0; i < 64; i += 8) {
|
||||
for (j = 0; j < 8; ++j) {
|
||||
double tmp = 0;
|
||||
for (k = 0; k < 8; ++k) {
|
||||
tmp += coefficients[i + k] * block[k * 8 + j];
|
||||
}
|
||||
out[i + j] = tmp * 8;
|
||||
}
|
||||
}
|
||||
|
||||
/* block = out * (coefficients') */
|
||||
for (j = 0; j < 8; ++j) {
|
||||
for (i = 0; i < 64; i += 8) {
|
||||
double tmp = 0;
|
||||
for (k = 0; k < 8; ++k) {
|
||||
tmp += out[i + k] * coefficients[j * 8 + k];
|
||||
}
|
||||
block[i + j] = floor(tmp + 0.499999999999);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform 8x8 block of data with a double precision inverse DCT <br>
|
||||
* This is a reference implementation.
|
||||
*
|
||||
* @param block pointer to 8x8 block of data to transform
|
||||
*/
|
||||
void ff_ref_idct(short *block)
|
||||
{
|
||||
/* implement the equation: block = (coefficients') * block * coefficients */
|
||||
|
||||
unsigned int i, j, k;
|
||||
double out[8 * 8];
|
||||
|
||||
/* out = block * coefficients */
|
||||
for (i = 0; i < 64; i += 8) {
|
||||
for (j = 0; j < 8; ++j) {
|
||||
double tmp = 0;
|
||||
for (k = 0; k < 8; ++k) {
|
||||
tmp += block[i + k] * coefficients[k * 8 + j];
|
||||
}
|
||||
out[i + j] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* block = (coefficients') * out */
|
||||
for (i = 0; i < 8; ++i) {
|
||||
for (j = 0; j < 8; ++j) {
|
||||
double tmp = 0;
|
||||
for (k = 0; k < 64; k += 8) {
|
||||
tmp += coefficients[k + i] * out[k + j];
|
||||
}
|
||||
block[i * 8 + j] = floor(tmp + 0.5);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,157 +0,0 @@
|
||||
/**
|
||||
* @file libavcodec/fdctref.c
|
||||
* forward discrete cosine transform, double precision.
|
||||
*/
|
||||
|
||||
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
|
||||
|
||||
/*
|
||||
* Disclaimer of Warranty
|
||||
*
|
||||
* These software programs are available to the user without any license fee or
|
||||
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
|
||||
* any and all warranties, whether express, implied, or statuary, including any
|
||||
* implied warranties or merchantability or of fitness for a particular
|
||||
* purpose. In no event shall the copyright-holder be liable for any
|
||||
* incidental, punitive, or consequential damages of any kind whatsoever
|
||||
* arising from the use of these programs.
|
||||
*
|
||||
* This disclaimer of warranty extends to the user of these programs and user's
|
||||
* customers, employees, agents, transferees, successors, and assigns.
|
||||
*
|
||||
* The MPEG Software Simulation Group does not represent or warrant that the
|
||||
* programs furnished hereunder are free of infringement of any third-party
|
||||
* patents.
|
||||
*
|
||||
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
|
||||
* are subject to royalty fees to patent holders. Many of these patents are
|
||||
* general enough such that they are unavoidable regardless of implementation
|
||||
* design.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#ifndef PI
|
||||
# ifdef M_PI
|
||||
# define PI M_PI
|
||||
# else
|
||||
# define PI 3.14159265358979323846
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* global declarations */
|
||||
void init_fdct (void);
|
||||
void fdct (short *block);
|
||||
|
||||
/* private data */
|
||||
static double c[8][8]; /* transform coefficients */
|
||||
|
||||
void init_fdct(void)
|
||||
{
|
||||
int i, j;
|
||||
double s;
|
||||
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
s = (i==0) ? sqrt(0.125) : 0.5;
|
||||
|
||||
for (j=0; j<8; j++)
|
||||
c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
|
||||
}
|
||||
}
|
||||
|
||||
void fdct(block)
|
||||
short *block;
|
||||
{
|
||||
register int i, j;
|
||||
double s;
|
||||
double tmp[64];
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
for(j = 0; j < 8; j++)
|
||||
{
|
||||
s = 0.0;
|
||||
|
||||
/*
|
||||
* for(k = 0; k < 8; k++)
|
||||
* s += c[j][k] * block[8 * i + k];
|
||||
*/
|
||||
s += c[j][0] * block[8 * i + 0];
|
||||
s += c[j][1] * block[8 * i + 1];
|
||||
s += c[j][2] * block[8 * i + 2];
|
||||
s += c[j][3] * block[8 * i + 3];
|
||||
s += c[j][4] * block[8 * i + 4];
|
||||
s += c[j][5] * block[8 * i + 5];
|
||||
s += c[j][6] * block[8 * i + 6];
|
||||
s += c[j][7] * block[8 * i + 7];
|
||||
|
||||
tmp[8 * i + j] = s;
|
||||
}
|
||||
|
||||
for(j = 0; j < 8; j++)
|
||||
for(i = 0; i < 8; i++)
|
||||
{
|
||||
s = 0.0;
|
||||
|
||||
/*
|
||||
* for(k = 0; k < 8; k++)
|
||||
* s += c[i][k] * tmp[8 * k + j];
|
||||
*/
|
||||
s += c[i][0] * tmp[8 * 0 + j];
|
||||
s += c[i][1] * tmp[8 * 1 + j];
|
||||
s += c[i][2] * tmp[8 * 2 + j];
|
||||
s += c[i][3] * tmp[8 * 3 + j];
|
||||
s += c[i][4] * tmp[8 * 4 + j];
|
||||
s += c[i][5] * tmp[8 * 5 + j];
|
||||
s += c[i][6] * tmp[8 * 6 + j];
|
||||
s += c[i][7] * tmp[8 * 7 + j];
|
||||
s*=8.0;
|
||||
|
||||
block[8 * i + j] = (short)floor(s + 0.499999);
|
||||
/*
|
||||
* reason for adding 0.499999 instead of 0.5:
|
||||
* s is quite often x.5 (at least for i and/or j = 0 or 4)
|
||||
* and setting the rounding threshold exactly to 0.5 leads to an
|
||||
* extremely high arithmetic implementation dependency of the result;
|
||||
* s being between x.5 and x.500001 (which is now incorrectly rounded
|
||||
* downwards instead of upwards) is assumed to occur less often
|
||||
* (if at all)
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
/* perform IDCT matrix multiply for 8x8 coefficient block */
|
||||
|
||||
void idct(block)
|
||||
short *block;
|
||||
{
|
||||
int i, j, k, v;
|
||||
double partial_product;
|
||||
double tmp[64];
|
||||
|
||||
for (i=0; i<8; i++)
|
||||
for (j=0; j<8; j++)
|
||||
{
|
||||
partial_product = 0.0;
|
||||
|
||||
for (k=0; k<8; k++)
|
||||
partial_product+= c[k][j]*block[8*i+k];
|
||||
|
||||
tmp[8*i+j] = partial_product;
|
||||
}
|
||||
|
||||
/* Transpose operation is integrated into address mapping by switching
|
||||
loop order of i and j */
|
||||
|
||||
for (j=0; j<8; j++)
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
partial_product = 0.0;
|
||||
|
||||
for (k=0; k<8; k++)
|
||||
partial_product+= c[k][i]*tmp[8*k+j];
|
||||
|
||||
v = (int) floor(partial_product+0.5);
|
||||
block[8*i+j] = v;
|
||||
}
|
||||
}
|
@@ -248,10 +248,9 @@ static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
|
||||
else{
|
||||
int i, e, a;
|
||||
e= 0;
|
||||
while(get_rac(c, state+1 + e)){ //1..10
|
||||
while(get_rac(c, state+1 + e) && e<9){ //1..10
|
||||
e++;
|
||||
}
|
||||
assert(e<=9);
|
||||
|
||||
a= 1;
|
||||
for(i=e-1; i>=0; i--){
|
||||
|
@@ -160,7 +160,7 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx,
|
||||
int pixel_skip;
|
||||
int pixel_countdown;
|
||||
unsigned char *pixels;
|
||||
int pixel_limit;
|
||||
unsigned int pixel_limit;
|
||||
|
||||
s->frame.reference = 1;
|
||||
s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
@@ -254,10 +254,13 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx,
|
||||
av_log(avctx, AV_LOG_ERROR, "Undefined opcode (%x) in DELTA_FLI\n", line_packets);
|
||||
} else if ((line_packets & 0xC000) == 0x8000) {
|
||||
// "last byte" opcode
|
||||
pixels[y_ptr + s->frame.linesize[0] - 1] = line_packets & 0xff;
|
||||
pixel_ptr= y_ptr + s->frame.linesize[0] - 1;
|
||||
CHECK_PIXEL_PTR(0);
|
||||
pixels[pixel_ptr] = line_packets & 0xff;
|
||||
} else {
|
||||
compressed_lines--;
|
||||
pixel_ptr = y_ptr;
|
||||
CHECK_PIXEL_PTR(0);
|
||||
pixel_countdown = s->avctx->width;
|
||||
for (i = 0; i < line_packets; i++) {
|
||||
/* account for the skip bytes */
|
||||
@@ -269,7 +272,7 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx,
|
||||
byte_run = -byte_run;
|
||||
palette_idx1 = buf[stream_ptr++];
|
||||
palette_idx2 = buf[stream_ptr++];
|
||||
CHECK_PIXEL_PTR(byte_run);
|
||||
CHECK_PIXEL_PTR(byte_run * 2);
|
||||
for (j = 0; j < byte_run; j++, pixel_countdown -= 2) {
|
||||
pixels[pixel_ptr++] = palette_idx1;
|
||||
pixels[pixel_ptr++] = palette_idx2;
|
||||
@@ -299,6 +302,7 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx,
|
||||
stream_ptr += 2;
|
||||
while (compressed_lines > 0) {
|
||||
pixel_ptr = y_ptr;
|
||||
CHECK_PIXEL_PTR(0);
|
||||
pixel_countdown = s->avctx->width;
|
||||
line_packets = buf[stream_ptr++];
|
||||
if (line_packets > 0) {
|
||||
@@ -454,7 +458,7 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx,
|
||||
int pixel_countdown;
|
||||
unsigned char *pixels;
|
||||
int pixel;
|
||||
int pixel_limit;
|
||||
unsigned int pixel_limit;
|
||||
|
||||
s->frame.reference = 1;
|
||||
s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
@@ -504,6 +508,7 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx,
|
||||
} else {
|
||||
compressed_lines--;
|
||||
pixel_ptr = y_ptr;
|
||||
CHECK_PIXEL_PTR(0);
|
||||
pixel_countdown = s->avctx->width;
|
||||
for (i = 0; i < line_packets; i++) {
|
||||
/* account for the skip bytes */
|
||||
@@ -515,13 +520,13 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx,
|
||||
byte_run = -byte_run;
|
||||
pixel = AV_RL16(&buf[stream_ptr]);
|
||||
stream_ptr += 2;
|
||||
CHECK_PIXEL_PTR(byte_run);
|
||||
CHECK_PIXEL_PTR(2 * byte_run);
|
||||
for (j = 0; j < byte_run; j++, pixel_countdown -= 2) {
|
||||
*((signed short*)(&pixels[pixel_ptr])) = pixel;
|
||||
pixel_ptr += 2;
|
||||
}
|
||||
} else {
|
||||
CHECK_PIXEL_PTR(byte_run);
|
||||
CHECK_PIXEL_PTR(2 * byte_run);
|
||||
for (j = 0; j < byte_run; j++, pixel_countdown--) {
|
||||
*((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]);
|
||||
stream_ptr += 2;
|
||||
@@ -612,7 +617,7 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx,
|
||||
if (byte_run > 0) {
|
||||
pixel = AV_RL16(&buf[stream_ptr]);
|
||||
stream_ptr += 2;
|
||||
CHECK_PIXEL_PTR(byte_run);
|
||||
CHECK_PIXEL_PTR(2 * byte_run);
|
||||
for (j = 0; j < byte_run; j++) {
|
||||
*((signed short*)(&pixels[pixel_ptr])) = pixel;
|
||||
pixel_ptr += 2;
|
||||
@@ -623,7 +628,7 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx,
|
||||
}
|
||||
} else { /* copy pixels if byte_run < 0 */
|
||||
byte_run = -byte_run;
|
||||
CHECK_PIXEL_PTR(byte_run);
|
||||
CHECK_PIXEL_PTR(2 * byte_run);
|
||||
for (j = 0; j < byte_run; j++) {
|
||||
*((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]);
|
||||
stream_ptr += 2;
|
||||
|
@@ -7016,6 +7016,10 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){
|
||||
if(sps->timing_info_present_flag){
|
||||
sps->num_units_in_tick = get_bits_long(&s->gb, 32);
|
||||
sps->time_scale = get_bits_long(&s->gb, 32);
|
||||
if(sps->num_units_in_tick-1 > 0x7FFFFFFEU || sps->time_scale-1 > 0x7FFFFFFEU){
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick inavlid or unsupported (%d/%d)\n", sps->time_scale, sps->num_units_in_tick);
|
||||
return -1;
|
||||
}
|
||||
sps->fixed_frame_rate_flag = get_bits1(&s->gb);
|
||||
}
|
||||
|
||||
|
@@ -728,10 +728,17 @@ static void decode_422_bitstream(HYuvContext *s, int count){
|
||||
|
||||
count/=2;
|
||||
|
||||
if(count >= (s->gb.size_in_bits - get_bits_count(&s->gb))/(31*4)){
|
||||
for(i=0; i<count && get_bits_count(&s->gb) < s->gb.size_in_bits; i++){
|
||||
READ_2PIX(s->temp[0][2*i ], s->temp[1][i], 1);
|
||||
READ_2PIX(s->temp[0][2*i+1], s->temp[2][i], 2);
|
||||
}
|
||||
}else{
|
||||
for(i=0; i<count; i++){
|
||||
READ_2PIX(s->temp[0][2*i ], s->temp[1][i], 1);
|
||||
READ_2PIX(s->temp[0][2*i+1], s->temp[2][i], 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void decode_gray_bitstream(HYuvContext *s, int count){
|
||||
@@ -739,9 +746,15 @@ static void decode_gray_bitstream(HYuvContext *s, int count){
|
||||
|
||||
count/=2;
|
||||
|
||||
if(count >= (s->gb.size_in_bits - get_bits_count(&s->gb))/(31*2)){
|
||||
for(i=0; i<count && get_bits_count(&s->gb) < s->gb.size_in_bits; i++){
|
||||
READ_2PIX(s->temp[0][2*i ], s->temp[0][2*i+1], 0);
|
||||
}
|
||||
}else{
|
||||
for(i=0; i<count; i++){
|
||||
READ_2PIX(s->temp[0][2*i ], s->temp[0][2*i+1], 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
|
||||
|
@@ -25,22 +25,13 @@
|
||||
* This code implements both an AMR-NarrowBand (AMR-NB) and an AMR-WideBand
|
||||
* (AMR-WB) audio encoder/decoder through external reference code from
|
||||
* http://www.3gpp.org/. The license of the code from 3gpp is unclear so you
|
||||
* have to download the code separately. Two versions exists: One fixed-point
|
||||
* and one floating-point. For some reason the float encoder is significantly
|
||||
* faster at least on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip
|
||||
* at MR102). Both float and fixed point are supported for AMR-NB, but only
|
||||
* float for AMR-WB.
|
||||
* have to download the code separately.
|
||||
*
|
||||
* \section AMR-NB
|
||||
*
|
||||
* \subsection Float
|
||||
* The float version (default) can be downloaded from:
|
||||
* http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-610.zip
|
||||
*
|
||||
* \subsection Fixed-point
|
||||
* The fixed-point (TS26.073) can be downloaded from:
|
||||
* http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-600.zip
|
||||
*
|
||||
* \subsection Specification
|
||||
* The specification for AMR-NB can be found in TS 26.071
|
||||
* (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other
|
||||
@@ -48,14 +39,9 @@
|
||||
*
|
||||
* \section AMR-WB
|
||||
*
|
||||
* \subsection Float
|
||||
* The reference code can be downloaded from:
|
||||
* http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-600.zip
|
||||
*
|
||||
* \subsection Fixed-point
|
||||
* If someone wants to use the fixed point version it can be downloaded from:
|
||||
* http://www.3gpp.org/ftp/Specs/archive/26_series/26.173/26173-571.zip.
|
||||
*
|
||||
* \subsection Specification
|
||||
* The specification for AMR-WB can be found in TS 26.171
|
||||
* (http://www.3gpp.org/ftp/Specs/html-info/26171.htm) and some other
|
||||
@@ -65,31 +51,30 @@
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
#if CONFIG_LIBAMR_NB_FIXED
|
||||
static void amr_decode_fix_avctx(AVCodecContext *avctx)
|
||||
{
|
||||
const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB);
|
||||
|
||||
#define MMS_IO
|
||||
if (!avctx->sample_rate)
|
||||
avctx->sample_rate = 8000 * is_amr_wb;
|
||||
|
||||
#include "amr/sp_dec.h"
|
||||
#include "amr/d_homing.h"
|
||||
#include "amr/typedef.h"
|
||||
#include "amr/sp_enc.h"
|
||||
#include "amr/sid_sync.h"
|
||||
#include "amr/e_homing.h"
|
||||
if (!avctx->channels)
|
||||
avctx->channels = 1;
|
||||
|
||||
avctx->frame_size = 160 * is_amr_wb;
|
||||
avctx->sample_fmt = SAMPLE_FMT_S16;
|
||||
}
|
||||
|
||||
#if CONFIG_LIBAMR_NB
|
||||
|
||||
#else
|
||||
#include <amrnb/interf_dec.h>
|
||||
#include <amrnb/interf_enc.h>
|
||||
#endif
|
||||
|
||||
static const char nb_bitrate_unsupported[] =
|
||||
"bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n";
|
||||
static const char wb_bitrate_unsupported[] =
|
||||
"bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n";
|
||||
|
||||
/* Common code for fixed and float version*/
|
||||
typedef struct AMR_bitrates
|
||||
{
|
||||
int rate;
|
||||
typedef struct AMR_bitrates {
|
||||
int rate;
|
||||
enum Mode mode;
|
||||
} AMR_bitrates;
|
||||
|
||||
@@ -97,287 +82,44 @@ typedef struct AMR_bitrates
|
||||
static int getBitrateMode(int bitrate)
|
||||
{
|
||||
/* make the correspondance between bitrate and mode */
|
||||
AMR_bitrates rates[]={ {4750,MR475},
|
||||
{5150,MR515},
|
||||
{5900,MR59},
|
||||
{6700,MR67},
|
||||
{7400,MR74},
|
||||
{7950,MR795},
|
||||
{10200,MR102},
|
||||
{12200,MR122},
|
||||
};
|
||||
AMR_bitrates rates[] = { { 4750, MR475},
|
||||
{ 5150, MR515},
|
||||
{ 5900, MR59},
|
||||
{ 6700, MR67},
|
||||
{ 7400, MR74},
|
||||
{ 7950, MR795},
|
||||
{10200, MR102},
|
||||
{12200, MR122}, };
|
||||
int i;
|
||||
|
||||
for(i=0;i<8;i++)
|
||||
{
|
||||
if(rates[i].rate==bitrate)
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
if (rates[i].rate == bitrate)
|
||||
return rates[i].mode;
|
||||
}
|
||||
}
|
||||
/* no bitrate matching, return an error */
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void amr_decode_fix_avctx(AVCodecContext * avctx)
|
||||
{
|
||||
const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB);
|
||||
|
||||
if(avctx->sample_rate == 0)
|
||||
{
|
||||
avctx->sample_rate = 8000 * is_amr_wb;
|
||||
}
|
||||
|
||||
if(avctx->channels == 0)
|
||||
{
|
||||
avctx->channels = 1;
|
||||
}
|
||||
|
||||
avctx->frame_size = 160 * is_amr_wb;
|
||||
avctx->sample_fmt = SAMPLE_FMT_S16;
|
||||
}
|
||||
|
||||
#if CONFIG_LIBAMR_NB_FIXED
|
||||
/* fixed point version*/
|
||||
/* frame size in serial bitstream file (frame type + serial stream + flags) */
|
||||
#define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)
|
||||
|
||||
typedef struct AMRContext {
|
||||
int frameCount;
|
||||
Speech_Decode_FrameState *speech_decoder_state;
|
||||
enum RXFrameType rx_type;
|
||||
enum Mode mode;
|
||||
Word16 reset_flag;
|
||||
Word16 reset_flag_old;
|
||||
|
||||
int enc_bitrate;
|
||||
Speech_Encode_FrameState *enstate;
|
||||
sid_syncState *sidstate;
|
||||
enum TXFrameType tx_frametype;
|
||||
int frameCount;
|
||||
void *decState;
|
||||
int *enstate;
|
||||
int enc_bitrate;
|
||||
} AMRContext;
|
||||
|
||||
static av_cold int amr_nb_decode_init(AVCodecContext * avctx)
|
||||
static av_cold int amr_nb_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
s->speech_decoder_state=NULL;
|
||||
s->rx_type = (enum RXFrameType)0;
|
||||
s->mode= (enum Mode)0;
|
||||
s->reset_flag=0;
|
||||
s->reset_flag_old=1;
|
||||
|
||||
if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder"))
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if(avctx->channels > 1)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_init(AVCodecContext * avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
s->speech_decoder_state=NULL;
|
||||
s->rx_type = (enum RXFrameType)0;
|
||||
s->mode= (enum Mode)0;
|
||||
s->reset_flag=0;
|
||||
s->reset_flag_old=1;
|
||||
|
||||
if(avctx->sample_rate!=8000)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(avctx->channels!=1)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->frame_size=160;
|
||||
avctx->coded_frame= avcodec_alloc_frame();
|
||||
|
||||
if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate))
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Speech_Encode_Frame_init error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_close(AVCodecContext * avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Speech_Encode_Frame_exit(&s->enstate);
|
||||
sid_sync_exit (&s->sidstate);
|
||||
av_freep(&avctx->coded_frame);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Speech_Decode_Frame_exit(&s->speech_decoder_state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_nb_decode_frame(AVCodecContext * avctx,
|
||||
void *data, int *data_size,
|
||||
const uint8_t * buf, int buf_size)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
const uint8_t*amrData=buf;
|
||||
int offset=0;
|
||||
UWord8 toc, q, ft;
|
||||
Word16 serial[SERIAL_FRAMESIZE]; /* coded bits */
|
||||
Word16 *synth;
|
||||
UWord8 *packed_bits;
|
||||
static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
|
||||
int i;
|
||||
|
||||
//printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount);
|
||||
|
||||
synth=data;
|
||||
|
||||
toc=amrData[offset];
|
||||
/* read rest of the frame based on ToC byte */
|
||||
q = (toc >> 2) & 0x01;
|
||||
ft = (toc >> 3) & 0x0F;
|
||||
|
||||
//printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %X\n",offset,packed_size[ft],amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]);
|
||||
|
||||
offset++;
|
||||
|
||||
packed_bits=amrData+offset;
|
||||
|
||||
offset+=packed_size[ft];
|
||||
|
||||
//Unsort and unpack bits
|
||||
s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]);
|
||||
|
||||
//We have a new frame
|
||||
s->frameCount++;
|
||||
|
||||
if (s->rx_type == RX_NO_DATA)
|
||||
{
|
||||
s->mode = s->speech_decoder_state->prev_mode;
|
||||
}
|
||||
else {
|
||||
s->speech_decoder_state->prev_mode = s->mode;
|
||||
}
|
||||
|
||||
/* if homed: check if this frame is another homing frame */
|
||||
if (s->reset_flag_old == 1)
|
||||
{
|
||||
/* only check until end of first subframe */
|
||||
s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode);
|
||||
}
|
||||
/* produce encoder homing frame if homed & input=decoder homing frame */
|
||||
if ((s->reset_flag != 0) && (s->reset_flag_old != 0))
|
||||
{
|
||||
for (i = 0; i < L_FRAME; i++)
|
||||
{
|
||||
synth[i] = EHF_MASK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* decode frame */
|
||||
Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth);
|
||||
}
|
||||
|
||||
//Each AMR-frame results in 160 16-bit samples
|
||||
*data_size=160*2;
|
||||
|
||||
/* if not homed: check whether current frame is a homing frame */
|
||||
if (s->reset_flag_old == 0)
|
||||
{
|
||||
/* check whole frame */
|
||||
s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode);
|
||||
}
|
||||
/* reset decoder if current frame is a homing frame */
|
||||
if (s->reset_flag != 0)
|
||||
{
|
||||
Speech_Decode_Frame_reset(s->speech_decoder_state);
|
||||
}
|
||||
s->reset_flag_old = s->reset_flag;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
static int amr_nb_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
|
||||
{
|
||||
short serial_data[250] = {0};
|
||||
AMRContext *s = avctx->priv_data;
|
||||
int written;
|
||||
|
||||
s->reset_flag = encoder_homing_frame_test(data);
|
||||
|
||||
Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode);
|
||||
|
||||
/* add frame type and mode */
|
||||
sid_sync (s->sidstate, s->mode, &s->tx_frametype);
|
||||
|
||||
written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame);
|
||||
|
||||
if (s->reset_flag != 0)
|
||||
{
|
||||
Speech_Encode_Frame_reset(s->enstate);
|
||||
sid_sync_reset(s->sidstate);
|
||||
}
|
||||
return written;
|
||||
}
|
||||
|
||||
|
||||
#elif CONFIG_LIBAMR_NB /* Float point version*/
|
||||
|
||||
typedef struct AMRContext {
|
||||
int frameCount;
|
||||
void * decState;
|
||||
int *enstate;
|
||||
int enc_bitrate;
|
||||
} AMRContext;
|
||||
|
||||
static av_cold int amr_nb_decode_init(AVCodecContext * avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
s->decState=Decoder_Interface_init();
|
||||
if(!s->decState)
|
||||
{
|
||||
s->frameCount = 0;
|
||||
s->decState = Decoder_Interface_init();
|
||||
if (!s->decState) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if(avctx->channels > 1)
|
||||
{
|
||||
if (avctx->channels > 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -385,44 +127,7 @@ static av_cold int amr_nb_decode_init(AVCodecContext * avctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_init(AVCodecContext * avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
|
||||
if(avctx->sample_rate!=8000)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(avctx->channels!=1)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->frame_size=160;
|
||||
avctx->coded_frame= avcodec_alloc_frame();
|
||||
|
||||
s->enstate=Encoder_Interface_init(0);
|
||||
if(!s->enstate)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
|
||||
static av_cold int amr_nb_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
@@ -430,72 +135,39 @@ static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_close(AVCodecContext * avctx)
|
||||
static int amr_nb_decode_frame(AVCodecContext *avctx, void *data,
|
||||
int *data_size,
|
||||
const uint8_t *buf, int buf_size)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Encoder_Interface_exit(s->enstate);
|
||||
av_freep(&avctx->coded_frame);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_nb_decode_frame(AVCodecContext * avctx,
|
||||
void *data, int *data_size,
|
||||
const uint8_t * buf, int buf_size)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
const uint8_t*amrData=buf;
|
||||
static const uint8_t block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
|
||||
const uint8_t *amrData = buf;
|
||||
static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
|
||||
enum Mode dec_mode;
|
||||
int packet_size;
|
||||
|
||||
/* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",buf,buf_size,s->frameCount); */
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",
|
||||
buf, buf_size, s->frameCount); */
|
||||
|
||||
dec_mode = (buf[0] >> 3) & 0x000F;
|
||||
packet_size = block_size[dec_mode]+1;
|
||||
packet_size = block_size[dec_mode] + 1;
|
||||
|
||||
if(packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size);
|
||||
if (packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n",
|
||||
buf_size, packet_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->frameCount++;
|
||||
/* av_log(NULL,AV_LOG_DEBUG,"packet_size=%d amrData= 0x%X %X %X %X\n",packet_size,amrData[0],amrData[1],amrData[2],amrData[3]); */
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "packet_size=%d amrData= 0x%X %X %X %X\n",
|
||||
packet_size, amrData[0], amrData[1], amrData[2], amrData[3]); */
|
||||
/* call decoder */
|
||||
Decoder_Interface_Decode(s->decState, amrData, data, 0);
|
||||
*data_size=160*2;
|
||||
*data_size = 160 * 2;
|
||||
|
||||
return packet_size;
|
||||
}
|
||||
|
||||
static int amr_nb_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
int written;
|
||||
|
||||
if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
written = Encoder_Interface_Encode(s->enstate,
|
||||
s->enc_bitrate,
|
||||
data,
|
||||
frame,
|
||||
0);
|
||||
/* av_log(NULL,AV_LOG_DEBUG,"amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",written, s->enc_bitrate, frame[0] ); */
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if CONFIG_LIBAMR_NB || CONFIG_LIBAMR_NB_FIXED
|
||||
|
||||
AVCodec libamr_nb_decoder =
|
||||
{
|
||||
AVCodec libamr_nb_decoder = {
|
||||
"libamr_nb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_NB,
|
||||
@@ -507,8 +179,69 @@ AVCodec libamr_nb_decoder =
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"),
|
||||
};
|
||||
|
||||
AVCodec libamr_nb_encoder =
|
||||
static av_cold int amr_nb_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount = 0;
|
||||
|
||||
if (avctx->sample_rate != 8000) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (avctx->channels != 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->frame_size = 160;
|
||||
avctx->coded_frame = avcodec_alloc_frame();
|
||||
|
||||
s->enstate=Encoder_Interface_init(0);
|
||||
if (!s->enstate) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Encoder_Interface_exit(s->enstate);
|
||||
av_freep(&avctx->coded_frame);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_nb_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *frame/*out*/,
|
||||
int buf_size, void *data/*in*/)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
int written;
|
||||
|
||||
if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
written = Encoder_Interface_Encode(s->enstate, s->enc_bitrate, data,
|
||||
frame, 0);
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",
|
||||
written, s->enc_bitrate, frame[0] ); */
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
AVCodec libamr_nb_encoder = {
|
||||
"libamr_nb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_NB,
|
||||
@@ -531,85 +264,80 @@ AVCodec libamr_nb_encoder =
|
||||
#define typedef_h
|
||||
#endif
|
||||
|
||||
#include <amrwb/enc_if.h>
|
||||
#include <amrwb/dec_if.h>
|
||||
#include <amrwb/if_rom.h>
|
||||
|
||||
/* Common code for fixed and float version*/
|
||||
typedef struct AMRWB_bitrates
|
||||
{
|
||||
static const char wb_bitrate_unsupported[] =
|
||||
"bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n";
|
||||
|
||||
typedef struct AMRWB_bitrates {
|
||||
int rate;
|
||||
int mode;
|
||||
} AMRWB_bitrates;
|
||||
|
||||
typedef struct AMRWBContext {
|
||||
int frameCount;
|
||||
void *state;
|
||||
int mode;
|
||||
Word16 allow_dtx;
|
||||
} AMRWBContext;
|
||||
|
||||
#if CONFIG_LIBAMR_WB_ENCODER
|
||||
|
||||
#include <amrwb/enc_if.h>
|
||||
|
||||
static int getWBBitrateMode(int bitrate)
|
||||
{
|
||||
/* make the correspondance between bitrate and mode */
|
||||
AMRWB_bitrates rates[]={ {6600,0},
|
||||
{8850,1},
|
||||
{12650,2},
|
||||
{14250,3},
|
||||
{15850,4},
|
||||
{18250,5},
|
||||
{19850,6},
|
||||
{23050,7},
|
||||
{23850,8},
|
||||
};
|
||||
AMRWB_bitrates rates[] = { { 6600, 0},
|
||||
{ 8850, 1},
|
||||
{12650, 2},
|
||||
{14250, 3},
|
||||
{15850, 4},
|
||||
{18250, 5},
|
||||
{19850, 6},
|
||||
{23050, 7},
|
||||
{23850, 8}, };
|
||||
int i;
|
||||
|
||||
for(i=0;i<9;i++)
|
||||
{
|
||||
if(rates[i].rate==bitrate)
|
||||
{
|
||||
for (i = 0; i < 9; i++)
|
||||
if (rates[i].rate == bitrate)
|
||||
return rates[i].mode;
|
||||
}
|
||||
}
|
||||
/* no bitrate matching, return an error */
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
typedef struct AMRWBContext {
|
||||
int frameCount;
|
||||
void *state;
|
||||
int mode;
|
||||
Word16 allow_dtx;
|
||||
} AMRWBContext;
|
||||
|
||||
static int amr_wb_encode_init(AVCodecContext * avctx)
|
||||
static av_cold int amr_wb_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
s->frameCount = 0;
|
||||
|
||||
if(avctx->sample_rate!=16000)
|
||||
{
|
||||
if (avctx->sample_rate != 16000) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 16000Hz sample rate supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(avctx->channels!=1)
|
||||
{
|
||||
if (avctx->channels != 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
|
||||
{
|
||||
if ((s->mode = getWBBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->frame_size=320;
|
||||
avctx->coded_frame= avcodec_alloc_frame();
|
||||
avctx->frame_size = 320;
|
||||
avctx->coded_frame = avcodec_alloc_frame();
|
||||
|
||||
s->state = E_IF_init();
|
||||
s->allow_dtx=0;
|
||||
s->state = E_IF_init();
|
||||
s->allow_dtx = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_wb_encode_close(AVCodecContext * avctx)
|
||||
static int amr_wb_encode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
@@ -620,13 +348,13 @@ static int amr_wb_encode_close(AVCodecContext * avctx)
|
||||
}
|
||||
|
||||
static int amr_wb_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
|
||||
unsigned char *frame/*out*/,
|
||||
int buf_size, void *data/*in*/)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
int size;
|
||||
|
||||
if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
|
||||
{
|
||||
if ((s->mode = getWBBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
@@ -634,76 +362,7 @@ static int amr_wb_encode_frame(AVCodecContext *avctx,
|
||||
return size;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_init(AVCodecContext * avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount=0;
|
||||
s->state = D_IF_init();
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if(avctx->channels > 1)
|
||||
{
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_frame(AVCodecContext * avctx,
|
||||
void *data, int *data_size,
|
||||
const uint8_t * buf, int buf_size)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
const uint8_t*amrData=buf;
|
||||
int mode;
|
||||
int packet_size;
|
||||
static const uint8_t block_size[16] = {18, 23, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
|
||||
|
||||
if(buf_size==0) {
|
||||
/* nothing to do */
|
||||
return 0;
|
||||
}
|
||||
|
||||
mode = (amrData[0] >> 3) & 0x000F;
|
||||
packet_size = block_size[mode];
|
||||
|
||||
if(packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->frameCount++;
|
||||
D_IF_decode( s->state, amrData, data, _good_frame);
|
||||
*data_size=320*2;
|
||||
return packet_size;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_close(AVCodecContext * avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
D_IF_exit(s->state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec libamr_wb_decoder =
|
||||
{
|
||||
"libamr_wb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_WB,
|
||||
sizeof(AMRWBContext),
|
||||
amr_wb_decode_init,
|
||||
NULL,
|
||||
amr_wb_decode_close,
|
||||
amr_wb_decode_frame,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
|
||||
};
|
||||
|
||||
AVCodec libamr_wb_encoder =
|
||||
{
|
||||
AVCodec libamr_wb_encoder = {
|
||||
"libamr_wb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_WB,
|
||||
@@ -716,4 +375,72 @@ AVCodec libamr_wb_encoder =
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static av_cold int amr_wb_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount = 0;
|
||||
s->state = D_IF_init();
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if (avctx->channels > 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_frame(AVCodecContext *avctx,
|
||||
void *data, int *data_size,
|
||||
const uint8_t *buf, int buf_size)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
const uint8_t *amrData = buf;
|
||||
int mode;
|
||||
int packet_size;
|
||||
static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
|
||||
|
||||
if (!buf_size)
|
||||
/* nothing to do */
|
||||
return 0;
|
||||
|
||||
mode = (amrData[0] >> 3) & 0x000F;
|
||||
packet_size = block_size[mode];
|
||||
|
||||
if (packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n",
|
||||
buf_size, packet_size + 1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->frameCount++;
|
||||
D_IF_decode(s->state, amrData, data, _good_frame);
|
||||
*data_size = 320 * 2;
|
||||
return packet_size;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
D_IF_exit(s->state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec libamr_wb_decoder = {
|
||||
"libamr_wb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_WB,
|
||||
sizeof(AMRWBContext),
|
||||
amr_wb_decode_init,
|
||||
NULL,
|
||||
amr_wb_decode_close,
|
||||
amr_wb_decode_frame,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
|
||||
};
|
||||
|
||||
#endif //CONFIG_LIBAMR_WB
|
||||
|
3
libavcodec/libavcodec.v
Normal file
3
libavcodec/libavcodec.v
Normal file
@@ -0,0 +1,3 @@
|
||||
LIBAVCODEC_$MAJOR {
|
||||
global: *;
|
||||
};
|
323
libavcodec/libopencore-amr.c
Normal file
323
libavcodec/libopencore-amr.c
Normal file
@@ -0,0 +1,323 @@
|
||||
/*
|
||||
* AMR Audio decoder stub
|
||||
* Copyright (c) 2003 the ffmpeg project
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg 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.
|
||||
*
|
||||
* FFmpeg 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 FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
static void amr_decode_fix_avctx(AVCodecContext *avctx)
|
||||
{
|
||||
const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB);
|
||||
|
||||
if (!avctx->sample_rate)
|
||||
avctx->sample_rate = 8000 * is_amr_wb;
|
||||
|
||||
if (!avctx->channels)
|
||||
avctx->channels = 1;
|
||||
|
||||
avctx->frame_size = 160 * is_amr_wb;
|
||||
avctx->sample_fmt = SAMPLE_FMT_S16;
|
||||
}
|
||||
|
||||
#if CONFIG_LIBOPENCORE_AMRNB
|
||||
|
||||
#include <opencore-amrnb/interf_dec.h>
|
||||
#include <opencore-amrnb/interf_enc.h>
|
||||
|
||||
static const char nb_bitrate_unsupported[] =
|
||||
"bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n";
|
||||
|
||||
/* Common code for fixed and float version*/
|
||||
typedef struct AMR_bitrates {
|
||||
int rate;
|
||||
enum Mode mode;
|
||||
} AMR_bitrates;
|
||||
|
||||
/* Match desired bitrate */
|
||||
static int getBitrateMode(int bitrate)
|
||||
{
|
||||
/* make the correspondance between bitrate and mode */
|
||||
AMR_bitrates rates[] = { { 4750, MR475},
|
||||
{ 5150, MR515},
|
||||
{ 5900, MR59},
|
||||
{ 6700, MR67},
|
||||
{ 7400, MR74},
|
||||
{ 7950, MR795},
|
||||
{10200, MR102},
|
||||
{12200, MR122}, };
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
if (rates[i].rate == bitrate)
|
||||
return rates[i].mode;
|
||||
/* no bitrate matching, return an error */
|
||||
return -1;
|
||||
}
|
||||
|
||||
typedef struct AMRContext {
|
||||
int frameCount;
|
||||
void *decState;
|
||||
int *enstate;
|
||||
int enc_bitrate;
|
||||
} AMRContext;
|
||||
|
||||
static av_cold int amr_nb_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount = 0;
|
||||
s->decState = Decoder_Interface_init();
|
||||
if (!s->decState) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if (avctx->channels > 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Decoder_Interface_exit(s->decState);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_nb_decode_frame(AVCodecContext *avctx, void *data,
|
||||
int *data_size,
|
||||
const uint8_t *buf, int buf_size)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
const uint8_t *amrData = buf;
|
||||
static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
|
||||
enum Mode dec_mode;
|
||||
int packet_size;
|
||||
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",
|
||||
buf, buf_size, s->frameCount); */
|
||||
|
||||
dec_mode = (buf[0] >> 3) & 0x000F;
|
||||
packet_size = block_size[dec_mode] + 1;
|
||||
|
||||
if (packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n",
|
||||
buf_size, packet_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->frameCount++;
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "packet_size=%d amrData= 0x%X %X %X %X\n",
|
||||
packet_size, amrData[0], amrData[1], amrData[2], amrData[3]); */
|
||||
/* call decoder */
|
||||
Decoder_Interface_Decode(s->decState, amrData, data, 0);
|
||||
*data_size = 160 * 2;
|
||||
|
||||
return packet_size;
|
||||
}
|
||||
|
||||
AVCodec libopencore_amrnb_decoder = {
|
||||
"libopencore_amrnb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_NB,
|
||||
sizeof(AMRContext),
|
||||
amr_nb_decode_init,
|
||||
NULL,
|
||||
amr_nb_decode_close,
|
||||
amr_nb_decode_frame,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Narrow-Band"),
|
||||
};
|
||||
|
||||
static av_cold int amr_nb_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount = 0;
|
||||
|
||||
if (avctx->sample_rate != 8000) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (avctx->channels != 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->frame_size = 160;
|
||||
avctx->coded_frame = avcodec_alloc_frame();
|
||||
|
||||
s->enstate=Encoder_Interface_init(0);
|
||||
if (!s->enstate) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int amr_nb_encode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
|
||||
Encoder_Interface_exit(s->enstate);
|
||||
av_freep(&avctx->coded_frame);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_nb_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *frame/*out*/,
|
||||
int buf_size, void *data/*in*/)
|
||||
{
|
||||
AMRContext *s = avctx->priv_data;
|
||||
int written;
|
||||
|
||||
if ((s->enc_bitrate = getBitrateMode(avctx->bit_rate)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
|
||||
return -1;
|
||||
}
|
||||
|
||||
written = Encoder_Interface_Encode(s->enstate, s->enc_bitrate, data,
|
||||
frame, 0);
|
||||
/* av_log(NULL, AV_LOG_DEBUG, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",
|
||||
written, s->enc_bitrate, frame[0] ); */
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
AVCodec libopencore_amrnb_encoder = {
|
||||
"libopencore_amrnb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_NB,
|
||||
sizeof(AMRContext),
|
||||
amr_nb_encode_init,
|
||||
amr_nb_encode_frame,
|
||||
amr_nb_encode_close,
|
||||
NULL,
|
||||
.sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
|
||||
.long_name = NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Narrow-Band"),
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* -----------AMR wideband ------------*/
|
||||
#if CONFIG_LIBOPENCORE_AMRWB
|
||||
|
||||
#ifdef _TYPEDEF_H
|
||||
//To avoid duplicate typedefs from typedef in amr-nb
|
||||
#define typedef_h
|
||||
#endif
|
||||
|
||||
#include <opencore-amrwb/dec_if.h>
|
||||
#include <opencore-amrwb/if_rom.h>
|
||||
|
||||
static const char wb_bitrate_unsupported[] =
|
||||
"bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n";
|
||||
|
||||
/* Common code for fixed and float version*/
|
||||
typedef struct AMRWB_bitrates {
|
||||
int rate;
|
||||
int mode;
|
||||
} AMRWB_bitrates;
|
||||
|
||||
typedef struct AMRWBContext {
|
||||
int frameCount;
|
||||
void *state;
|
||||
int mode;
|
||||
Word16 allow_dtx;
|
||||
} AMRWBContext;
|
||||
|
||||
static av_cold int amr_wb_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
s->frameCount = 0;
|
||||
s->state = D_IF_init();
|
||||
|
||||
amr_decode_fix_avctx(avctx);
|
||||
|
||||
if (avctx->channels > 1) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_frame(AVCodecContext *avctx,
|
||||
void *data, int *data_size,
|
||||
const uint8_t *buf, int buf_size)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
const uint8_t *amrData = buf;
|
||||
int mode;
|
||||
int packet_size;
|
||||
static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
|
||||
|
||||
if (!buf_size)
|
||||
/* nothing to do */
|
||||
return 0;
|
||||
|
||||
mode = (amrData[0] >> 3) & 0x000F;
|
||||
packet_size = block_size[mode];
|
||||
|
||||
if (packet_size > buf_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n",
|
||||
buf_size, packet_size + 1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->frameCount++;
|
||||
D_IF_decode(s->state, amrData, data, _good_frame);
|
||||
*data_size = 320 * 2;
|
||||
return packet_size;
|
||||
}
|
||||
|
||||
static int amr_wb_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
AMRWBContext *s = avctx->priv_data;
|
||||
|
||||
D_IF_exit(s->state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec libopencore_amrwb_decoder = {
|
||||
"libopencore_amrwb",
|
||||
CODEC_TYPE_AUDIO,
|
||||
CODEC_ID_AMR_WB,
|
||||
sizeof(AMRWBContext),
|
||||
amr_wb_decode_init,
|
||||
NULL,
|
||||
amr_wb_decode_close,
|
||||
amr_wb_decode_frame,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Wide-Band"),
|
||||
};
|
||||
|
||||
#endif /* CONFIG_LIBOPENCORE_AMRWB */
|
@@ -27,14 +27,15 @@
|
||||
#include <string.h>
|
||||
|
||||
typedef struct X264Context {
|
||||
x264_param_t params;
|
||||
x264_t *enc;
|
||||
x264_picture_t pic;
|
||||
AVFrame out_pic;
|
||||
x264_param_t params;
|
||||
x264_t *enc;
|
||||
x264_picture_t pic;
|
||||
uint8_t *sei;
|
||||
int sei_size;
|
||||
AVFrame out_pic;
|
||||
} X264Context;
|
||||
|
||||
static void
|
||||
X264_log(void *p, int level, const char *fmt, va_list args)
|
||||
static void X264_log(void *p, int level, const char *fmt, va_list args)
|
||||
{
|
||||
static const int level_map[] = {
|
||||
[X264_LOG_ERROR] = AV_LOG_ERROR,
|
||||
@@ -43,31 +44,75 @@ X264_log(void *p, int level, const char *fmt, va_list args)
|
||||
[X264_LOG_DEBUG] = AV_LOG_DEBUG
|
||||
};
|
||||
|
||||
if(level < 0 || level > X264_LOG_DEBUG)
|
||||
if (level < 0 || level > X264_LOG_DEBUG)
|
||||
return;
|
||||
|
||||
av_vlog(p, level_map[level], fmt, args);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
encode_nals(uint8_t *buf, int size, x264_nal_t *nals, int nnal)
|
||||
#if X264_BUILD >= 76
|
||||
static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size,
|
||||
x264_nal_t *nals, int nnal, int skip_sei)
|
||||
{
|
||||
X264Context *x4 = ctx->priv_data;
|
||||
uint8_t *p = buf;
|
||||
int i;
|
||||
|
||||
for(i = 0; i < nnal; i++){
|
||||
int s = x264_nal_encode(p, &size, 1, nals + i);
|
||||
if(s < 0)
|
||||
/* Write the SEI as part of the first frame. */
|
||||
if (x4->sei_size > 0 && nnal > 0) {
|
||||
memcpy(p, x4->sei, x4->sei_size);
|
||||
p += x4->sei_size;
|
||||
x4->sei_size = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < nnal; i++){
|
||||
/* Don't put the SEI in extradata. */
|
||||
if (skip_sei && nals[i].i_type == NAL_SEI) {
|
||||
x4->sei_size = nals[i].i_payload;
|
||||
x4->sei = av_malloc(x4->sei_size);
|
||||
memcpy(x4->sei, nals[i].p_payload, nals[i].i_payload);
|
||||
continue;
|
||||
}
|
||||
memcpy(p, nals[i].p_payload, nals[i].i_payload);
|
||||
p += nals[i].i_payload;
|
||||
}
|
||||
|
||||
return p - buf;
|
||||
}
|
||||
#else
|
||||
static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, x264_nal_t *nals, int nnal, int skip_sei)
|
||||
{
|
||||
X264Context *x4 = ctx->priv_data;
|
||||
uint8_t *p = buf;
|
||||
int i, s;
|
||||
|
||||
/* Write the SEI as part of the first frame. */
|
||||
if (x4->sei_size > 0 && nnal > 0) {
|
||||
memcpy(p, x4->sei, x4->sei_size);
|
||||
p += x4->sei_size;
|
||||
x4->sei_size = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < nnal; i++) {
|
||||
/* Don't put the SEI in extradata. */
|
||||
if (skip_sei && nals[i].i_type == NAL_SEI) {
|
||||
x4->sei = av_malloc( 5 + nals[i].i_payload * 4 / 3 );
|
||||
if(x264_nal_encode(x4->sei, &x4->sei_size, 1, nals + i) < 0)
|
||||
return -1;
|
||||
continue;
|
||||
}
|
||||
s = x264_nal_encode(p, &size, 1, nals + i);
|
||||
if (s < 0)
|
||||
return -1;
|
||||
p += s;
|
||||
}
|
||||
|
||||
return p - buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data)
|
||||
static int X264_frame(AVCodecContext *ctx, uint8_t *buf,
|
||||
int bufsize, void *data)
|
||||
{
|
||||
X264Context *x4 = ctx->priv_data;
|
||||
AVFrame *frame = data;
|
||||
@@ -75,31 +120,30 @@ X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data)
|
||||
int nnal, i;
|
||||
x264_picture_t pic_out;
|
||||
|
||||
x4->pic.img.i_csp = X264_CSP_I420;
|
||||
x4->pic.img.i_csp = X264_CSP_I420;
|
||||
x4->pic.img.i_plane = 3;
|
||||
|
||||
if (frame) {
|
||||
for(i = 0; i < 3; i++){
|
||||
for (i = 0; i < 3; i++) {
|
||||
x4->pic.img.plane[i] = frame->data[i];
|
||||
x4->pic.img.i_stride[i] = frame->linesize[i];
|
||||
}
|
||||
|
||||
x4->pic.i_pts = frame->pts;
|
||||
x4->pic.i_pts = frame->pts;
|
||||
x4->pic.i_type = X264_TYPE_AUTO;
|
||||
}
|
||||
|
||||
if(x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL,
|
||||
&pic_out))
|
||||
if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0)
|
||||
return -1;
|
||||
|
||||
bufsize = encode_nals(buf, bufsize, nal, nnal);
|
||||
if(bufsize < 0)
|
||||
bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0);
|
||||
if (bufsize < 0)
|
||||
return -1;
|
||||
|
||||
/* FIXME: dts */
|
||||
/* FIXME: libx264 now provides DTS, but AVFrame doesn't have a field for it. */
|
||||
x4->out_pic.pts = pic_out.i_pts;
|
||||
|
||||
switch(pic_out.i_type){
|
||||
switch (pic_out.i_type) {
|
||||
case X264_TYPE_IDR:
|
||||
case X264_TYPE_I:
|
||||
x4->out_pic.pict_type = FF_I_TYPE;
|
||||
@@ -113,166 +157,194 @@ X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data)
|
||||
break;
|
||||
}
|
||||
|
||||
#if X264_BUILD < 82
|
||||
x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR;
|
||||
x4->out_pic.quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA;
|
||||
#else
|
||||
x4->out_pic.key_frame = pic_out.b_keyframe;
|
||||
#endif
|
||||
x4->out_pic.quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA;
|
||||
|
||||
return bufsize;
|
||||
}
|
||||
|
||||
static av_cold int
|
||||
X264_close(AVCodecContext *avctx)
|
||||
static av_cold int X264_close(AVCodecContext *avctx)
|
||||
{
|
||||
X264Context *x4 = avctx->priv_data;
|
||||
|
||||
av_freep(&avctx->extradata);
|
||||
av_free(x4->sei);
|
||||
|
||||
if(x4->enc)
|
||||
if (x4->enc)
|
||||
x264_encoder_close(x4->enc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int
|
||||
X264_init(AVCodecContext *avctx)
|
||||
static av_cold int X264_init(AVCodecContext *avctx)
|
||||
{
|
||||
X264Context *x4 = avctx->priv_data;
|
||||
|
||||
x4->sei_size = 0;
|
||||
x264_param_default(&x4->params);
|
||||
|
||||
x4->params.pf_log = X264_log;
|
||||
x4->params.p_log_private = avctx;
|
||||
x4->params.pf_log = X264_log;
|
||||
x4->params.p_log_private = avctx;
|
||||
|
||||
x4->params.i_keyint_max = avctx->gop_size;
|
||||
x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
|
||||
x4->params.i_keyint_max = avctx->gop_size;
|
||||
x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
|
||||
x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
|
||||
x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
|
||||
x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1;
|
||||
if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1;
|
||||
else{
|
||||
if(avctx->crf){
|
||||
x4->params.rc.i_rc_method = X264_RC_CRF;
|
||||
x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
|
||||
x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1;
|
||||
if (avctx->flags & CODEC_FLAG_PASS2) {
|
||||
x4->params.rc.b_stat_read = 1;
|
||||
} else {
|
||||
if (avctx->crf) {
|
||||
x4->params.rc.i_rc_method = X264_RC_CRF;
|
||||
x4->params.rc.f_rf_constant = avctx->crf;
|
||||
}else if(avctx->cqp > -1){
|
||||
x4->params.rc.i_rc_method = X264_RC_CQP;
|
||||
} else if (avctx->cqp > -1) {
|
||||
x4->params.rc.i_rc_method = X264_RC_CQP;
|
||||
x4->params.rc.i_qp_constant = avctx->cqp;
|
||||
}
|
||||
}
|
||||
|
||||
// if neither crf nor cqp modes are selected we have to enable the RC
|
||||
// we do it this way because we cannot check if the bitrate has been set
|
||||
if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.i_rc_method = X264_RC_ABR;
|
||||
if (!(avctx->crf || (avctx->cqp > -1)))
|
||||
x4->params.rc.i_rc_method = X264_RC_ABR;
|
||||
|
||||
x4->params.i_bframe = avctx->max_b_frames;
|
||||
x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC;
|
||||
x4->params.i_bframe = avctx->max_b_frames;
|
||||
x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC;
|
||||
x4->params.i_bframe_adaptive = avctx->b_frame_strategy;
|
||||
x4->params.i_bframe_bias = avctx->bframebias;
|
||||
x4->params.b_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID;
|
||||
avctx->has_b_frames= avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames;
|
||||
x4->params.i_bframe_bias = avctx->bframebias;
|
||||
#if X264_BUILD >= 78
|
||||
x4->params.i_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? X264_B_PYRAMID_NORMAL : X264_B_PYRAMID_NONE;
|
||||
#else
|
||||
x4->params.b_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID;
|
||||
#endif
|
||||
avctx->has_b_frames = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames;
|
||||
|
||||
x4->params.i_keyint_min = avctx->keyint_min;
|
||||
if(x4->params.i_keyint_min > x4->params.i_keyint_max)
|
||||
if (x4->params.i_keyint_min > x4->params.i_keyint_max)
|
||||
x4->params.i_keyint_min = x4->params.i_keyint_max;
|
||||
|
||||
x4->params.i_scenecut_threshold = avctx->scenechange_threshold;
|
||||
x4->params.i_scenecut_threshold = avctx->scenechange_threshold;
|
||||
|
||||
x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER;
|
||||
x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER;
|
||||
x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha;
|
||||
x4->params.i_deblocking_filter_beta = avctx->deblockbeta;
|
||||
x4->params.i_deblocking_filter_beta = avctx->deblockbeta;
|
||||
|
||||
x4->params.rc.i_qp_min = avctx->qmin;
|
||||
x4->params.rc.i_qp_max = avctx->qmax;
|
||||
x4->params.rc.i_qp_step = avctx->max_qdiff;
|
||||
x4->params.rc.i_qp_min = avctx->qmin;
|
||||
x4->params.rc.i_qp_max = avctx->qmax;
|
||||
x4->params.rc.i_qp_step = avctx->max_qdiff;
|
||||
|
||||
x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
|
||||
x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
|
||||
x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
|
||||
x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
|
||||
x4->params.rc.f_complexity_blur = avctx->complexityblur;
|
||||
|
||||
x4->params.i_frame_reference = avctx->refs;
|
||||
x4->params.i_frame_reference = avctx->refs;
|
||||
|
||||
x4->params.i_width = avctx->width;
|
||||
x4->params.i_height = avctx->height;
|
||||
x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num;
|
||||
x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den;
|
||||
x4->params.i_fps_num = avctx->time_base.den;
|
||||
x4->params.i_fps_den = avctx->time_base.num;
|
||||
x4->params.i_width = avctx->width;
|
||||
x4->params.i_height = avctx->height;
|
||||
x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num;
|
||||
x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den;
|
||||
#if X264_BUILD >= 81
|
||||
x4->params.i_fps_num = x4->params.i_timebase_den = avctx->time_base.den;
|
||||
x4->params.i_fps_den = x4->params.i_timebase_num = avctx->time_base.num;
|
||||
#endif
|
||||
|
||||
x4->params.analyse.inter = 0;
|
||||
if(avctx->partitions){
|
||||
if(avctx->partitions & X264_PART_I4X4)
|
||||
x4->params.analyse.inter = 0;
|
||||
if (avctx->partitions) {
|
||||
if (avctx->partitions & X264_PART_I4X4)
|
||||
x4->params.analyse.inter |= X264_ANALYSE_I4x4;
|
||||
if(avctx->partitions & X264_PART_I8X8)
|
||||
if (avctx->partitions & X264_PART_I8X8)
|
||||
x4->params.analyse.inter |= X264_ANALYSE_I8x8;
|
||||
if(avctx->partitions & X264_PART_P8X8)
|
||||
if (avctx->partitions & X264_PART_P8X8)
|
||||
x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16;
|
||||
if(avctx->partitions & X264_PART_P4X4)
|
||||
if (avctx->partitions & X264_PART_P4X4)
|
||||
x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8;
|
||||
if(avctx->partitions & X264_PART_B8X8)
|
||||
if (avctx->partitions & X264_PART_B8X8)
|
||||
x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16;
|
||||
}
|
||||
|
||||
x4->params.analyse.i_direct_mv_pred = avctx->directpred;
|
||||
x4->params.analyse.i_direct_mv_pred = avctx->directpred;
|
||||
|
||||
x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED;
|
||||
#if X264_BUILD >= 79
|
||||
x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred;
|
||||
#endif
|
||||
|
||||
if(avctx->me_method == ME_EPZS)
|
||||
if (avctx->me_method == ME_EPZS)
|
||||
x4->params.analyse.i_me_method = X264_ME_DIA;
|
||||
else if(avctx->me_method == ME_HEX)
|
||||
else if (avctx->me_method == ME_HEX)
|
||||
x4->params.analyse.i_me_method = X264_ME_HEX;
|
||||
else if(avctx->me_method == ME_UMH)
|
||||
else if (avctx->me_method == ME_UMH)
|
||||
x4->params.analyse.i_me_method = X264_ME_UMH;
|
||||
else if(avctx->me_method == ME_FULL)
|
||||
else if (avctx->me_method == ME_FULL)
|
||||
x4->params.analyse.i_me_method = X264_ME_ESA;
|
||||
else if(avctx->me_method == ME_TESA)
|
||||
else if (avctx->me_method == ME_TESA)
|
||||
x4->params.analyse.i_me_method = X264_ME_TESA;
|
||||
else x4->params.analyse.i_me_method = X264_ME_HEX;
|
||||
|
||||
x4->params.analyse.i_me_range = avctx->me_range;
|
||||
x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
|
||||
x4->params.analyse.i_me_range = avctx->me_range;
|
||||
x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
|
||||
|
||||
x4->params.analyse.b_mixed_references =
|
||||
avctx->flags2 & CODEC_FLAG2_MIXED_REFS;
|
||||
x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA;
|
||||
x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT;
|
||||
x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP;
|
||||
x4->params.analyse.b_mixed_references = avctx->flags2 & CODEC_FLAG2_MIXED_REFS;
|
||||
x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA;
|
||||
x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT;
|
||||
x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP;
|
||||
|
||||
x4->params.analyse.i_trellis = avctx->trellis;
|
||||
x4->params.analyse.i_noise_reduction = avctx->noise_reduction;
|
||||
x4->params.analyse.i_trellis = avctx->trellis;
|
||||
x4->params.analyse.i_noise_reduction = avctx->noise_reduction;
|
||||
|
||||
if(avctx->level > 0) x4->params.i_level_idc = avctx->level;
|
||||
if (avctx->level > 0)
|
||||
x4->params.i_level_idc = avctx->level;
|
||||
|
||||
x4->params.rc.f_rate_tolerance =
|
||||
(float)avctx->bit_rate_tolerance/avctx->bit_rate;
|
||||
|
||||
if((avctx->rc_buffer_size != 0) &&
|
||||
(avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){
|
||||
if ((avctx->rc_buffer_size != 0) &&
|
||||
(avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) {
|
||||
x4->params.rc.f_vbv_buffer_init =
|
||||
(float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size;
|
||||
}
|
||||
else x4->params.rc.f_vbv_buffer_init = 0.9;
|
||||
(float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size;
|
||||
} else
|
||||
x4->params.rc.f_vbv_buffer_init = 0.9;
|
||||
|
||||
x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor);
|
||||
x4->params.rc.f_pb_factor = avctx->b_quant_factor;
|
||||
#if X264_BUILD >= 69
|
||||
x4->params.rc.b_mb_tree = !!(avctx->flags2 & CODEC_FLAG2_MBTREE);
|
||||
#endif
|
||||
x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor);
|
||||
x4->params.rc.f_pb_factor = avctx->b_quant_factor;
|
||||
x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
|
||||
|
||||
x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR;
|
||||
x4->params.i_log_level = X264_LOG_DEBUG;
|
||||
x4->params.i_log_level = X264_LOG_DEBUG;
|
||||
|
||||
x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD;
|
||||
x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD;
|
||||
|
||||
x4->params.i_threads = avctx->thread_count;
|
||||
x4->params.i_threads = avctx->thread_count;
|
||||
|
||||
x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT;
|
||||
x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT;
|
||||
|
||||
if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){
|
||||
if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER)
|
||||
x4->params.b_repeat_headers = 0;
|
||||
}
|
||||
|
||||
x4->enc = x264_encoder_open(&x4->params);
|
||||
if(!x4->enc)
|
||||
if (!x4->enc)
|
||||
return -1;
|
||||
|
||||
avctx->coded_frame = &x4->out_pic;
|
||||
|
||||
#if X264_BUILD >= 76
|
||||
if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
|
||||
x264_nal_t *nal;
|
||||
int nnal, s;
|
||||
|
||||
s = x264_encoder_headers(x4->enc, &nal, &nnal);
|
||||
|
||||
avctx->extradata = av_malloc(s);
|
||||
avctx->extradata_size = encode_nals(avctx, avctx->extradata, s, nal, nnal, 1);
|
||||
}
|
||||
#else
|
||||
if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){
|
||||
x264_nal_t *nal;
|
||||
int nnal, i, s = 0;
|
||||
@@ -280,25 +352,26 @@ X264_init(AVCodecContext *avctx)
|
||||
x264_encoder_headers(x4->enc, &nal, &nnal);
|
||||
|
||||
/* 5 bytes NAL header + worst case escaping */
|
||||
for(i = 0; i < nnal; i++)
|
||||
s += 5 + nal[i].i_payload * 4 / 3;
|
||||
for (i = 0; i < nnal; i++)
|
||||
s += 5 + nal[i].i_payload * 4 / 3;
|
||||
|
||||
avctx->extradata = av_malloc(s);
|
||||
avctx->extradata_size = encode_nals(avctx->extradata, s, nal, nnal);
|
||||
avctx->extradata_size = encode_nals(avctx, avctx->extradata, s, nal, nnal, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec libx264_encoder = {
|
||||
.name = "libx264",
|
||||
.type = CODEC_TYPE_VIDEO,
|
||||
.id = CODEC_ID_H264,
|
||||
.name = "libx264",
|
||||
.type = CODEC_TYPE_VIDEO,
|
||||
.id = CODEC_ID_H264,
|
||||
.priv_data_size = sizeof(X264Context),
|
||||
.init = X264_init,
|
||||
.encode = X264_frame,
|
||||
.close = X264_close,
|
||||
.capabilities = CODEC_CAP_DELAY,
|
||||
.pix_fmts = (enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE },
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
|
||||
.init = X264_init,
|
||||
.encode = X264_frame,
|
||||
.close = X264_close,
|
||||
.capabilities = CODEC_CAP_DELAY,
|
||||
.pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE },
|
||||
.long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
|
||||
};
|
||||
|
@@ -878,7 +878,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
|
||||
|
||||
length = (AV_RB16(buf) & 0xfff) * 2;
|
||||
|
||||
if (length > buf_size)
|
||||
if (length < 4 || length > buf_size)
|
||||
return -1;
|
||||
|
||||
init_get_bits(&gb, (buf + 4), (length - 4) * 8);
|
||||
|
@@ -2287,6 +2287,10 @@ retry:
|
||||
avctx->bit_rate = s->bit_rate;
|
||||
avctx->sub_id = s->layer;
|
||||
|
||||
if(*data_size < 1152*avctx->channels*sizeof(OUT_INT))
|
||||
return -1;
|
||||
*data_size = 0;
|
||||
|
||||
if(s->frame_size<=0 || s->frame_size > buf_size){
|
||||
av_log(avctx, AV_LOG_ERROR, "incomplete frame\n");
|
||||
return -1;
|
||||
@@ -2470,6 +2474,9 @@ static int decode_frame_mp3on4(AVCodecContext * avctx,
|
||||
OUT_INT *outptr, *bp;
|
||||
int fr, j, n;
|
||||
|
||||
if(*data_size < MPA_FRAME_SIZE * MPA_MAX_CHANNELS * s->frames * sizeof(OUT_INT))
|
||||
return -1;
|
||||
|
||||
*data_size = 0;
|
||||
// Discard too short frames
|
||||
if (buf_size < HEADER_SIZE)
|
||||
|
@@ -122,6 +122,7 @@ static const AVOption options[]={
|
||||
{"b_qfactor", "qp factor between p and b frames", OFFSET(b_quant_factor), FF_OPT_TYPE_FLOAT, 1.25, -FLT_MAX, FLT_MAX, V|E},
|
||||
{"rc_strategy", "ratecontrol method", OFFSET(rc_strategy), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"b_strategy", "strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E},
|
||||
{"wpredp", "weighted prediction analysis method", OFFSET(weighted_p_pred), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E},
|
||||
{"hurry_up", NULL, OFFSET(hurry_up), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D},
|
||||
{"ps", "rtp payload size in bits", OFFSET(rtp_payload_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"mv_bits", NULL, OFFSET(mv_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
|
||||
@@ -388,6 +389,7 @@ static const AVOption options[]={
|
||||
{"request_channels", "set desired number of audio channels", OFFSET(request_channels), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, A|D},
|
||||
{"drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), FF_OPT_TYPE_FLOAT, 1.0, 0.0, 1.0, A|D},
|
||||
{"reservoir", "use bit reservoir", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_BIT_RESERVOIR, INT_MIN, INT_MAX, A|E, "flags2"},
|
||||
{"mbtree", "use macroblock tree ratecontrol (x264 only)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_MBTREE, INT_MIN, INT_MAX, V|E, "flags2"},
|
||||
{"bits_per_raw_sample", NULL, OFFSET(bits_per_raw_sample), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
|
||||
{"channel_layout", NULL, OFFSET(channel_layout), FF_OPT_TYPE_INT64, DEFAULT, 0, INT64_MAX, A|E|D, "channel_layout"},
|
||||
{"request_channel_layout", NULL, OFFSET(request_channel_layout), FF_OPT_TYPE_INT64, DEFAULT, 0, INT64_MAX, A|D, "request_channel_layout"},
|
||||
|
@@ -63,7 +63,7 @@ int has_altivec(void)
|
||||
|
||||
if (err == 0) return has_vu != 0;
|
||||
return 0;
|
||||
#elif defined(RUNTIME_CPUDETECT)
|
||||
#elif CONFIG_RUNTIME_CPUDETECT
|
||||
int proc_ver;
|
||||
// Support of mfspr PVR emulation added in Linux 2.6.17.
|
||||
__asm__ volatile("mfspr %0, 287" : "=r" (proc_ver));
|
||||
|
@@ -1626,6 +1626,7 @@ static int alloc_blocks(SnowContext *s){
|
||||
s->b_width = w;
|
||||
s->b_height= h;
|
||||
|
||||
av_free(s->block);
|
||||
s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
|
||||
return 0;
|
||||
}
|
||||
@@ -3554,7 +3555,7 @@ static void decode_qlogs(SnowContext *s){
|
||||
}
|
||||
|
||||
static int decode_header(SnowContext *s){
|
||||
int plane_index;
|
||||
int plane_index, tmp;
|
||||
uint8_t kstate[32];
|
||||
|
||||
memset(kstate, MID_STATE, sizeof(kstate));
|
||||
@@ -3583,7 +3584,12 @@ static int decode_header(SnowContext *s){
|
||||
s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
|
||||
s->spatial_scalability= get_rac(&s->c, s->header_state);
|
||||
// s->rate_scalability= get_rac(&s->c, s->header_state);
|
||||
s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1;
|
||||
tmp= get_symbol(&s->c, s->header_state, 0)+1;
|
||||
if(tmp < 1 || tmp > MAX_REF_FRAMES){
|
||||
av_log(s->avctx, AV_LOG_ERROR, "reference frame count is %d\n", tmp);
|
||||
return -1;
|
||||
}
|
||||
s->max_ref_frames= tmp;
|
||||
|
||||
decode_qlogs(s);
|
||||
}
|
||||
@@ -3649,6 +3655,7 @@ static av_cold int common_init(AVCodecContext *avctx){
|
||||
int i, j;
|
||||
|
||||
s->avctx= avctx;
|
||||
s->max_ref_frames=1; //just make sure its not an invalid value in case of no initial keyframe
|
||||
|
||||
dsputil_init(&s->dsp, avctx);
|
||||
|
||||
@@ -4509,7 +4516,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const
|
||||
&& p->hcoeff[2]==2;
|
||||
}
|
||||
|
||||
if(!s->block) alloc_blocks(s);
|
||||
alloc_blocks(s);
|
||||
|
||||
frame_start(s);
|
||||
//keyframe flag duplication mess FIXME
|
||||
|
@@ -65,6 +65,8 @@ const uint8_t ff_reverse[256]={
|
||||
};
|
||||
|
||||
static int volatile entangled_thread_counter=0;
|
||||
int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op);
|
||||
static void *codec_mutex;
|
||||
|
||||
void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
|
||||
{
|
||||
@@ -420,6 +422,12 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||
{
|
||||
int ret= -1;
|
||||
|
||||
/* If there is a user-supplied mutex locking routine, call it. */
|
||||
if (ff_lockmgr_cb) {
|
||||
if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
|
||||
return -1;
|
||||
}
|
||||
|
||||
entangled_thread_counter++;
|
||||
if(entangled_thread_counter != 1){
|
||||
av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
|
||||
@@ -464,6 +472,11 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||
ret=0;
|
||||
end:
|
||||
entangled_thread_counter--;
|
||||
|
||||
/* Release any user-supplied mutex. */
|
||||
if (ff_lockmgr_cb) {
|
||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -583,6 +596,12 @@ int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
|
||||
|
||||
int avcodec_close(AVCodecContext *avctx)
|
||||
{
|
||||
/* If there is a user-supplied mutex locking routine, call it. */
|
||||
if (ff_lockmgr_cb) {
|
||||
if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
|
||||
return -1;
|
||||
}
|
||||
|
||||
entangled_thread_counter++;
|
||||
if(entangled_thread_counter != 1){
|
||||
av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
|
||||
@@ -598,6 +617,11 @@ int avcodec_close(AVCodecContext *avctx)
|
||||
av_freep(&avctx->priv_data);
|
||||
avctx->codec = NULL;
|
||||
entangled_thread_counter--;
|
||||
|
||||
/* Release any user-supplied mutex. */
|
||||
if (ff_lockmgr_cb) {
|
||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1152,3 +1176,19 @@ AVHWAccel *ff_find_hwaccel(enum CodecID codec_id, enum PixelFormat pix_fmt)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
|
||||
{
|
||||
if (ff_lockmgr_cb) {
|
||||
if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY))
|
||||
return -1;
|
||||
}
|
||||
|
||||
ff_lockmgr_cb = cb;
|
||||
|
||||
if (ff_lockmgr_cb) {
|
||||
if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_CREATE))
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@@ -45,6 +45,9 @@ unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n) { // x^(1/n)
|
||||
|
||||
// Generate vlc codes from vorbis huffman code lengths
|
||||
|
||||
// the two bits[p] > 32 checks should be redundant, all calling code should
|
||||
// already ensure that, but since it allows overwriting the stack it seems
|
||||
// reasonable to check redundantly.
|
||||
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) {
|
||||
uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
@@ -63,6 +66,7 @@ int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) {
|
||||
}
|
||||
|
||||
codes[p]=0;
|
||||
if (bits[p] > 32) return 1;
|
||||
for(i=0;i<bits[p];++i) {
|
||||
exit_at_level[i+1]=1<<i;
|
||||
}
|
||||
@@ -79,6 +83,7 @@ int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) {
|
||||
++p;
|
||||
|
||||
for(;p<num;++p) {
|
||||
if (bits[p] > 32) return 1;
|
||||
if (bits[p]==0) continue;
|
||||
// find corresponding exit(node which the tree can grow further from)
|
||||
for(i=bits[p];i>0;--i) {
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#define V_NB_BITS 8
|
||||
#define V_NB_BITS2 11
|
||||
#define V_MAX_VLCS (1<<16)
|
||||
#define V_MAX_PARTITIONS (1<<20)
|
||||
|
||||
#ifndef V_DEBUG
|
||||
#define AV_DEBUG(...)
|
||||
@@ -249,8 +250,8 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
|
||||
}
|
||||
|
||||
codebook_setup->dimensions=get_bits(gb, 16);
|
||||
if (codebook_setup->dimensions>16) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is too large (%d). \n", cb, codebook_setup->dimensions);
|
||||
if (codebook_setup->dimensions>16||codebook_setup->dimensions==0) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is invalid (%d). \n", cb, codebook_setup->dimensions);
|
||||
goto error;
|
||||
}
|
||||
entries=get_bits(gb, 24);
|
||||
@@ -492,13 +493,23 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {
|
||||
AV_DEBUG(" %d floor %d class dim: %d subclasses %d \n", i, j, floor_setup->data.t1.class_dimensions[j], floor_setup->data.t1.class_subclasses[j]);
|
||||
|
||||
if (floor_setup->data.t1.class_subclasses[j]) {
|
||||
floor_setup->data.t1.class_masterbook[j]=get_bits(gb, 8);
|
||||
int bits=get_bits(gb, 8);
|
||||
if (bits>=vc->codebook_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Masterbook index %d is out of range.\n", bits);
|
||||
return 1;
|
||||
}
|
||||
floor_setup->data.t1.class_masterbook[j]=bits;
|
||||
|
||||
AV_DEBUG(" masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]);
|
||||
}
|
||||
|
||||
for(k=0;k<(1<<floor_setup->data.t1.class_subclasses[j]);++k) {
|
||||
floor_setup->data.t1.subclass_books[j][k]=(int16_t)get_bits(gb, 8)-1;
|
||||
int16_t bits=get_bits(gb, 8)-1;
|
||||
if (bits!=-1 && bits>=vc->codebook_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Subclass book index %d is out of range.\n", bits);
|
||||
return 1;
|
||||
}
|
||||
floor_setup->data.t1.subclass_books[j][k]=bits;
|
||||
|
||||
AV_DEBUG(" book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]);
|
||||
}
|
||||
@@ -558,12 +569,11 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {
|
||||
uint_fast8_t book_idx;
|
||||
for (idx=0;idx<floor_setup->data.t0.num_books;++idx) {
|
||||
book_idx=get_bits(gb, 8);
|
||||
if (book_idx>=vc->codebook_count)
|
||||
return 1;
|
||||
floor_setup->data.t0.book_list[idx]=book_idx;
|
||||
if (vc->codebooks[book_idx].dimensions > max_codebook_dim)
|
||||
max_codebook_dim=vc->codebooks[book_idx].dimensions;
|
||||
|
||||
if (floor_setup->data.t0.book_list[idx]>vc->codebook_count)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -634,8 +644,20 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc){
|
||||
res_setup->begin=get_bits(gb, 24);
|
||||
res_setup->end=get_bits(gb, 24);
|
||||
res_setup->partition_size=get_bits(gb, 24)+1;
|
||||
/* Validations to prevent a buffer overflow later. */
|
||||
if (res_setup->begin>res_setup->end
|
||||
|| res_setup->end>vc->blocksize[1]/(res_setup->type==2?1:2)
|
||||
|| (res_setup->end-res_setup->begin)/res_setup->partition_size>V_MAX_PARTITIONS) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "partition out of bounds: type, begin, end, size, blocksize: %d, %d, %d, %d, %d\n", res_setup->type, res_setup->begin, res_setup->end, res_setup->partition_size, vc->blocksize[1]/2);
|
||||
return 1;
|
||||
}
|
||||
|
||||
res_setup->classifications=get_bits(gb, 6)+1;
|
||||
res_setup->classbook=get_bits(gb, 8);
|
||||
if (res_setup->classbook>=vc->codebook_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "classbook value %d out of range. \n", res_setup->classbook);
|
||||
return 1;
|
||||
}
|
||||
|
||||
AV_DEBUG(" begin %d end %d part.size %d classif.s %d classbook %d \n", res_setup->begin, res_setup->end, res_setup->partition_size,
|
||||
res_setup->classifications, res_setup->classbook);
|
||||
@@ -655,7 +677,12 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc){
|
||||
for(j=0;j<res_setup->classifications;++j) {
|
||||
for(k=0;k<8;++k) {
|
||||
if (cascade[j]&(1<<k)) {
|
||||
res_setup->books[j][k]=get_bits(gb, 8);
|
||||
int bits=get_bits(gb, 8);
|
||||
if (bits>=vc->codebook_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "book value %d out of range. \n", bits);
|
||||
return 1;
|
||||
}
|
||||
res_setup->books[j][k]=bits;
|
||||
|
||||
AV_DEBUG(" %d class casscade depth %d book: %d \n", j, k, res_setup->books[j][k]);
|
||||
|
||||
@@ -702,7 +729,14 @@ static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) {
|
||||
for(j=0;j<mapping_setup->coupling_steps;++j) {
|
||||
mapping_setup->magnitude[j]=get_bits(gb, ilog(vc->audio_channels-1));
|
||||
mapping_setup->angle[j]=get_bits(gb, ilog(vc->audio_channels-1));
|
||||
// FIXME: sanity checks
|
||||
if (mapping_setup->magnitude[j]>=vc->audio_channels) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "magnitude channel %d out of range. \n", mapping_setup->magnitude[j]);
|
||||
return 1;
|
||||
}
|
||||
if (mapping_setup->angle[j]>=vc->audio_channels) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "angle channel %d out of range. \n", mapping_setup->angle[j]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mapping_setup->coupling_steps=0;
|
||||
@@ -723,9 +757,20 @@ static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) {
|
||||
}
|
||||
|
||||
for(j=0;j<mapping_setup->submaps;++j) {
|
||||
int bits;
|
||||
skip_bits(gb, 8); // FIXME check?
|
||||
mapping_setup->submap_floor[j]=get_bits(gb, 8);
|
||||
mapping_setup->submap_residue[j]=get_bits(gb, 8);
|
||||
bits=get_bits(gb, 8);
|
||||
if (bits>=vc->floor_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "submap floor value %d out of range. \n", bits);
|
||||
return -1;
|
||||
}
|
||||
mapping_setup->submap_floor[j]=bits;
|
||||
bits=get_bits(gb, 8);
|
||||
if (bits>=vc->residue_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "submap residue value %d out of range. \n", bits);
|
||||
return -1;
|
||||
}
|
||||
mapping_setup->submap_residue[j]=bits;
|
||||
|
||||
AV_DEBUG(" %d mapping %d submap : floor %d, residue %d \n", i, j, mapping_setup->submap_floor[j], mapping_setup->submap_residue[j]);
|
||||
}
|
||||
@@ -788,7 +833,11 @@ static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) {
|
||||
mode_setup->blockflag=get_bits1(gb);
|
||||
mode_setup->windowtype=get_bits(gb, 16); //FIXME check
|
||||
mode_setup->transformtype=get_bits(gb, 16); //FIXME check
|
||||
mode_setup->mapping=get_bits(gb, 8); //FIXME check
|
||||
mode_setup->mapping=get_bits(gb, 8);
|
||||
if (mode_setup->mapping>=vc->mapping_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "mode mapping value %d out of range. \n", mode_setup->mapping);
|
||||
return 1;
|
||||
}
|
||||
|
||||
AV_DEBUG(" %d mode: blockflag %d, windowtype %d, transformtype %d, mapping %d \n", i, mode_setup->blockflag, mode_setup->windowtype, mode_setup->transformtype, mode_setup->mapping);
|
||||
}
|
||||
@@ -853,8 +902,16 @@ static int vorbis_parse_id_hdr(vorbis_context *vc){
|
||||
}
|
||||
|
||||
vc->version=get_bits_long(gb, 32); //FIXME check 0
|
||||
vc->audio_channels=get_bits(gb, 8); //FIXME check >0
|
||||
vc->audio_samplerate=get_bits_long(gb, 32); //FIXME check >0
|
||||
vc->audio_channels=get_bits(gb, 8);
|
||||
if(vc->audio_channels <= 0){
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Invalid number of channels\n");
|
||||
return -1;
|
||||
}
|
||||
vc->audio_samplerate=get_bits_long(gb, 32);
|
||||
if(vc->audio_samplerate <= 0){
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Invalid samplerate\n");
|
||||
return -1;
|
||||
}
|
||||
vc->bitrate_maximum=get_bits_long(gb, 32);
|
||||
vc->bitrate_nominal=get_bits_long(gb, 32);
|
||||
vc->bitrate_minimum=get_bits_long(gb, 32);
|
||||
@@ -1448,6 +1505,10 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
|
||||
} else {
|
||||
mode_number=get_bits(gb, ilog(vc->mode_count-1));
|
||||
}
|
||||
if (mode_number>=vc->mode_count) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "mode number %d out of range.\n", mode_number);
|
||||
return -1;
|
||||
}
|
||||
vc->mode_number=mode_number;
|
||||
mapping=&vc->mappings[vc->modes[mode_number].mapping];
|
||||
|
||||
@@ -1492,7 +1553,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
|
||||
uint_fast8_t ch=0;
|
||||
|
||||
for(j=0;j<vc->audio_channels;++j) {
|
||||
if ((mapping->submaps==1) || (i=mapping->mux[j])) {
|
||||
if ((mapping->submaps==1) || (i==mapping->mux[j])) {
|
||||
res_chan[j]=res_num;
|
||||
if (no_residue[j]) {
|
||||
do_not_decode[ch]=1;
|
||||
|
@@ -43,6 +43,8 @@
|
||||
|
||||
#define FRAGMENT_PIXELS 8
|
||||
|
||||
static av_cold int vp3_decode_end(AVCodecContext *avctx);
|
||||
|
||||
typedef struct Coeff {
|
||||
struct Coeff *next;
|
||||
DCTELEM coeff;
|
||||
@@ -1684,6 +1686,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
|
||||
s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65);
|
||||
s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int));
|
||||
s->pixel_addresses_initialized = 0;
|
||||
if (!s->superblock_coding || !s->all_fragments || !s->coeff_counts ||
|
||||
!s->coeffs || !s->coded_fragment_list) {
|
||||
vp3_decode_end(avctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!s->theora_tables)
|
||||
{
|
||||
@@ -1737,29 +1744,34 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
|
||||
for (i = 0; i < 16; i++) {
|
||||
|
||||
/* DC histograms */
|
||||
init_vlc(&s->dc_vlc[i], 5, 32,
|
||||
if (init_vlc(&s->dc_vlc[i], 5, 32,
|
||||
&s->huffman_table[i][0][1], 4, 2,
|
||||
&s->huffman_table[i][0][0], 4, 2, 0);
|
||||
&s->huffman_table[i][0][0], 4, 2, 0) < 0)
|
||||
goto vlc_fail;
|
||||
|
||||
/* group 1 AC histograms */
|
||||
init_vlc(&s->ac_vlc_1[i], 5, 32,
|
||||
if (init_vlc(&s->ac_vlc_1[i], 5, 32,
|
||||
&s->huffman_table[i+16][0][1], 4, 2,
|
||||
&s->huffman_table[i+16][0][0], 4, 2, 0);
|
||||
&s->huffman_table[i+16][0][0], 4, 2, 0) < 0)
|
||||
goto vlc_fail;
|
||||
|
||||
/* group 2 AC histograms */
|
||||
init_vlc(&s->ac_vlc_2[i], 5, 32,
|
||||
if (init_vlc(&s->ac_vlc_2[i], 5, 32,
|
||||
&s->huffman_table[i+16*2][0][1], 4, 2,
|
||||
&s->huffman_table[i+16*2][0][0], 4, 2, 0);
|
||||
&s->huffman_table[i+16*2][0][0], 4, 2, 0) < 0)
|
||||
goto vlc_fail;
|
||||
|
||||
/* group 3 AC histograms */
|
||||
init_vlc(&s->ac_vlc_3[i], 5, 32,
|
||||
if (init_vlc(&s->ac_vlc_3[i], 5, 32,
|
||||
&s->huffman_table[i+16*3][0][1], 4, 2,
|
||||
&s->huffman_table[i+16*3][0][0], 4, 2, 0);
|
||||
&s->huffman_table[i+16*3][0][0], 4, 2, 0) < 0)
|
||||
goto vlc_fail;
|
||||
|
||||
/* group 4 AC histograms */
|
||||
init_vlc(&s->ac_vlc_4[i], 5, 32,
|
||||
if (init_vlc(&s->ac_vlc_4[i], 5, 32,
|
||||
&s->huffman_table[i+16*4][0][1], 4, 2,
|
||||
&s->huffman_table[i+16*4][0][0], 4, 2, 0);
|
||||
&s->huffman_table[i+16*4][0][0], 4, 2, 0) < 0)
|
||||
goto vlc_fail;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1784,6 +1796,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
|
||||
s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int));
|
||||
s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int));
|
||||
s->macroblock_coding = av_malloc(s->macroblock_count + 1);
|
||||
if (!s->superblock_fragments || !s->superblock_macroblocks ||
|
||||
!s->macroblock_fragments || !s->macroblock_coding) {
|
||||
vp3_decode_end(avctx);
|
||||
return -1;
|
||||
}
|
||||
init_block_mapping(s);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
@@ -1793,6 +1810,10 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
vlc_fail:
|
||||
av_log(avctx, AV_LOG_FATAL, "Invalid huffman table\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2231,7 +2252,7 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
for(i=0;i<3;i++) {
|
||||
init_get_bits(&gb, header_start[i], header_len[i]);
|
||||
init_get_bits(&gb, header_start[i], header_len[i] * 8);
|
||||
|
||||
ptype = get_bits(&gb, 8);
|
||||
|
||||
|
4
libavdevice/libavdevice.v
Normal file
4
libavdevice/libavdevice.v
Normal file
@@ -0,0 +1,4 @@
|
||||
LIBAVDEVICE_$MAJOR {
|
||||
global: avdevice_*;
|
||||
local: *;
|
||||
};
|
4
libavfilter/libavfilter.v
Normal file
4
libavfilter/libavfilter.v
Normal file
@@ -0,0 +1,4 @@
|
||||
LIBAVFILTER_$MAJOR {
|
||||
global: avfilter_*; av_*;
|
||||
local: *;
|
||||
};
|
@@ -80,7 +80,6 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
uint32_t seqno;
|
||||
unsigned int packet_size;
|
||||
int is_streamed;
|
||||
int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID
|
||||
ASFStream streams[128]; ///< it's max number and it's not that big
|
||||
|
@@ -212,7 +212,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
asf->hdr.min_pktsize = get_le32(pb);
|
||||
asf->hdr.max_pktsize = get_le32(pb);
|
||||
asf->hdr.max_bitrate = get_le32(pb);
|
||||
asf->packet_size = asf->hdr.max_pktsize;
|
||||
s->packet_size = asf->hdr.max_pktsize;
|
||||
} else if (!memcmp(&g, &ff_asf_stream_header, sizeof(GUID))) {
|
||||
enum CodecType type;
|
||||
int type_specific_size, sizeX;
|
||||
@@ -555,7 +555,9 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
||||
int rsize = 8;
|
||||
int c, d, e, off;
|
||||
|
||||
off= (url_ftell(pb) - s->data_offset) % asf->packet_size + 3;
|
||||
off= 32768;
|
||||
if (s->packet_size > 0)
|
||||
off= (url_ftell(pb) - s->data_offset) % s->packet_size + 3;
|
||||
|
||||
c=d=e=-1;
|
||||
while(off-- > 0){
|
||||
@@ -585,12 +587,12 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
||||
asf->packet_flags = c;
|
||||
asf->packet_property = d;
|
||||
|
||||
DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size);
|
||||
DO_2BITS(asf->packet_flags >> 5, packet_length, s->packet_size);
|
||||
DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored
|
||||
DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length
|
||||
|
||||
//the following checks prevent overflows and infinite loops
|
||||
if(packet_length >= (1U<<29)){
|
||||
if(!packet_length || packet_length >= (1U<<29)){
|
||||
av_log(s, AV_LOG_ERROR, "invalid packet_length %d at:%"PRId64"\n", packet_length, url_ftell(pb));
|
||||
return -1;
|
||||
}
|
||||
@@ -614,7 +616,7 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
||||
if (packet_length < asf->hdr.min_pktsize)
|
||||
padsize += asf->hdr.min_pktsize - packet_length;
|
||||
asf->packet_padsize = padsize;
|
||||
dprintf(s, "packet: size=%d padsize=%d left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left);
|
||||
dprintf(s, "packet: size=%d padsize=%d left=%d\n", s->packet_size, asf->packet_padsize, asf->packet_size_left);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -786,7 +788,7 @@ int ff_asf_parse_packet(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt)
|
||||
|
||||
/* read data */
|
||||
//printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n",
|
||||
// asf->packet_size, asf_st->pkt.size, asf->packet_frag_offset,
|
||||
// s->packet_size, asf_st->pkt.size, asf->packet_frag_offset,
|
||||
// asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data);
|
||||
asf->packet_size_left -= asf->packet_frag_size;
|
||||
if (asf->packet_size_left < 0)
|
||||
@@ -929,7 +931,6 @@ static int asf_read_close(AVFormatContext *s)
|
||||
|
||||
static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
|
||||
{
|
||||
ASFContext *asf = s->priv_data;
|
||||
AVPacket pkt1, *pkt = &pkt1;
|
||||
ASFStream *asf_st;
|
||||
int64_t pts;
|
||||
@@ -941,7 +942,8 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos,
|
||||
start_pos[i]= pos;
|
||||
}
|
||||
|
||||
pos= (pos+asf->packet_size-1-s->data_offset)/asf->packet_size*asf->packet_size+ s->data_offset;
|
||||
if (s->packet_size > 0)
|
||||
pos= (pos+s->packet_size-1-s->data_offset)/s->packet_size*s->packet_size+ s->data_offset;
|
||||
*ppos= pos;
|
||||
url_fseek(s->pb, pos, SEEK_SET);
|
||||
|
||||
@@ -961,7 +963,7 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos,
|
||||
|
||||
asf_st= s->streams[i]->priv_data;
|
||||
|
||||
// assert((asf_st->packet_pos - s->data_offset) % asf->packet_size == 0);
|
||||
// assert((asf_st->packet_pos - s->data_offset) % s->packet_size == 0);
|
||||
pos= asf_st->packet_pos;
|
||||
|
||||
av_add_index_entry(s->streams[i], pos, pts, pkt->size, pos - start_pos[i] + 1, AVINDEX_KEYFRAME);
|
||||
@@ -1004,10 +1006,10 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
|
||||
int pktct =get_le16(s->pb);
|
||||
av_log(s, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct);
|
||||
|
||||
pos=s->data_offset + asf->packet_size*(int64_t)pktnum;
|
||||
pos=s->data_offset + s->packet_size*(int64_t)pktnum;
|
||||
index_pts=av_rescale(itime, i, 10000);
|
||||
|
||||
av_add_index_entry(s->streams[stream_index], pos, index_pts, asf->packet_size, 0, AVINDEX_KEYFRAME);
|
||||
av_add_index_entry(s->streams[stream_index], pos, index_pts, s->packet_size, 0, AVINDEX_KEYFRAME);
|
||||
}
|
||||
asf->index_read= 1;
|
||||
}
|
||||
@@ -1021,7 +1023,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int
|
||||
int64_t pos;
|
||||
int index;
|
||||
|
||||
if (asf->packet_size <= 0)
|
||||
if (s->packet_size <= 0)
|
||||
return -1;
|
||||
|
||||
/* Try using the protocol's read_seek if available */
|
||||
|
@@ -321,8 +321,8 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data
|
||||
put_le64(pb, asf->duration); /* duration (in 100ns units) */
|
||||
put_le64(pb, PREROLL_TIME); /* start time stamp */
|
||||
put_le32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */
|
||||
put_le32(pb, asf->packet_size); /* packet size */
|
||||
put_le32(pb, asf->packet_size); /* packet size */
|
||||
put_le32(pb, s->packet_size); /* packet size */
|
||||
put_le32(pb, s->packet_size); /* packet size */
|
||||
put_le32(pb, bit_rate); /* Nominal data rate in bps */
|
||||
end_header(pb, hpos);
|
||||
|
||||
@@ -514,7 +514,7 @@ static int asf_write_header(AVFormatContext *s)
|
||||
{
|
||||
ASFContext *asf = s->priv_data;
|
||||
|
||||
asf->packet_size = PACKET_SIZE;
|
||||
s->packet_size = PACKET_SIZE;
|
||||
asf->nb_packets = 0;
|
||||
|
||||
asf->last_indexed_pts = 0;
|
||||
@@ -536,7 +536,7 @@ static int asf_write_header(AVFormatContext *s)
|
||||
asf->packet_nb_payloads = 0;
|
||||
asf->packet_timestamp_start = -1;
|
||||
asf->packet_timestamp_end = -1;
|
||||
init_put_byte(&asf->pb, asf->packet_buf, asf->packet_size, 1,
|
||||
init_put_byte(&asf->pb, asf->packet_buf, s->packet_size, 1,
|
||||
NULL, NULL, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
@@ -612,7 +612,7 @@ static void flush_packet(AVFormatContext *s)
|
||||
assert(asf->packet_timestamp_end >= asf->packet_timestamp_start);
|
||||
|
||||
if (asf->is_streamed) {
|
||||
put_chunk(s, 0x4424, asf->packet_size, 0);
|
||||
put_chunk(s, 0x4424, s->packet_size, 0);
|
||||
}
|
||||
|
||||
packet_hdr_size = put_payload_parsing_info(
|
||||
@@ -627,14 +627,14 @@ static void flush_packet(AVFormatContext *s)
|
||||
assert(packet_hdr_size <= asf->packet_size_left);
|
||||
memset(asf->packet_buf + packet_filled_size, 0, asf->packet_size_left);
|
||||
|
||||
put_buffer(s->pb, asf->packet_buf, asf->packet_size - packet_hdr_size);
|
||||
put_buffer(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
|
||||
|
||||
put_flush_packet(s->pb);
|
||||
asf->nb_packets++;
|
||||
asf->packet_nb_payloads = 0;
|
||||
asf->packet_timestamp_start = -1;
|
||||
asf->packet_timestamp_end = -1;
|
||||
init_put_byte(&asf->pb, asf->packet_buf, asf->packet_size, 1,
|
||||
init_put_byte(&asf->pb, asf->packet_buf, s->packet_size, 1,
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
@@ -1035,7 +1035,7 @@ AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base,
|
||||
* @param pts_den denominator to convert to seconds (MPEG: 90000)
|
||||
*/
|
||||
void av_set_pts_info(AVStream *s, int pts_wrap_bits,
|
||||
int pts_num, int pts_den);
|
||||
unsigned int pts_num, unsigned int pts_den);
|
||||
|
||||
#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
|
||||
#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes
|
||||
|
@@ -27,6 +27,13 @@
|
||||
|
||||
#define IO_BUFFER_SIZE 32768
|
||||
|
||||
/**
|
||||
* Do seeks within this distance ahead of the current buffer by skipping
|
||||
* data instead of calling the protocol seek function, for seekable
|
||||
* protocols.
|
||||
*/
|
||||
#define SHORT_SEEK_THRESHOLD 4096
|
||||
|
||||
static void fill_buffer(ByteIOContext *s);
|
||||
|
||||
int init_put_byte(ByteIOContext *s,
|
||||
@@ -151,8 +158,9 @@ int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence)
|
||||
offset1 >= 0 && offset1 < (s->buf_end - s->buffer)) {
|
||||
/* can do the seek inside the buffer */
|
||||
s->buf_ptr = s->buffer + offset1;
|
||||
} else if(s->is_streamed && !s->write_flag &&
|
||||
offset1 >= 0 && offset1 < (s->buf_end - s->buffer) + (1<<16)){
|
||||
} else if ((s->is_streamed ||
|
||||
offset1 <= s->buf_end + SHORT_SEEK_THRESHOLD - s->buffer) &&
|
||||
!s->write_flag && offset1 >= 0) {
|
||||
while(s->pos < offset && !s->eof_reached)
|
||||
fill_buffer(s);
|
||||
if (s->eof_reached)
|
||||
|
@@ -313,6 +313,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
int64_t dts, pts = AV_NOPTS_VALUE;
|
||||
AVStream *st = NULL;
|
||||
|
||||
retry:
|
||||
for(;;){
|
||||
pos = url_ftell(s->pb);
|
||||
url_fskip(s->pb, 4); /* size of previous packet */
|
||||
@@ -348,7 +349,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
|
||||
skip:
|
||||
url_fseek(s->pb, next, SEEK_SET);
|
||||
return AVERROR(EAGAIN);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* skip empty data packets */
|
||||
@@ -372,7 +373,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
|| st->discard >= AVDISCARD_ALL
|
||||
){
|
||||
url_fseek(s->pb, next, SEEK_SET);
|
||||
return AVERROR(EAGAIN);
|
||||
continue;
|
||||
}
|
||||
if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
|
||||
av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
|
||||
@@ -435,7 +436,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
st->codec->channels, st->codec->sample_rate);
|
||||
}
|
||||
|
||||
return AVERROR(EAGAIN);
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
|
3
libavformat/libavformat.v
Normal file
3
libavformat/libavformat.v
Normal file
@@ -0,0 +1,3 @@
|
||||
LIBAVFORMAT_$MAJOR {
|
||||
global: *;
|
||||
};
|
@@ -238,10 +238,15 @@ static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
int entries, i, j;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_be32(pb); // version + flags
|
||||
entries = get_be32(pb);
|
||||
if (entries >= UINT_MAX / sizeof(*sc->drefs))
|
||||
@@ -381,9 +386,13 @@ static const AVCodecTag mp4_audio_types[] = {
|
||||
|
||||
static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
AVStream *st;
|
||||
int tag, len;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
get_be32(pb); /* version + flags */
|
||||
len = mp4_read_descr(c, pb, &tag);
|
||||
if (tag == MP4ESDescrTag) {
|
||||
@@ -440,7 +449,12 @@ static int mov_read_pasp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
const int num = get_be32(pb);
|
||||
const int den = get_be32(pb);
|
||||
AVStream * const st = c->fc->streams[c->fc->nb_streams-1];
|
||||
AVStream *st;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
if (den != 0) {
|
||||
if ((st->sample_aspect_ratio.den != 1 || st->sample_aspect_ratio.num) && // default
|
||||
(den != st->sample_aspect_ratio.den || num != st->sample_aspect_ratio.num))
|
||||
@@ -494,12 +508,18 @@ static int mov_read_moof(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
int version = get_byte(pb);
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
int version;
|
||||
char language[4] = {0};
|
||||
unsigned lang;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
version = get_byte(pb);
|
||||
if (version > 1)
|
||||
return -1; /* unsupported */
|
||||
|
||||
@@ -561,7 +581,11 @@ static int mov_read_mvhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
AVStream *st;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
if((uint64_t)atom.size > (1<<30))
|
||||
return -1;
|
||||
@@ -581,9 +605,14 @@ static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
int little_endian = get_be16(pb);
|
||||
AVStream *st;
|
||||
int little_endian;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
little_endian = get_be16(pb);
|
||||
dprintf(c->fc, "enda %d\n", little_endian);
|
||||
if (little_endian == 1) {
|
||||
switch (st->codec->codec_id) {
|
||||
@@ -633,7 +662,11 @@ static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
AVStream *st;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
if((uint64_t)atom.size > (1<<30))
|
||||
return -1;
|
||||
@@ -660,7 +693,11 @@ static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
*/
|
||||
static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
AVStream *st;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
|
||||
if((uint64_t)atom.size > (1<<30))
|
||||
return -1;
|
||||
@@ -676,10 +713,15 @@ static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
|
||||
@@ -742,10 +784,15 @@ static enum CodecID mov_get_lpcm_codec_id(int bps, int flags)
|
||||
|
||||
static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
int j, entries, pseudo_stream_id;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
|
||||
@@ -1064,10 +1111,15 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
|
||||
@@ -1092,10 +1144,15 @@ static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
|
||||
@@ -1119,10 +1176,15 @@ static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries, sample_size;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
|
||||
@@ -1150,12 +1212,17 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries;
|
||||
int64_t duration=0;
|
||||
int64_t total_sample_count=0;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
entries = get_be32(pb);
|
||||
@@ -1194,10 +1261,15 @@ static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
entries = get_be32(pb);
|
||||
@@ -1504,10 +1576,16 @@ static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
int height;
|
||||
int64_t disp_transform[2];
|
||||
int display_matrix[3][2];
|
||||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
int version = get_byte(pb);
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
int version;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
sc = st->priv_data;
|
||||
|
||||
version = get_byte(pb);
|
||||
get_be24(pb); /* flags */
|
||||
/*
|
||||
MOV_TRACK_ENABLED 0x0001
|
||||
@@ -1776,9 +1854,13 @@ free_and_return:
|
||||
/* edit list atom */
|
||||
static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
MOVStreamContext *sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;
|
||||
MOVStreamContext *sc;
|
||||
int i, edit_count;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;
|
||||
|
||||
get_byte(pb); /* version */
|
||||
get_be24(pb); /* flags */
|
||||
edit_count = get_be32(pb); /* entries */
|
||||
|
@@ -477,12 +477,17 @@ static int
|
||||
ogg_read_header (AVFormatContext * s, AVFormatParameters * ap)
|
||||
{
|
||||
struct ogg *ogg = s->priv_data;
|
||||
int i;
|
||||
ogg->curidx = -1;
|
||||
//linear headers seek from start
|
||||
if (ogg_get_headers (s) < 0){
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < ogg->nstreams; i++)
|
||||
if (ogg->streams[i].header < 0)
|
||||
ogg->streams[i].codec = NULL;
|
||||
|
||||
//linear granulepos seek from end
|
||||
ogg_get_length (s);
|
||||
|
||||
|
@@ -35,27 +35,28 @@ vorbis_comment(AVFormatContext * as, uint8_t *buf, int size)
|
||||
{
|
||||
const uint8_t *p = buf;
|
||||
const uint8_t *end = buf + size;
|
||||
unsigned s, n, j;
|
||||
unsigned n, j;
|
||||
int s;
|
||||
|
||||
if (size < 8) /* must have vendor_length and user_comment_list_length */
|
||||
return -1;
|
||||
|
||||
s = bytestream_get_le32(&p);
|
||||
|
||||
if (end - p < s)
|
||||
if (end - p - 4 < s || s < 0)
|
||||
return -1;
|
||||
|
||||
p += s;
|
||||
|
||||
n = bytestream_get_le32(&p);
|
||||
|
||||
while (p < end && n > 0) {
|
||||
while (end - p >= 4 && n > 0) {
|
||||
const char *t, *v;
|
||||
int tl, vl;
|
||||
|
||||
s = bytestream_get_le32(&p);
|
||||
|
||||
if (end - p < s)
|
||||
if (end - p < s || s < 0)
|
||||
break;
|
||||
|
||||
t = p;
|
||||
|
@@ -1515,10 +1515,7 @@ static int av_seek_frame_generic(AVFormatContext *s,
|
||||
return ret;
|
||||
}
|
||||
for(i=0;; i++) {
|
||||
int ret;
|
||||
do{
|
||||
ret = av_read_frame(s, &pkt);
|
||||
}while(ret == AVERROR(EAGAIN));
|
||||
int ret = av_read_frame(s, &pkt);
|
||||
if(ret<0)
|
||||
break;
|
||||
av_free_packet(&pkt);
|
||||
@@ -1741,9 +1738,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
|
||||
if (i == ic->nb_streams)
|
||||
break;
|
||||
|
||||
do{
|
||||
ret = av_read_packet(ic, pkt);
|
||||
}while(ret == AVERROR(EAGAIN));
|
||||
ret = av_read_packet(ic, pkt);
|
||||
if (ret != 0)
|
||||
break;
|
||||
read_size += pkt->size;
|
||||
@@ -1768,9 +1763,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
|
||||
if (read_size >= DURATION_MAX_READ_SIZE)
|
||||
break;
|
||||
|
||||
do{
|
||||
ret = av_read_packet(ic, pkt);
|
||||
}while(ret == AVERROR(EAGAIN));
|
||||
ret = av_read_packet(ic, pkt);
|
||||
if (ret != 0)
|
||||
break;
|
||||
read_size += pkt->size;
|
||||
@@ -2079,8 +2072,6 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
/* NOTE: a new stream can be added there if no header in file
|
||||
(AVFMTCTX_NOHEADER) */
|
||||
ret = av_read_frame_internal(ic, &pkt1);
|
||||
if(ret == AVERROR(EAGAIN))
|
||||
continue;
|
||||
if (ret < 0) {
|
||||
/* EOF or error */
|
||||
ret = -1; /* we could not have all the codec parameters before EOF */
|
||||
@@ -3295,7 +3286,7 @@ char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
|
||||
}
|
||||
|
||||
void av_set_pts_info(AVStream *s, int pts_wrap_bits,
|
||||
int pts_num, int pts_den)
|
||||
unsigned int pts_num, unsigned int pts_den)
|
||||
{
|
||||
unsigned int gcd= av_gcd(pts_num, pts_den);
|
||||
s->pts_wrap_bits = pts_wrap_bits;
|
||||
|
4
libavutil/libavutil.v
Normal file
4
libavutil/libavutil.v
Normal file
@@ -0,0 +1,4 @@
|
||||
LIBAVUTIL_$MAJOR {
|
||||
global: av_*; ff_*; avutil_*;
|
||||
local: *;
|
||||
};
|
4
libpostproc/libpostproc.v
Normal file
4
libpostproc/libpostproc.v
Normal file
@@ -0,0 +1,4 @@
|
||||
LIBPOSTPROC_$MAJOR {
|
||||
global: postproc_*; pp_*;
|
||||
local: *;
|
||||
};
|
@@ -554,7 +554,7 @@ static av_always_inline void do_a_deblock_C(uint8_t *src, int step, int stride,
|
||||
|
||||
//Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
|
||||
//Plain C versions
|
||||
#if !(HAVE_MMX || HAVE_ALTIVEC) || defined (RUNTIME_CPUDETECT)
|
||||
#if !(HAVE_MMX || HAVE_ALTIVEC) || CONFIG_RUNTIME_CPUDETECT
|
||||
#define COMPILE_C
|
||||
#endif
|
||||
|
||||
@@ -564,15 +564,15 @@ static av_always_inline void do_a_deblock_C(uint8_t *src, int step, int stride,
|
||||
|
||||
#if ARCH_X86
|
||||
|
||||
#if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
|
||||
#if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT
|
||||
#define COMPILE_MMX
|
||||
#endif
|
||||
|
||||
#if HAVE_MMX2 || defined (RUNTIME_CPUDETECT)
|
||||
#if HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT
|
||||
#define COMPILE_MMX2
|
||||
#endif
|
||||
|
||||
#if (HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
|
||||
#if (HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT
|
||||
#define COMPILE_3DNOW
|
||||
#endif
|
||||
#endif /* ARCH_X86 */
|
||||
@@ -645,7 +645,7 @@ static inline void postProcess(const uint8_t src[], int srcStride, uint8_t dst[]
|
||||
// Using ifs here as they are faster than function pointers although the
|
||||
// difference would not be measurable here but it is much better because
|
||||
// someone might exchange the CPU whithout restarting MPlayer ;)
|
||||
#ifdef RUNTIME_CPUDETECT
|
||||
#if CONFIG_RUNTIME_CPUDETECT
|
||||
#if ARCH_X86
|
||||
// ordered per speed fastest first
|
||||
if(c->cpuCaps & PP_CPU_CAPS_MMX2)
|
||||
@@ -664,7 +664,7 @@ static inline void postProcess(const uint8_t src[], int srcStride, uint8_t dst[]
|
||||
#endif
|
||||
postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
|
||||
#endif
|
||||
#else //RUNTIME_CPUDETECT
|
||||
#else //CONFIG_RUNTIME_CPUDETECT
|
||||
#if HAVE_MMX2
|
||||
postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
|
||||
#elif HAVE_AMD3DNOW
|
||||
@@ -676,7 +676,7 @@ static inline void postProcess(const uint8_t src[], int srcStride, uint8_t dst[]
|
||||
#else
|
||||
postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
|
||||
#endif
|
||||
#endif //!RUNTIME_CPUDETECT
|
||||
#endif //!CONFIG_RUNTIME_CPUDETECT
|
||||
}
|
||||
|
||||
//static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
|
||||
|
3
libswscale/libswscale.v
Normal file
3
libswscale/libswscale.v
Normal file
@@ -0,0 +1,3 @@
|
||||
LIBSWSCALE_$MAJOR {
|
||||
global: *;
|
||||
};
|
@@ -955,28 +955,27 @@ static inline void yuv2rgbXinC_full(SwsContext *c, int16_t *lumFilter, int16_t *
|
||||
|
||||
//Note: we have C, X86, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one
|
||||
//Plain C versions
|
||||
#if !HAVE_MMX || defined (RUNTIME_CPUDETECT) || !CONFIG_GPL
|
||||
#if ((!HAVE_MMX || !CONFIG_GPL) && !HAVE_ALTIVEC) || CONFIG_RUNTIME_CPUDETECT
|
||||
#define COMPILE_C
|
||||
#endif
|
||||
|
||||
#if ARCH_PPC
|
||||
#if (HAVE_ALTIVEC || defined (RUNTIME_CPUDETECT)) && CONFIG_GPL
|
||||
#undef COMPILE_C
|
||||
#if HAVE_ALTIVEC
|
||||
#define COMPILE_ALTIVEC
|
||||
#endif
|
||||
#endif //ARCH_PPC
|
||||
|
||||
#if ARCH_X86
|
||||
|
||||
#if ((HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)) && CONFIG_GPL
|
||||
#if ((HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
|
||||
#define COMPILE_MMX
|
||||
#endif
|
||||
|
||||
#if (HAVE_MMX2 || defined (RUNTIME_CPUDETECT)) && CONFIG_GPL
|
||||
#if (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
|
||||
#define COMPILE_MMX2
|
||||
#endif
|
||||
|
||||
#if ((HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)) && CONFIG_GPL
|
||||
#if ((HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
|
||||
#define COMPILE_3DNOW
|
||||
#endif
|
||||
#endif //ARCH_X86
|
||||
@@ -1637,8 +1636,8 @@ static void globalInit(void){
|
||||
|
||||
static SwsFunc getSwsFunc(int flags){
|
||||
|
||||
#if defined(RUNTIME_CPUDETECT) && CONFIG_GPL
|
||||
#if ARCH_X86
|
||||
#if CONFIG_RUNTIME_CPUDETECT
|
||||
#if ARCH_X86 && CONFIG_GPL
|
||||
// ordered per speed fastest first
|
||||
if (flags & SWS_CPU_CAPS_MMX2)
|
||||
return swScale_MMX2;
|
||||
@@ -1650,15 +1649,15 @@ static SwsFunc getSwsFunc(int flags){
|
||||
return swScale_C;
|
||||
|
||||
#else
|
||||
#if ARCH_PPC
|
||||
#if ARCH_PPC && defined COMPILE_ALTIVEC
|
||||
if (flags & SWS_CPU_CAPS_ALTIVEC)
|
||||
return swScale_altivec;
|
||||
else
|
||||
return swScale_C;
|
||||
#endif
|
||||
return swScale_C;
|
||||
#endif /* ARCH_X86 */
|
||||
#else //RUNTIME_CPUDETECT
|
||||
#endif /* ARCH_X86 && CONFIG_GPL */
|
||||
#else //CONFIG_RUNTIME_CPUDETECT
|
||||
#if HAVE_MMX2
|
||||
return swScale_MMX2;
|
||||
#elif HAVE_AMD3DNOW
|
||||
@@ -1670,7 +1669,7 @@ static SwsFunc getSwsFunc(int flags){
|
||||
#else
|
||||
return swScale_C;
|
||||
#endif
|
||||
#endif //!RUNTIME_CPUDETECT
|
||||
#endif //!CONFIG_RUNTIME_CPUDETECT
|
||||
}
|
||||
|
||||
static int PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||
@@ -2194,7 +2193,7 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d
|
||||
__asm__ volatile("emms\n\t"::: "memory");
|
||||
#endif
|
||||
|
||||
#if !defined(RUNTIME_CPUDETECT) || !CONFIG_GPL //ensure that the flags match the compiled variant if cpudetect is off
|
||||
#if !CONFIG_RUNTIME_CPUDETECT //ensure that the flags match the compiled variant if cpudetect is off
|
||||
flags &= ~(SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2|SWS_CPU_CAPS_3DNOW|SWS_CPU_CAPS_ALTIVEC|SWS_CPU_CAPS_BFIN);
|
||||
#if HAVE_MMX2
|
||||
flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2;
|
||||
@@ -2207,7 +2206,7 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d
|
||||
#elif ARCH_BFIN
|
||||
flags |= SWS_CPU_CAPS_BFIN;
|
||||
#endif
|
||||
#endif /* RUNTIME_CPUDETECT */
|
||||
#endif /* CONFIG_RUNTIME_CPUDETECT */
|
||||
if (clip_table[512] != 255) globalInit();
|
||||
if (!rgb15to16) sws_rgb2rgb_init(flags);
|
||||
|
||||
|
@@ -6,18 +6,18 @@
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* FFmpeg 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.
|
||||
*
|
||||
* FFmpeg 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 General Public License for more details.
|
||||
* 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 General Public License
|
||||
* along with FFmpeg; if not, write to the Free Software
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
@@ -2219,7 +2219,7 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth,
|
||||
}
|
||||
else // fast bilinear upscale / crap downscale
|
||||
{
|
||||
#if ARCH_X86
|
||||
#if ARCH_X86 && CONFIG_GPL
|
||||
#if HAVE_MMX2
|
||||
int i;
|
||||
#if defined(PIC)
|
||||
@@ -2492,7 +2492,7 @@ inline static void RENAME(hcscale)(SwsContext *c, uint16_t *dst, long dstWidth,
|
||||
}
|
||||
else // fast bilinear upscale / crap downscale
|
||||
{
|
||||
#if ARCH_X86
|
||||
#if ARCH_X86 && CONFIG_GPL
|
||||
#if HAVE_MMX2
|
||||
int i;
|
||||
#if defined(PIC)
|
||||
|
@@ -453,7 +453,7 @@ SwsFunc sws_yuv2rgb_get_func_ptr(SwsContext *c)
|
||||
#if CONFIG_MLIB
|
||||
t = sws_yuv2rgb_init_mlib(c);
|
||||
#endif
|
||||
#if HAVE_ALTIVEC && CONFIG_GPL
|
||||
#if HAVE_ALTIVEC
|
||||
if (c->flags & SWS_CPU_CAPS_ALTIVEC)
|
||||
t = sws_yuv2rgb_init_altivec(c);
|
||||
#endif
|
||||
|
@@ -27,9 +27,9 @@ install-libs: install-lib$(NAME)-shared
|
||||
$(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
|
||||
cd ./$(SUBDIR) && $(LN_S) $(SLIBNAME_WITH_MAJOR) $(SLIBNAME)
|
||||
|
||||
$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS)
|
||||
$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
|
||||
$(SLIB_CREATE_DEF_CMD)
|
||||
$(CC) $(SHFLAGS) $(FFLDFLAGS) -o $$@ $$(filter-out $(DEP_LIBS),$$^) $(FFEXTRALIBS) $(EXTRAOBJS)
|
||||
$(CC) $(SHFLAGS) $(FFLDFLAGS) -o $$@ $$(filter-out $(SUBDIR)lib$(NAME).ver $(DEP_LIBS),$$^) $(FFEXTRALIBS) $(EXTRAOBJS)
|
||||
$(SLIB_EXTRA_CMD)
|
||||
|
||||
ifdef SUBDIR
|
||||
|
10
version.sh
10
version.sh
@@ -13,12 +13,16 @@ if ! test $revision; then
|
||||
test $revision && revision=git-$revision
|
||||
fi
|
||||
|
||||
# no version number found
|
||||
# no revision number found
|
||||
test $revision || revision=UNKNOWN
|
||||
|
||||
test -n "$3" && revision=$revision-$3
|
||||
# releases extract the version number from the VERSION file
|
||||
version=$(cat VERSION 2> /dev/null)
|
||||
test $version || version=$revision
|
||||
|
||||
NEW_REVISION="#define FFMPEG_VERSION \"$revision\""
|
||||
test -n "$3" && version=$version-$3
|
||||
|
||||
NEW_REVISION="#define FFMPEG_VERSION \"$version\""
|
||||
OLD_REVISION=$(cat version.h 2> /dev/null)
|
||||
|
||||
# Update version.h only on revision changes to avoid spurious rebuilds
|
||||
|
Reference in New Issue
Block a user