mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-06 23:37:31 +09:00
import FIREFOX_52_6_0esr_RELEASE from mozilla-esr52 hg repo
This commit is contained in:
commit
dcd9973243
150858 changed files with 23884658 additions and 0 deletions
339
media/ffvpx/COPYING.GPLv2
Normal file
339
media/ffvpx/COPYING.GPLv2
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) 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
|
||||
this service 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 make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. 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.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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 a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE 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.
|
||||
|
||||
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
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the 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 2 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, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision 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, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This 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.
|
||||
674
media/ffvpx/COPYING.GPLv3
Normal file
674
media/ffvpx/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>.
|
||||
502
media/ffvpx/COPYING.LGPLv2.1
Normal file
502
media/ffvpx/COPYING.LGPLv2.1
Normal file
|
|
@ -0,0 +1,502 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
165
media/ffvpx/COPYING.LGPLv3
Normal file
165
media/ffvpx/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.
|
||||
6
media/ffvpx/CREDITS
Normal file
6
media/ffvpx/CREDITS
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
See the Git history of the project (git://source.ffmpeg.org/ffmpeg) to
|
||||
get the names of people who have contributed to FFmpeg.
|
||||
|
||||
To check the log, you can type the command "git log" in the FFmpeg
|
||||
source directory, or browse the online repository at
|
||||
http://source.ffmpeg.org.
|
||||
1476
media/ffvpx/Changelog
Normal file
1476
media/ffvpx/Changelog
Normal file
File diff suppressed because it is too large
Load diff
17
media/ffvpx/INSTALL.md
Normal file
17
media/ffvpx/INSTALL.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#Installing FFmpeg:
|
||||
|
||||
1. Type `./configure` to create the configuration. A list of configure
|
||||
options is printed by running `configure --help`.
|
||||
|
||||
`configure` can be launched from a directory different from the FFmpeg
|
||||
sources to build the objects out of tree. To do this, use an absolute
|
||||
path when launching `configure`, e.g. `/ffmpegdir/ffmpeg/configure`.
|
||||
|
||||
2. Then type `make` to build FFmpeg. GNU Make 3.81 or later is required.
|
||||
|
||||
3. Type `make install` to install all binaries and libraries you built.
|
||||
|
||||
NOTICE
|
||||
------
|
||||
|
||||
- Non system dependencies (e.g. libx264, libvpx) are disabled by default.
|
||||
114
media/ffvpx/LICENSE.md
Normal file
114
media/ffvpx/LICENSE.md
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
#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
|
||||
- optional x86 optimizations in the files
|
||||
- `libavcodec/x86/flac_dsp_gpl.asm`
|
||||
- `libavcodec/x86/idct_mmx.c`
|
||||
- `libavfilter/x86/vf_removegrain.asm`
|
||||
- libutvideo encoding/decoding wrappers in
|
||||
`libavcodec/libutvideo*.cpp`
|
||||
- the X11 grabber in `libavdevice/x11grab.c`
|
||||
- the swresample test app in
|
||||
`libswresample/swresample-test.c`
|
||||
- the `texi2pod.pl` tool
|
||||
- the following filters in libavfilter:
|
||||
- `f_ebur128.c`
|
||||
- `vf_blackframe.c`
|
||||
- `vf_boxblur.c`
|
||||
- `vf_colormatrix.c`
|
||||
- `vf_cover_rect.c`
|
||||
- `vf_cropdetect.c`
|
||||
- `vf_delogo.c`
|
||||
- `vf_eq.c`
|
||||
- `vf_find_rect.c`
|
||||
- `vf_fspp.c`
|
||||
- `vf_geq.c`
|
||||
- `vf_histeq.c`
|
||||
- `vf_hqdn3d.c`
|
||||
- `vf_interlace.c`
|
||||
- `vf_kerndeint.c`
|
||||
- `vf_mcdeint.c`
|
||||
- `vf_mpdecimate.c`
|
||||
- `vf_owdenoise.c`
|
||||
- `vf_perspective.c`
|
||||
- `vf_phase.c`
|
||||
- `vf_pp.c`
|
||||
- `vf_pp7.c`
|
||||
- `vf_pullup.c`
|
||||
- `vf_sab.c`
|
||||
- `vf_smartblur.c`
|
||||
- `vf_repeatfields.c`
|
||||
- `vf_spp.c`
|
||||
- `vf_stereo3d.c`
|
||||
- `vf_super2xsai.c`
|
||||
- `vf_tinterlace.c`
|
||||
- `vf_uspp.c`
|
||||
- `vsrc_mptestsrc.c`
|
||||
|
||||
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.
|
||||
|
||||
There are a handful of files under other licensing terms, namely:
|
||||
|
||||
* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and
|
||||
`libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for
|
||||
licensing details. Specifically note that you must credit the IJG in the
|
||||
documentation accompanying your program if you only distribute executables.
|
||||
You must also indicate any changes including additions and deletions to
|
||||
those three files in the documentation.
|
||||
* `tests/reference.pnm` is under the expat license.
|
||||
|
||||
|
||||
external libraries
|
||||
==================
|
||||
|
||||
FFmpeg can be combined with a number of external libraries, which sometimes
|
||||
affect the licensing of binaries resulting from the combination.
|
||||
|
||||
compatible libraries
|
||||
--------------------
|
||||
|
||||
The following libraries are under GPL:
|
||||
- frei0r
|
||||
- libcdio
|
||||
- librubberband
|
||||
- libutvideo
|
||||
- libvidstab
|
||||
- libx264
|
||||
- libx265
|
||||
- libxavs
|
||||
- libxvid
|
||||
|
||||
When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
|
||||
passing `--enable-gpl` to configure.
|
||||
|
||||
The OpenCORE and VisualOn 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 these libraries with FFmpeg, the
|
||||
license version needs to be upgraded by passing `--enable-version3` to configure.
|
||||
|
||||
incompatible libraries
|
||||
----------------------
|
||||
|
||||
The Fraunhofer AAC library and FAAC are under licenses which
|
||||
are incompatible with the GPLv2 and v3. We do not know for certain if their
|
||||
licenses are compatible with the LGPL.
|
||||
If you wish to enable these libraries, pass `--enable-nonfree` to configure.
|
||||
But note that if you enable any of these libraries the resulting binary will
|
||||
be under a complex license mix that is more restrictive than the LGPL and that
|
||||
may result in additional obligations. It is possible that these
|
||||
restrictions cause the resulting binary to be unredistributeable.
|
||||
619
media/ffvpx/MAINTAINERS
Normal file
619
media/ffvpx/MAINTAINERS
Normal file
|
|
@ -0,0 +1,619 @@
|
|||
FFmpeg maintainers
|
||||
==================
|
||||
|
||||
Below is a list of the people maintaining different parts of the
|
||||
FFmpeg code.
|
||||
|
||||
Please try to keep entries where you are the maintainer up to date!
|
||||
|
||||
Names in () mean that the maintainer currently has no time to maintain the code.
|
||||
A (CC <address>) after the name means that the maintainer prefers to be CC-ed on
|
||||
patches and related discussions.
|
||||
|
||||
|
||||
Project Leader
|
||||
==============
|
||||
|
||||
final design decisions
|
||||
|
||||
|
||||
Applications
|
||||
============
|
||||
|
||||
ffmpeg:
|
||||
ffmpeg.c Michael Niedermayer
|
||||
|
||||
ffplay:
|
||||
ffplay.c Marton Balint
|
||||
|
||||
ffprobe:
|
||||
ffprobe.c Stefano Sabatini
|
||||
|
||||
ffserver:
|
||||
ffserver.c Reynaldo H. Verdejo Pinochet
|
||||
|
||||
Commandline utility code:
|
||||
cmdutils.c, cmdutils.h Michael Niedermayer
|
||||
|
||||
QuickTime faststart:
|
||||
tools/qt-faststart.c Baptiste Coudurier
|
||||
|
||||
|
||||
Miscellaneous Areas
|
||||
===================
|
||||
|
||||
documentation Stefano Sabatini, Mike Melanson, Timothy Gu, Lou Logan
|
||||
build system (configure, makefiles) Diego Biurrun, Mans Rullgard
|
||||
project server Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser, Lou Logan
|
||||
presets Robert Swain
|
||||
metadata subsystem Aurelien Jacobs
|
||||
release management Michael Niedermayer
|
||||
|
||||
|
||||
Communication
|
||||
=============
|
||||
|
||||
website Deby Barbara Lepage
|
||||
fate.ffmpeg.org Timothy Gu
|
||||
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
|
||||
mailing lists Michael Niedermayer, Baptiste Coudurier, Lou Logan
|
||||
Google+ Paul B Mahol, Michael Niedermayer, Alexander Strasser
|
||||
Twitter Lou Logan, Reynaldo H. Verdejo Pinochet
|
||||
Launchpad Timothy Gu
|
||||
|
||||
|
||||
libavutil
|
||||
=========
|
||||
|
||||
External Interfaces:
|
||||
libavutil/avutil.h Michael Niedermayer
|
||||
Internal Interfaces:
|
||||
libavutil/common.h Michael Niedermayer
|
||||
|
||||
Other:
|
||||
aes_ctr.c, aes_ctr.h Eran Kornblau
|
||||
bprint Nicolas George
|
||||
bswap.h
|
||||
des Reimar Doeffinger
|
||||
dynarray.h Nicolas George
|
||||
eval.c, eval.h Michael Niedermayer
|
||||
float_dsp Loren Merritt
|
||||
hash Reimar Doeffinger
|
||||
intfloat* Michael Niedermayer
|
||||
integer.c, integer.h Michael Niedermayer
|
||||
lzo Reimar Doeffinger
|
||||
mathematics.c, mathematics.h Michael Niedermayer
|
||||
mem.c, mem.h Michael Niedermayer
|
||||
opencl.c, opencl.h Wei Gao
|
||||
opt.c, opt.h Michael Niedermayer
|
||||
rational.c, rational.h Michael Niedermayer
|
||||
rc4 Reimar Doeffinger
|
||||
ripemd.c, ripemd.h James Almer
|
||||
timecode Clément Bœsch
|
||||
|
||||
|
||||
libavcodec
|
||||
==========
|
||||
|
||||
Generic Parts:
|
||||
External Interfaces:
|
||||
avcodec.h Michael Niedermayer
|
||||
utility code:
|
||||
utils.c Michael Niedermayer
|
||||
audio and video frame extraction:
|
||||
parser.c Michael Niedermayer
|
||||
bitstream reading:
|
||||
bitstream.c, bitstream.h Michael Niedermayer
|
||||
CABAC:
|
||||
cabac.h, cabac.c Michael Niedermayer
|
||||
codec names:
|
||||
codec_names.sh Nicolas George
|
||||
DSP utilities:
|
||||
dsputils.c, dsputils.h Michael Niedermayer
|
||||
entropy coding:
|
||||
rangecoder.c, rangecoder.h Michael Niedermayer
|
||||
lzw.* Michael Niedermayer
|
||||
floating point AAN DCT:
|
||||
faandct.c, faandct.h Michael Niedermayer
|
||||
Golomb coding:
|
||||
golomb.c, golomb.h Michael Niedermayer
|
||||
LPC:
|
||||
lpc.c, lpc.h Justin Ruggles
|
||||
motion estimation:
|
||||
motion* Michael Niedermayer
|
||||
rate control:
|
||||
ratecontrol.c Michael Niedermayer
|
||||
libxvid_rc.c Michael Niedermayer
|
||||
simple IDCT:
|
||||
simple_idct.c, simple_idct.h Michael Niedermayer
|
||||
postprocessing:
|
||||
libpostproc/* Michael Niedermayer
|
||||
table generation:
|
||||
tableprint.c, tableprint.h Reimar Doeffinger
|
||||
fixed point FFT:
|
||||
fft* Zeljko Lukac
|
||||
Text Subtitles Clément Bœsch
|
||||
|
||||
Codecs:
|
||||
4xm.c Michael Niedermayer
|
||||
8bps.c Roberto Togni
|
||||
8svx.c Jaikrishnan Menon
|
||||
aacenc*, aaccoder.c Rostislav Pehlivanov
|
||||
aasc.c Kostya Shishkov
|
||||
ac3* Justin Ruggles
|
||||
alacenc.c Jaikrishnan Menon
|
||||
alsdec.c Thilo Borgmann
|
||||
apedec.c Kostya Shishkov
|
||||
ass* Aurelien Jacobs
|
||||
asv* Michael Niedermayer
|
||||
atrac3* Benjamin Larsson
|
||||
atrac3plus* Maxim Poliakovski
|
||||
bgmc.c, bgmc.h Thilo Borgmann
|
||||
bink.c Kostya Shishkov
|
||||
binkaudio.c Peter Ross
|
||||
bmp.c Mans Rullgard, Kostya Shishkov
|
||||
cavs* Stefan Gehrer
|
||||
cdxl.c Paul B Mahol
|
||||
celp_filters.* Vitor Sessak
|
||||
cinepak.c Roberto Togni
|
||||
cinepakenc.c Rl / Aetey G.T. AB
|
||||
ccaption_dec.c Anshul Maheshwari
|
||||
cljr Alex Beregszaszi
|
||||
cllc.c Derek Buitenhuis
|
||||
cook.c, cookdata.h Benjamin Larsson
|
||||
cpia.c Stephan Hilb
|
||||
crystalhd.c Philip Langdale
|
||||
cscd.c Reimar Doeffinger
|
||||
dca.c Kostya Shishkov, Benjamin Larsson
|
||||
dirac* Rostislav Pehlivanov
|
||||
dnxhd* Baptiste Coudurier
|
||||
dpcm.c Mike Melanson
|
||||
dss_sp.c Oleksij Rempel, Michael Niedermayer
|
||||
dv.c Roman Shaposhnik
|
||||
dvbsubdec.c Anshul Maheshwari
|
||||
dxa.c Kostya Shishkov
|
||||
eacmv*, eaidct*, eat* Peter Ross
|
||||
evrc* Paul B Mahol
|
||||
exif.c, exif.h Thilo Borgmann
|
||||
ffv1* Michael Niedermayer
|
||||
ffwavesynth.c Nicolas George
|
||||
fic.c Derek Buitenhuis
|
||||
flac* Justin Ruggles
|
||||
flashsv* Benjamin Larsson
|
||||
flicvideo.c Mike Melanson
|
||||
g722.c Martin Storsjo
|
||||
g726.c Roman Shaposhnik
|
||||
gifdec.c Baptiste Coudurier
|
||||
h261* Michael Niedermayer
|
||||
h263* Michael Niedermayer
|
||||
h264* Loren Merritt, Michael Niedermayer
|
||||
hap* Tom Butterworth
|
||||
huffyuv* Michael Niedermayer, Christophe Gisquet
|
||||
idcinvideo.c Mike Melanson
|
||||
imc* Benjamin Larsson
|
||||
indeo2* Kostya Shishkov
|
||||
indeo5* Kostya Shishkov
|
||||
interplayvideo.c Mike Melanson
|
||||
ivi* Kostya Shishkov
|
||||
jacosub* Clément Bœsch
|
||||
jpeg2000* Nicolas Bertrand
|
||||
jpeg_ls.c Kostya Shishkov
|
||||
jvdec.c Peter Ross
|
||||
kmvc.c Kostya Shishkov
|
||||
lcl*.c Roberto Togni, Reimar Doeffinger
|
||||
libcelt_dec.c Nicolas George
|
||||
libdirac* David Conrad
|
||||
libgsm.c Michel Bardiaux
|
||||
libkvazaar.c Arttu Ylä-Outinen
|
||||
libopenjpeg.c Jaikrishnan Menon
|
||||
libopenjpegenc.c Michael Bradshaw
|
||||
libschroedinger* David Conrad
|
||||
libspeexdec.c Justin Ruggles
|
||||
libtheoraenc.c David Conrad
|
||||
libutvideo* Carl Eugen Hoyos
|
||||
libvorbis.c David Conrad
|
||||
libvpx* James Zern
|
||||
libx264.c Mans Rullgard, Jason Garrett-Glaser
|
||||
libx265.c Derek Buitenhuis
|
||||
libxavs.c Stefan Gehrer
|
||||
libzvbi-teletextdec.c Marton Balint
|
||||
loco.c Kostya Shishkov
|
||||
lzo.h, lzo.c Reimar Doeffinger
|
||||
mdec.c Michael Niedermayer
|
||||
mimic.c Ramiro Polla
|
||||
mjpeg*.c Michael Niedermayer
|
||||
mlp* Ramiro Polla
|
||||
mmvideo.c Peter Ross
|
||||
mpc* Kostya Shishkov
|
||||
mpeg12.c, mpeg12data.h Michael Niedermayer
|
||||
mpegvideo.c, mpegvideo.h Michael Niedermayer
|
||||
mqc* Nicolas Bertrand
|
||||
msmpeg4.c, msmpeg4data.h Michael Niedermayer
|
||||
msrle.c Mike Melanson
|
||||
msvideo1.c Mike Melanson
|
||||
nellymoserdec.c Benjamin Larsson
|
||||
nuv.c Reimar Doeffinger
|
||||
nvenc.c Timo Rothenpieler
|
||||
paf.* Paul B Mahol
|
||||
pcx.c Ivo van Poorten
|
||||
pgssubdec.c Reimar Doeffinger
|
||||
ptx.c Ivo van Poorten
|
||||
qcelp* Reynaldo H. Verdejo Pinochet
|
||||
qdm2.c, qdm2data.h Roberto Togni, Benjamin Larsson
|
||||
qdrw.c Kostya Shishkov
|
||||
qpeg.c Kostya Shishkov
|
||||
qsv* Ivan Uskov
|
||||
qtrle.c Mike Melanson
|
||||
ra144.c, ra144.h, ra288.c, ra288.h Roberto Togni
|
||||
resample2.c Michael Niedermayer
|
||||
rl2.c Sascha Sommer
|
||||
rpza.c Roberto Togni
|
||||
rtjpeg.c, rtjpeg.h Reimar Doeffinger
|
||||
rv10.c Michael Niedermayer
|
||||
rv3* Kostya Shishkov
|
||||
rv4* Kostya Shishkov, Christophe Gisquet
|
||||
s3tc* Ivo van Poorten
|
||||
smacker.c Kostya Shishkov
|
||||
smc.c Mike Melanson
|
||||
smvjpegdec.c Ash Hughes
|
||||
snow* Michael Niedermayer, Loren Merritt
|
||||
sonic.c Alex Beregszaszi
|
||||
srt* Aurelien Jacobs
|
||||
sunrast.c Ivo van Poorten
|
||||
svq3.c Michael Niedermayer
|
||||
tak* Paul B Mahol
|
||||
targa.c Kostya Shishkov
|
||||
tiff.c Kostya Shishkov
|
||||
truemotion1* Mike Melanson
|
||||
truemotion2* Kostya Shishkov
|
||||
truespeech.c Kostya Shishkov
|
||||
tscc.c Kostya Shishkov
|
||||
tta.c Alex Beregszaszi, Jaikrishnan Menon
|
||||
ttaenc.c Paul B Mahol
|
||||
txd.c Ivo van Poorten
|
||||
ulti* Kostya Shishkov
|
||||
v410*.c Derek Buitenhuis
|
||||
vb.c Kostya Shishkov
|
||||
vble.c Derek Buitenhuis
|
||||
vc1* Kostya Shishkov, Christophe Gisquet
|
||||
vc2* Rostislav Pehlivanov
|
||||
vcr1.c Michael Niedermayer
|
||||
vda_h264_dec.c Xidorn Quan
|
||||
vima.c Paul B Mahol
|
||||
vmnc.c Kostya Shishkov
|
||||
vorbisdec.c Denes Balatoni, David Conrad
|
||||
vorbisenc.c Oded Shimon
|
||||
vp3* Mike Melanson
|
||||
vp5 Aurelien Jacobs
|
||||
vp6 Aurelien Jacobs
|
||||
vp8 David Conrad, Jason Garrett-Glaser, Ronald Bultje
|
||||
vp9 Ronald Bultje, Clément Bœsch
|
||||
vqavideo.c Mike Melanson
|
||||
wavpack.c Kostya Shishkov
|
||||
wmaprodec.c Sascha Sommer
|
||||
wmavoice.c Ronald S. Bultje
|
||||
wmv2.c Michael Niedermayer
|
||||
wnv1.c Kostya Shishkov
|
||||
xan.c Mike Melanson
|
||||
xbm* Paul B Mahol
|
||||
xface Stefano Sabatini
|
||||
xl.c Kostya Shishkov
|
||||
xvmc.c Ivan Kalvachev
|
||||
xwd* Paul B Mahol
|
||||
zerocodec.c Derek Buitenhuis
|
||||
zmbv* Kostya Shishkov
|
||||
|
||||
Hardware acceleration:
|
||||
crystalhd.c Philip Langdale
|
||||
dxva2* Hendrik Leppkes, Laurent Aimar
|
||||
vaapi* Gwenole Beauchesne
|
||||
vda* Sebastien Zwickert
|
||||
vdpau* Philip Langdale, Carl Eugen Hoyos
|
||||
videotoolbox* Sebastien Zwickert
|
||||
|
||||
|
||||
libavdevice
|
||||
===========
|
||||
External Interface:
|
||||
libavdevice/avdevice.h
|
||||
|
||||
|
||||
avfoundation.m Thilo Borgmann
|
||||
decklink* Deti Fliegl
|
||||
dshow.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
fbdev_enc.c Lukasz Marek
|
||||
gdigrab.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
iec61883.c Georg Lippitsch
|
||||
lavfi Stefano Sabatini
|
||||
libdc1394.c Roman Shaposhnik
|
||||
opengl_enc.c Lukasz Marek
|
||||
pulse_audio_enc.c Lukasz Marek
|
||||
qtkit.m Thilo Borgmann
|
||||
sdl Stefano Sabatini
|
||||
v4l2.c Giorgio Vazzana
|
||||
vfwcap.c Ramiro Polla
|
||||
xv.c Lukasz Marek
|
||||
|
||||
libavfilter
|
||||
===========
|
||||
|
||||
Generic parts:
|
||||
graphdump.c Nicolas George
|
||||
|
||||
Filters:
|
||||
f_drawgraph.c Paul B Mahol
|
||||
af_adelay.c Paul B Mahol
|
||||
af_aecho.c Paul B Mahol
|
||||
af_afade.c Paul B Mahol
|
||||
af_amerge.c Nicolas George
|
||||
af_aphaser.c Paul B Mahol
|
||||
af_aresample.c Michael Niedermayer
|
||||
af_astats.c Paul B Mahol
|
||||
af_atempo.c Pavel Koshevoy
|
||||
af_biquads.c Paul B Mahol
|
||||
af_chorus.c Paul B Mahol
|
||||
af_compand.c Paul B Mahol
|
||||
af_ladspa.c Paul B Mahol
|
||||
af_pan.c Nicolas George
|
||||
af_sidechaincompress.c Paul B Mahol
|
||||
af_silenceremove.c Paul B Mahol
|
||||
avf_aphasemeter.c Paul B Mahol
|
||||
avf_avectorscope.c Paul B Mahol
|
||||
avf_showcqt.c Muhammad Faiz
|
||||
vf_blend.c Paul B Mahol
|
||||
vf_chromakey.c Timo Rothenpieler
|
||||
vf_colorchannelmixer.c Paul B Mahol
|
||||
vf_colorbalance.c Paul B Mahol
|
||||
vf_colorkey.c Timo Rothenpieler
|
||||
vf_colorlevels.c Paul B Mahol
|
||||
vf_deband.c Paul B Mahol
|
||||
vf_dejudder.c Nicholas Robbins
|
||||
vf_delogo.c Jean Delvare (CC <jdelvare@suse.com>)
|
||||
vf_drawbox.c/drawgrid Andrey Utkin
|
||||
vf_extractplanes.c Paul B Mahol
|
||||
vf_histogram.c Paul B Mahol
|
||||
vf_hqx.c Clément Bœsch
|
||||
vf_idet.c Pascal Massimino
|
||||
vf_il.c Paul B Mahol
|
||||
vf_lenscorrection.c Daniel Oberhoff
|
||||
vf_mergeplanes.c Paul B Mahol
|
||||
vf_neighbor.c Paul B Mahol
|
||||
vf_psnr.c Paul B Mahol
|
||||
vf_random.c Paul B Mahol
|
||||
vf_scale.c Michael Niedermayer
|
||||
vf_separatefields.c Paul B Mahol
|
||||
vf_ssim.c Paul B Mahol
|
||||
vf_stereo3d.c Paul B Mahol
|
||||
vf_telecine.c Paul B Mahol
|
||||
vf_yadif.c Michael Niedermayer
|
||||
vf_zoompan.c Paul B Mahol
|
||||
|
||||
Sources:
|
||||
vsrc_mandelbrot.c Michael Niedermayer
|
||||
|
||||
libavformat
|
||||
===========
|
||||
|
||||
Generic parts:
|
||||
External Interface:
|
||||
libavformat/avformat.h Michael Niedermayer
|
||||
Utility Code:
|
||||
libavformat/utils.c Michael Niedermayer
|
||||
|
||||
|
||||
Muxers/Demuxers:
|
||||
4xm.c Mike Melanson
|
||||
aadec.c Vesselin Bontchev (vesselin.bontchev at yandex dot com)
|
||||
adtsenc.c Robert Swain
|
||||
afc.c Paul B Mahol
|
||||
aiffdec.c Baptiste Coudurier, Matthieu Bouron
|
||||
aiffenc.c Baptiste Coudurier, Matthieu Bouron
|
||||
ape.c Kostya Shishkov
|
||||
apngdec.c Benoit Fouet
|
||||
ass* Aurelien Jacobs
|
||||
astdec.c Paul B Mahol
|
||||
astenc.c James Almer
|
||||
avi* Michael Niedermayer
|
||||
avisynth.c AvxSynth Team (avxsynth.testing at gmail dot com)
|
||||
avr.c Paul B Mahol
|
||||
bink.c Peter Ross
|
||||
brstm.c Paul B Mahol
|
||||
caf* Peter Ross
|
||||
cdxl.c Paul B Mahol
|
||||
crc.c Michael Niedermayer
|
||||
daud.c Reimar Doeffinger
|
||||
dss.c Oleksij Rempel, Michael Niedermayer
|
||||
dtshddec.c Paul B Mahol
|
||||
dv.c Roman Shaposhnik
|
||||
dxa.c Kostya Shishkov
|
||||
electronicarts.c Peter Ross
|
||||
epafdec.c Paul B Mahol
|
||||
ffm* Baptiste Coudurier
|
||||
flac* Justin Ruggles
|
||||
flic.c Mike Melanson
|
||||
flvdec.c, flvenc.c Michael Niedermayer
|
||||
gxf.c Reimar Doeffinger
|
||||
gxfenc.c Baptiste Coudurier
|
||||
hls.c Anssi Hannula
|
||||
hls encryption (hlsenc.c) Christian Suloway
|
||||
idcin.c Mike Melanson
|
||||
idroqdec.c Mike Melanson
|
||||
iff.c Jaikrishnan Menon
|
||||
img2*.c Michael Niedermayer
|
||||
ipmovie.c Mike Melanson
|
||||
ircam* Paul B Mahol
|
||||
iss.c Stefan Gehrer
|
||||
jacosub* Clément Bœsch
|
||||
jvdec.c Peter Ross
|
||||
libmodplug.c Clément Bœsch
|
||||
libnut.c Oded Shimon
|
||||
lmlm4.c Ivo van Poorten
|
||||
lvfdec.c Paul B Mahol
|
||||
lxfdec.c Tomas Härdin
|
||||
matroska.c Aurelien Jacobs
|
||||
matroskadec.c Aurelien Jacobs
|
||||
matroskaenc.c David Conrad
|
||||
matroska subtitles (matroskaenc.c) John Peebles
|
||||
metadata* Aurelien Jacobs
|
||||
mgsts.c Paul B Mahol
|
||||
microdvd* Aurelien Jacobs
|
||||
mm.c Peter Ross
|
||||
mov.c Michael Niedermayer, Baptiste Coudurier
|
||||
movenc.c Baptiste Coudurier, Matthieu Bouron
|
||||
movenccenc.c Eran Kornblau
|
||||
mpc.c Kostya Shishkov
|
||||
mpeg.c Michael Niedermayer
|
||||
mpegenc.c Michael Niedermayer
|
||||
mpegts.c Marton Balint
|
||||
mpegtsenc.c Baptiste Coudurier
|
||||
msnwc_tcp.c Ramiro Polla
|
||||
mtv.c Reynaldo H. Verdejo Pinochet
|
||||
mxf* Baptiste Coudurier
|
||||
mxfdec.c Tomas Härdin
|
||||
nistspheredec.c Paul B Mahol
|
||||
nsvdec.c Francois Revol
|
||||
nut* Michael Niedermayer
|
||||
nuv.c Reimar Doeffinger
|
||||
oggdec.c, oggdec.h David Conrad
|
||||
oggenc.c Baptiste Coudurier
|
||||
oggparse*.c David Conrad
|
||||
oggparsedaala* Rostislav Pehlivanov
|
||||
oma.c Maxim Poliakovski
|
||||
paf.c Paul B Mahol
|
||||
psxstr.c Mike Melanson
|
||||
pva.c Ivo van Poorten
|
||||
pvfdec.c Paul B Mahol
|
||||
r3d.c Baptiste Coudurier
|
||||
raw.c Michael Niedermayer
|
||||
rdt.c Ronald S. Bultje
|
||||
rl2.c Sascha Sommer
|
||||
rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov
|
||||
rtmp* Kostya Shishkov
|
||||
rtp.c, rtpenc.c Martin Storsjo
|
||||
rtpdec_ac3.* Gilles Chanteperdrix
|
||||
rtpdec_dv.* Thomas Volkert
|
||||
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
|
||||
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
||||
rtpdec_mpa_robust.* Gilles Chanteperdrix
|
||||
rtpdec_asf.* Ronald S. Bultje
|
||||
rtpdec_vp9.c Thomas Volkert
|
||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||
rtsp.c Luca Barbato
|
||||
sbgdec.c Nicolas George
|
||||
sdp.c Martin Storsjo
|
||||
segafilm.c Mike Melanson
|
||||
segment.c Stefano Sabatini
|
||||
siff.c Kostya Shishkov
|
||||
smacker.c Kostya Shishkov
|
||||
smjpeg* Paul B Mahol
|
||||
spdif* Anssi Hannula
|
||||
srtdec.c Aurelien Jacobs
|
||||
swf.c Baptiste Coudurier
|
||||
takdec.c Paul B Mahol
|
||||
tta.c Alex Beregszaszi
|
||||
txd.c Ivo van Poorten
|
||||
voc.c Aurelien Jacobs
|
||||
wav.c Michael Niedermayer
|
||||
wc3movie.c Mike Melanson
|
||||
webm dash (matroskaenc.c) Vignesh Venkatasubramanian
|
||||
webvtt* Matthew J Heaney
|
||||
westwood.c Mike Melanson
|
||||
wtv.c Peter Ross
|
||||
wv.c Kostya Shishkov
|
||||
wvenc.c Paul B Mahol
|
||||
|
||||
Protocols:
|
||||
async.c Zhang Rui
|
||||
bluray.c Petri Hintukainen
|
||||
ftp.c Lukasz Marek
|
||||
http.c Ronald S. Bultje
|
||||
libssh.c Lukasz Marek
|
||||
mms*.c Ronald S. Bultje
|
||||
udp.c Luca Abeni
|
||||
icecast.c Marvin Scholz
|
||||
|
||||
|
||||
libswresample
|
||||
=============
|
||||
|
||||
Generic parts:
|
||||
audioconvert.c Michael Niedermayer
|
||||
dither.c Michael Niedermayer
|
||||
rematrix*.c Michael Niedermayer
|
||||
swresample*.c Michael Niedermayer
|
||||
|
||||
Resamplers:
|
||||
resample*.c Michael Niedermayer
|
||||
soxr_resample.c Rob Sykes
|
||||
|
||||
|
||||
Operating systems / CPU architectures
|
||||
=====================================
|
||||
|
||||
Alpha Mans Rullgard, Falk Hueffner
|
||||
ARM Mans Rullgard
|
||||
AVR32 Mans Rullgard
|
||||
MIPS Mans Rullgard, Nedeljko Babic
|
||||
Mac OS X / PowerPC Romain Dolbeau, Guillaume Poirier
|
||||
Amiga / PowerPC Colin Ward
|
||||
Linux / PowerPC Luca Barbato
|
||||
Windows MinGW Alex Beregszaszi, Ramiro Polla
|
||||
Windows Cygwin Victor Paesa
|
||||
Windows MSVC Matthew Oliver, Hendrik Leppkes
|
||||
Windows ICL Matthew Oliver
|
||||
ADI/Blackfin DSP Marc Hoffman
|
||||
Sparc Roman Shaposhnik
|
||||
x86 Michael Niedermayer
|
||||
|
||||
|
||||
Releases
|
||||
========
|
||||
|
||||
2.8 Michael Niedermayer
|
||||
2.7 Michael Niedermayer
|
||||
2.6 Michael Niedermayer
|
||||
2.5 Michael Niedermayer
|
||||
2.4 Michael Niedermayer
|
||||
|
||||
If you want to maintain an older release, please contact us
|
||||
|
||||
|
||||
GnuPG Fingerprints of maintainers and contributors
|
||||
==================================================
|
||||
|
||||
Alexander Strasser 1C96 78B7 83CB 8AA7 9AF5 D1EB A7D8 A57B A876 E58F
|
||||
Anssi Hannula 1A92 FF42 2DD9 8D2E 8AF7 65A9 4278 C520 513D F3CB
|
||||
Anton Khirnov 6D0C 6625 56F8 65D1 E5F5 814B B50A 1241 C067 07AB
|
||||
Ash Hughes 694D 43D2 D180 C7C7 6421 ABD3 A641 D0B7 623D 6029
|
||||
Attila Kinali 11F0 F9A6 A1D2 11F6 C745 D10C 6520 BCDD F2DF E765
|
||||
Baptiste Coudurier 8D77 134D 20CC 9220 201F C5DB 0AC9 325C 5C1A BAAA
|
||||
Ben Littler 3EE3 3723 E560 3214 A8CD 4DEB 2CDB FCE7 768C 8D2C
|
||||
Benoit Fouet B22A 4F4F 43EF 636B BB66 FCDC 0023 AE1E 2985 49C8
|
||||
Clément Bœsch 52D0 3A82 D445 F194 DB8B 2B16 87EE 2CB8 F4B8 FCF9
|
||||
Daniel Verkamp 78A6 07ED 782C 653E C628 B8B9 F0EB 8DD8 2F0E 21C7
|
||||
Diego Biurrun 8227 1E31 B6D9 4994 7427 E220 9CAE D6CC 4757 FCC5
|
||||
FFmpeg release signing key FCF9 86EA 15E6 E293 A564 4F10 B432 2F04 D676 58D8
|
||||
Ganesh Ajjanagadde C96A 848E 97C3 CEA2 AB72 5CE4 45F9 6A2D 3C36 FB1B
|
||||
Gwenole Beauchesne 2E63 B3A6 3E44 37E2 017D 2704 53C7 6266 B153 99C4
|
||||
Jaikrishnan Menon 61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368
|
||||
Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
|
||||
Justin Ruggles 3136 ECC0 C10D 6C04 5F43 CA29 FCBE CD2A 3787 1EBF
|
||||
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
||||
Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
|
||||
Luca Barbato 6677 4209 213C 8843 5B67 29E7 E84C 78C2 84E9 0E34
|
||||
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
||||
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
|
||||
Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
|
||||
Peter Ross A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
|
||||
Philip Langdale 5DC5 8D66 5FBA 3A43 18EC 045E F8D6 B194 6A75 682E
|
||||
Reimar Doeffinger 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
|
||||
Robert Swain EE7A 56EA 4A81 A7B5 2001 A521 67FA 362D A2FC 3E71
|
||||
Sascha Sommer 38A0 F88B 868E 9D3A 97D4 D6A0 E823 706F 1E07 0D3C
|
||||
Stefano Sabatini 0D0B AD6B 5330 BBAD D3D6 6A0C 719C 2839 FC43 2D5F
|
||||
Stephan Hilb 4F38 0B3A 5F39 B99B F505 E562 8D5C 5554 4E17 8863
|
||||
Tiancheng "Timothy" Gu 9456 AFC0 814A 8139 E994 8351 7FE6 B095 B582 B0D4
|
||||
Tim Nicholson 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83
|
||||
Tomas Härdin A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551
|
||||
Wei Gao 4269 7741 857A 0E60 9EC5 08D2 4744 4EFA 62C1 87B9
|
||||
49
media/ffvpx/README.md
Normal file
49
media/ffvpx/README.md
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
FFmpeg README
|
||||
=============
|
||||
|
||||
FFmpeg is a collection of libraries and tools to process multimedia content
|
||||
such as audio, video, subtitles and related metadata.
|
||||
|
||||
## Libraries
|
||||
|
||||
* `libavcodec` provides implementation of a wider range of codecs.
|
||||
* `libavformat` implements streaming protocols, container formats and basic I/O access.
|
||||
* `libavutil` includes hashers, decompressors and miscellaneous utility functions.
|
||||
* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters.
|
||||
* `libavdevice` provides an abstraction to access capture and playback devices.
|
||||
* `libswresample` implements audio mixing and resampling routines.
|
||||
* `libswscale` implements color conversion and scaling routines.
|
||||
|
||||
## Tools
|
||||
|
||||
* [ffmpeg](https://ffmpeg.org/ffmpeg.html) is a command line toolbox to
|
||||
manipulate, convert and stream multimedia content.
|
||||
* [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
|
||||
* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect
|
||||
multimedia content.
|
||||
* [ffserver](https://ffmpeg.org/ffserver.html) is a multimedia streaming server
|
||||
for live broadcasts.
|
||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
|
||||
|
||||
## Documentation
|
||||
|
||||
The offline documentation is available in the **doc/** directory.
|
||||
|
||||
The online documentation is available in the main [website](https://ffmpeg.org)
|
||||
and in the [wiki](https://trac.ffmpeg.org).
|
||||
|
||||
### Examples
|
||||
|
||||
Coding examples are available in the **doc/examples** directory.
|
||||
|
||||
## License
|
||||
|
||||
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
|
||||
GPL. Please refer to the LICENSE file for detailed information.
|
||||
|
||||
## Contributing
|
||||
|
||||
Patches should be submitted to the ffmpeg-devel mailing list using
|
||||
`git format-patch` or `git send-email`. Github pull requests should be
|
||||
avoided because they are not part of our review process. Few developers
|
||||
follow pull requests so they will likely be ignored.
|
||||
39
media/ffvpx/README_MOZILLA
Normal file
39
media/ffvpx/README_MOZILLA
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
This directory contains files used in gecko builds from FFmpeg
|
||||
(http://ffmpeg.org). The current files are from FFmpeg as of
|
||||
revision n3.1.1-6-g86f9228
|
||||
All source files match their path from the library's source archive.
|
||||
|
||||
Currently, we only use the vp8 and vp9 portion of the library, and only on x86
|
||||
based platforms. If this changes, configuration files will most likely
|
||||
need to be updated.
|
||||
|
||||
AVX2 must be disabled on Linux due to the use of yasm 1.1 on the build bots.
|
||||
Once yasm is upgraded to 1.2 or later, AVX2 code could be re-enabled.
|
||||
Add --disable-avx2 to configure on those platforms.
|
||||
|
||||
configuration files were generated as follow using the configure script:
|
||||
./configure --disable-everything --disable-protocols --disable-demuxers --disable-muxers --disable-filters --disable-programs --disable-doc --disable-parsers --enable-parser=vp8 --enable-parser=vp9 --enable-decoder=vp8 --enable-decoder=vp9 --disable-static --enable-shared --disable-debug --disable-sdl --disable-libxcb --disable-securetransport --disable-iconv --disable-swresample --disable-swscale --disable-avdevice --disable-avfilter --disable-avformat --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vda --disable-vdpau --disable-videotoolbox --enable-asm --enable-yasm
|
||||
|
||||
config*:
|
||||
replace: /HAVE_(MALLOC_H|ARC4RANDOM|LOCALTIME_R|MEMALIGN|POSIX_MEMALIGN)/d
|
||||
|
||||
config_darwin32.h:
|
||||
add to configure command: --disable-asm --disable-yasm --cc='clang -m32'
|
||||
|
||||
config_unix32.h:
|
||||
add to configure command: --disable-asm --disable-yasm --cc='clang -m32'
|
||||
replace: s/HAVE_SYSCTL 1/HAVE_SYSCTL 0/ and s/HAVE_MEMALIGN 1/HAVE_MEMALIGN 0/ and s/HAVE_POSIX_MEMALIGN 1/HAVE_POSIX_MEMALIGN 0/
|
||||
|
||||
|
||||
config_unix64.h/config_unix64.asm:
|
||||
replace: s/HAVE_SYSCTL 1/HAVE_SYSCTL 0
|
||||
|
||||
config_win32/64.h/asm:
|
||||
add to configure command: --toolchain=msvc
|
||||
|
||||
23 Sept 2016: libavcodec/pthread_frame.c has been patched so as to avoid
|
||||
generating large numbers of warnings from TSan (Thread Sanitizer) when
|
||||
decoding vp9 streams. This will likely be fixed upstream sometime soon.
|
||||
When resyncing with upstream, first un-apply the patch shown at
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=1274256#c60, then resync,
|
||||
then assess whether the patch is still necessary.
|
||||
1
media/ffvpx/RELEASE
Normal file
1
media/ffvpx/RELEASE
Normal file
|
|
@ -0,0 +1 @@
|
|||
3.0
|
||||
15
media/ffvpx/RELEASE_NOTES
Normal file
15
media/ffvpx/RELEASE_NOTES
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
┌─────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 3.0 "Einstein" │
|
||||
└─────────────────────────────────────────┘
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 3.0 "Einstein", about 5
|
||||
months after the release of FFmpeg 2.8.
|
||||
|
||||
A complete Changelog is available at the root of the project, and the
|
||||
complete Git history on http://source.ffmpeg.org.
|
||||
|
||||
We hope you will like this release as much as we enjoyed working on it, and
|
||||
as usual, if you have any questions about it, or any FFmpeg related topic,
|
||||
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
|
||||
on the mailing-lists.
|
||||
65
media/ffvpx/changes.patch
Normal file
65
media/ffvpx/changes.patch
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
diff --git a/media/ffvpx/libavutil/eval.c b/media/ffvpx/libavutil/eval.c
|
||||
index 7642b91..e938bd5 100644
|
||||
--- a/media/ffvpx/libavutil/eval.c
|
||||
+++ b/media/ffvpx/libavutil/eval.c
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "internal.h"
|
||||
#include "log.h"
|
||||
#include "mathematics.h"
|
||||
-#include "time.h"
|
||||
+#include "fftime.h"
|
||||
#include "avstring.h"
|
||||
#include "timer.h"
|
||||
|
||||
diff --git a/media/ffvpx/libavutil/time.h b/media/ffvpx/libavutil/fftime.h
|
||||
similarity index 100%
|
||||
rename from media/ffvpx/libavutil/time.h
|
||||
rename to media/ffvpx/libavutil/fftime.h
|
||||
diff --git a/media/ffvpx/libavutil/time.c b/media/ffvpx/libavutil/time.c
|
||||
index dbaee02..69419e6 100644
|
||||
--- a/media/ffvpx/libavutil/time.c
|
||||
+++ b/media/ffvpx/libavutil/time.c
|
||||
@@ -33,7 +33,7 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
-#include "time.h"
|
||||
+#include "fftime.h"
|
||||
#include "error.h"
|
||||
|
||||
int64_t av_gettime(void)
|
||||
diff --git a/media/ffvpx/libavutil/parseutils.c b/media/ffvpx/libavutil/parseutils.c
|
||||
index 9fb8d0a..97ad3b9 100644
|
||||
--- a/media/ffvpx/libavutil/parseutils.c
|
||||
+++ b/media/ffvpx/libavutil/parseutils.c
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "common.h"
|
||||
#include "eval.h"
|
||||
#include "log.h"
|
||||
-#include "random_seed.h"
|
||||
+/* #include "random_seed.h" */
|
||||
#include "time_internal.h"
|
||||
#include "parseutils.h"
|
||||
|
||||
@@ -367,7 +367,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
|
||||
rgba_color[3] = 255;
|
||||
|
||||
if (!av_strcasecmp(color_string2, "random") || !av_strcasecmp(color_string2, "bikeshed")) {
|
||||
- int rgba = av_get_random_seed();
|
||||
+ int rgba = 0xffffffff; /* av_get_random_seed(); */
|
||||
rgba_color[0] = rgba >> 24;
|
||||
rgba_color[1] = rgba >> 16;
|
||||
rgba_color[2] = rgba >> 8;
|
||||
diff --git a/media/ffvpx/libavcodec/options.c b/media/ffvpx/libavcodec/options.c
|
||||
index d8e3dbf..f25df2a 100644
|
||||
--- a/media/ffvpx/libavcodec/options.c
|
||||
+++ b/media/ffvpx/libavcodec/options.c
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <string.h>
|
||||
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
-#include "options_table.h"
|
||||
+#include "ff_options_table.h"
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
|
||||
static const char* context_to_name(void* ptr) {
|
||||
34
media/ffvpx/compat/va_copy.h
Normal file
34
media/ffvpx/compat/va_copy.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* MSVC Compatible va_copy macro
|
||||
* Copyright (c) 2012 Derek Buitenhuis
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef COMPAT_VA_COPY_H
|
||||
#define COMPAT_VA_COPY_H
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#if !defined(va_copy) && defined(_MSC_VER)
|
||||
#define va_copy(dst, src) ((dst) = (src))
|
||||
#endif
|
||||
#if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3
|
||||
#define va_copy(dst, src) __va_copy(dst, src)
|
||||
#endif
|
||||
|
||||
#endif /* COMPAT_VA_COPY_H */
|
||||
418
media/ffvpx/compat/w32pthreads.h
Normal file
418
media/ffvpx/compat/w32pthreads.h
Normal file
|
|
@ -0,0 +1,418 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 x264 project
|
||||
*
|
||||
* Authors: Steven Walters <kemuri9@gmail.com>
|
||||
* Pegasys Inc. <http://www.pegasys-inc.com>
|
||||
*
|
||||
* 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
|
||||
* w32threads to pthreads wrapper
|
||||
*/
|
||||
|
||||
#ifndef COMPAT_W32PTHREADS_H
|
||||
#define COMPAT_W32PTHREADS_H
|
||||
|
||||
/* Build up a pthread-like API using underlying Windows API. Have only static
|
||||
* methods so as to not conflict with a potentially linked in pthread-win32
|
||||
* library.
|
||||
* As most functions here are used without checking return values,
|
||||
* only implement return values as necessary. */
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
|
||||
#if _WIN32_WINNT < 0x0600 && defined(__MINGW32__)
|
||||
#undef MemoryBarrier
|
||||
#define MemoryBarrier __sync_synchronize
|
||||
#endif
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
typedef struct pthread_t {
|
||||
void *handle;
|
||||
void *(*func)(void* arg);
|
||||
void *arg;
|
||||
void *ret;
|
||||
} pthread_t;
|
||||
|
||||
/* the conditional variable api for windows 6.0+ uses critical sections and
|
||||
* not mutexes */
|
||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||
|
||||
/* This is the CONDITION_VARIABLE typedef for using Windows' native
|
||||
* conditional variables on kernels 6.0+. */
|
||||
#if HAVE_CONDITION_VARIABLE_PTR
|
||||
typedef CONDITION_VARIABLE pthread_cond_t;
|
||||
#else
|
||||
typedef struct pthread_cond_t {
|
||||
void *Ptr;
|
||||
} pthread_cond_t;
|
||||
#endif
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
|
||||
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
|
||||
#endif
|
||||
|
||||
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
|
||||
{
|
||||
pthread_t *h = arg;
|
||||
h->ret = h->func(h->arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
|
||||
void *(*start_routine)(void*), void *arg)
|
||||
{
|
||||
thread->func = start_routine;
|
||||
thread->arg = arg;
|
||||
#if HAVE_WINRT
|
||||
thread->handle = (void*)CreateThread(NULL, 0, win32thread_worker, thread,
|
||||
0, NULL);
|
||||
#else
|
||||
thread->handle = (void*)_beginthreadex(NULL, 0, win32thread_worker, thread,
|
||||
0, NULL);
|
||||
#endif
|
||||
return !thread->handle;
|
||||
}
|
||||
|
||||
static av_unused int pthread_join(pthread_t thread, void **value_ptr)
|
||||
{
|
||||
DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
|
||||
if (ret != WAIT_OBJECT_0) {
|
||||
if (ret == WAIT_ABANDONED)
|
||||
return EINVAL;
|
||||
else
|
||||
return EDEADLK;
|
||||
}
|
||||
if (value_ptr)
|
||||
*value_ptr = thread.ret;
|
||||
CloseHandle(thread.handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pthread_mutex_init(pthread_mutex_t *m, void* attr)
|
||||
{
|
||||
InitializeCriticalSection(m);
|
||||
return 0;
|
||||
}
|
||||
static inline int pthread_mutex_destroy(pthread_mutex_t *m)
|
||||
{
|
||||
DeleteCriticalSection(m);
|
||||
return 0;
|
||||
}
|
||||
static inline int pthread_mutex_lock(pthread_mutex_t *m)
|
||||
{
|
||||
EnterCriticalSection(m);
|
||||
return 0;
|
||||
}
|
||||
static inline int pthread_mutex_unlock(pthread_mutex_t *m)
|
||||
{
|
||||
LeaveCriticalSection(m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
typedef INIT_ONCE pthread_once_t;
|
||||
#define PTHREAD_ONCE_INIT INIT_ONCE_STATIC_INIT
|
||||
|
||||
static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
|
||||
{
|
||||
BOOL pending = FALSE;
|
||||
InitOnceBeginInitialize(once_control, 0, &pending, NULL);
|
||||
if (pending)
|
||||
init_routine();
|
||||
InitOnceComplete(once_control, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
InitializeConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* native condition variables do not destroy */
|
||||
static inline int pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
WakeAllConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
SleepConditionVariableCS(cond, mutex, INFINITE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
WakeConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else // _WIN32_WINNT < 0x0600
|
||||
|
||||
/* atomic init state of dynamically loaded functions */
|
||||
static LONG w32thread_init_state = 0;
|
||||
static av_unused void w32thread_init(void);
|
||||
|
||||
/* for pre-Windows 6.0 platforms, define INIT_ONCE struct,
|
||||
* compatible to the one used in the native API */
|
||||
|
||||
typedef union pthread_once_t {
|
||||
void * Ptr; ///< For the Windows 6.0+ native functions
|
||||
LONG state; ///< For the pre-Windows 6.0 compat code
|
||||
} pthread_once_t;
|
||||
|
||||
#define PTHREAD_ONCE_INIT {0}
|
||||
|
||||
/* function pointers to init once API on windows 6.0+ kernels */
|
||||
static BOOL (WINAPI *initonce_begin)(pthread_once_t *lpInitOnce, DWORD dwFlags, BOOL *fPending, void **lpContext);
|
||||
static BOOL (WINAPI *initonce_complete)(pthread_once_t *lpInitOnce, DWORD dwFlags, void *lpContext);
|
||||
|
||||
/* pre-Windows 6.0 compat using a spin-lock */
|
||||
static inline void w32thread_once_fallback(LONG volatile *state, void (*init_routine)(void))
|
||||
{
|
||||
switch (InterlockedCompareExchange(state, 1, 0)) {
|
||||
/* Initial run */
|
||||
case 0:
|
||||
init_routine();
|
||||
InterlockedExchange(state, 2);
|
||||
break;
|
||||
/* Another thread is running init */
|
||||
case 1:
|
||||
while (1) {
|
||||
MemoryBarrier();
|
||||
if (*state == 2)
|
||||
break;
|
||||
Sleep(0);
|
||||
}
|
||||
break;
|
||||
/* Initialization complete */
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
|
||||
{
|
||||
w32thread_once_fallback(&w32thread_init_state, w32thread_init);
|
||||
|
||||
/* Use native functions on Windows 6.0+ */
|
||||
if (initonce_begin && initonce_complete) {
|
||||
BOOL pending = FALSE;
|
||||
initonce_begin(once_control, 0, &pending, NULL);
|
||||
if (pending)
|
||||
init_routine();
|
||||
initonce_complete(once_control, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
w32thread_once_fallback(&once_control->state, init_routine);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* for pre-Windows 6.0 platforms we need to define and use our own condition
|
||||
* variable and api */
|
||||
|
||||
typedef struct win32_cond_t {
|
||||
pthread_mutex_t mtx_broadcast;
|
||||
pthread_mutex_t mtx_waiter_count;
|
||||
volatile int waiter_count;
|
||||
HANDLE semaphore;
|
||||
HANDLE waiters_done;
|
||||
volatile int is_broadcast;
|
||||
} win32_cond_t;
|
||||
|
||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
|
||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
|
||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
DWORD milliseconds);
|
||||
|
||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
win32_cond_t *win32_cond = NULL;
|
||||
|
||||
w32thread_once_fallback(&w32thread_init_state, w32thread_init);
|
||||
|
||||
if (cond_init) {
|
||||
cond_init(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* non native condition variables */
|
||||
win32_cond = av_mallocz(sizeof(win32_cond_t));
|
||||
if (!win32_cond)
|
||||
return ENOMEM;
|
||||
cond->Ptr = win32_cond;
|
||||
win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
|
||||
if (!win32_cond->semaphore)
|
||||
return ENOMEM;
|
||||
win32_cond->waiters_done = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (!win32_cond->waiters_done)
|
||||
return ENOMEM;
|
||||
|
||||
pthread_mutex_init(&win32_cond->mtx_waiter_count, NULL);
|
||||
pthread_mutex_init(&win32_cond->mtx_broadcast, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
/* native condition variables do not destroy */
|
||||
if (cond_init)
|
||||
return 0;
|
||||
|
||||
/* non native condition variables */
|
||||
CloseHandle(win32_cond->semaphore);
|
||||
CloseHandle(win32_cond->waiters_done);
|
||||
pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
|
||||
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
|
||||
av_freep(&win32_cond);
|
||||
cond->Ptr = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int have_waiter;
|
||||
|
||||
if (cond_broadcast) {
|
||||
cond_broadcast(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* non native condition variables */
|
||||
pthread_mutex_lock(&win32_cond->mtx_broadcast);
|
||||
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
|
||||
have_waiter = 0;
|
||||
|
||||
if (win32_cond->waiter_count) {
|
||||
win32_cond->is_broadcast = 1;
|
||||
have_waiter = 1;
|
||||
}
|
||||
|
||||
if (have_waiter) {
|
||||
ReleaseSemaphore(win32_cond->semaphore, win32_cond->waiter_count, NULL);
|
||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||
WaitForSingleObject(win32_cond->waiters_done, INFINITE);
|
||||
ResetEvent(win32_cond->waiters_done);
|
||||
win32_cond->is_broadcast = 0;
|
||||
} else
|
||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int last_waiter;
|
||||
if (cond_wait) {
|
||||
cond_wait(cond, mutex, INFINITE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* non native condition variables */
|
||||
pthread_mutex_lock(&win32_cond->mtx_broadcast);
|
||||
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
|
||||
win32_cond->waiter_count++;
|
||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
|
||||
// unlock the external mutex
|
||||
pthread_mutex_unlock(mutex);
|
||||
WaitForSingleObject(win32_cond->semaphore, INFINITE);
|
||||
|
||||
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
|
||||
win32_cond->waiter_count--;
|
||||
last_waiter = !win32_cond->waiter_count || !win32_cond->is_broadcast;
|
||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||
|
||||
if (last_waiter)
|
||||
SetEvent(win32_cond->waiters_done);
|
||||
|
||||
// lock the external mutex
|
||||
return pthread_mutex_lock(mutex);
|
||||
}
|
||||
|
||||
static av_unused int pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int have_waiter;
|
||||
if (cond_signal) {
|
||||
cond_signal(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&win32_cond->mtx_broadcast);
|
||||
|
||||
/* non-native condition variables */
|
||||
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
|
||||
have_waiter = win32_cond->waiter_count;
|
||||
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
|
||||
|
||||
if (have_waiter) {
|
||||
ReleaseSemaphore(win32_cond->semaphore, 1, NULL);
|
||||
WaitForSingleObject(win32_cond->waiters_done, INFINITE);
|
||||
ResetEvent(win32_cond->waiters_done);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static av_unused void w32thread_init(void)
|
||||
{
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
|
||||
/* if one is available, then they should all be available */
|
||||
cond_init =
|
||||
(void*)GetProcAddress(kernel_dll, "InitializeConditionVariable");
|
||||
cond_broadcast =
|
||||
(void*)GetProcAddress(kernel_dll, "WakeAllConditionVariable");
|
||||
cond_signal =
|
||||
(void*)GetProcAddress(kernel_dll, "WakeConditionVariable");
|
||||
cond_wait =
|
||||
(void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS");
|
||||
initonce_begin =
|
||||
(void*)GetProcAddress(kernel_dll, "InitOnceBeginInitialize");
|
||||
initonce_complete =
|
||||
(void*)GetProcAddress(kernel_dll, "InitOnceComplete");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif /* COMPAT_W32PTHREADS_H */
|
||||
43
media/ffvpx/config.h
Normal file
43
media/ffvpx/config.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef MOZ_FFVPX_CONFIG_H
|
||||
#define MOZ_FFVPX_CONFIG_H
|
||||
#if defined(XP_WIN)
|
||||
// Avoid conflicts with mozilla-config.h
|
||||
#if !defined(_MSC_VER)
|
||||
#undef HAVE_DIRENT_H
|
||||
#undef HAVE_UNISTD_H
|
||||
#endif
|
||||
#if defined(HAVE_64BIT_BUILD)
|
||||
#include "config_win64.h"
|
||||
#else
|
||||
#include "config_win32.h"
|
||||
#endif
|
||||
// Adjust configure defines for GCC
|
||||
#if !defined(_MSC_VER)
|
||||
#if !defined(HAVE_64BIT_BUILD)
|
||||
#undef HAVE_MM_EMPTY
|
||||
#define HAVE_MM_EMPTY 0
|
||||
#endif
|
||||
#undef HAVE_LIBC_MSVCRT
|
||||
#define HAVE_LIBC_MSVCRT 0
|
||||
#endif
|
||||
#elif defined(XP_DARWIN)
|
||||
#if defined(HAVE_64BIT_BUILD)
|
||||
#include "config_darwin64.h"
|
||||
#else
|
||||
#include "config_darwin32.h"
|
||||
#endif
|
||||
#elif defined(XP_UNIX)
|
||||
#if defined(HAVE_64BIT_BUILD)
|
||||
#include "config_unix64.h"
|
||||
#else
|
||||
#include "config_unix32.h"
|
||||
#endif
|
||||
#endif
|
||||
#include "config_common.h"
|
||||
#endif // MOZ_FFVPX_CONFIG_H
|
||||
3
media/ffvpx/config_common.h
Normal file
3
media/ffvpx/config_common.h
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#ifndef MOZ_FFVPX_CONFIG_COMMON_H
|
||||
#define MOZ_FFVPX_CONFIG_COMMON_H
|
||||
#endif
|
||||
2175
media/ffvpx/config_darwin32.h
Normal file
2175
media/ffvpx/config_darwin32.h
Normal file
File diff suppressed because it is too large
Load diff
2159
media/ffvpx/config_darwin64.asm
Normal file
2159
media/ffvpx/config_darwin64.asm
Normal file
File diff suppressed because it is too large
Load diff
2175
media/ffvpx/config_darwin64.h
Normal file
2175
media/ffvpx/config_darwin64.h
Normal file
File diff suppressed because it is too large
Load diff
2174
media/ffvpx/config_unix32.h
Normal file
2174
media/ffvpx/config_unix32.h
Normal file
File diff suppressed because it is too large
Load diff
2159
media/ffvpx/config_unix64.asm
Normal file
2159
media/ffvpx/config_unix64.asm
Normal file
File diff suppressed because it is too large
Load diff
2175
media/ffvpx/config_unix64.h
Normal file
2175
media/ffvpx/config_unix64.h
Normal file
File diff suppressed because it is too large
Load diff
2159
media/ffvpx/config_win32.asm
Normal file
2159
media/ffvpx/config_win32.asm
Normal file
File diff suppressed because it is too large
Load diff
2175
media/ffvpx/config_win32.h
Normal file
2175
media/ffvpx/config_win32.h
Normal file
File diff suppressed because it is too large
Load diff
2159
media/ffvpx/config_win64.asm
Normal file
2159
media/ffvpx/config_win64.asm
Normal file
File diff suppressed because it is too large
Load diff
2175
media/ffvpx/config_win64.h
Normal file
2175
media/ffvpx/config_win64.h
Normal file
File diff suppressed because it is too large
Load diff
89
media/ffvpx/ffvpxcommon.mozbuild
Normal file
89
media/ffvpx/ffvpxcommon.mozbuild
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# Add assembler flags and includes
|
||||
ASFLAGS += CONFIG['FFVPX_ASFLAGS']
|
||||
ASFLAGS += ['-I%s/media/ffvpx' % TOPSRCDIR]
|
||||
|
||||
if CONFIG['FFVPX_ASFLAGS']:
|
||||
USE_YASM = True
|
||||
if CONFIG['OS_ARCH'] == 'WINNT':
|
||||
# Fix inline symbols and math defines for windows.
|
||||
DEFINES['_USE_MATH_DEFINES'] = True
|
||||
DEFINES['inline'] = "__inline"
|
||||
# 32-bit windows need to prefix symbols with an underscore.
|
||||
if CONFIG['CPU_ARCH'] == 'x86':
|
||||
ASFLAGS += ['-DPREFIX']
|
||||
ASFLAGS += ['-Pconfig_win32.asm']
|
||||
else:
|
||||
ASFLAGS += ['-Pconfig_win64.asm']
|
||||
elif CONFIG['OS_ARCH'] == 'Darwin':
|
||||
# 32/64-bit macosx assemblers need to prefix symbols with an underscore.
|
||||
ASFLAGS += [
|
||||
'-Pconfig_darwin64.asm',
|
||||
'-DPREFIX'
|
||||
]
|
||||
else:
|
||||
# Default to unix, similar to how ASFLAGS setup works in configure.in
|
||||
ASFLAGS += ['-Pconfig_unix64.asm']
|
||||
|
||||
LOCAL_INCLUDES += ['/media/ffvpx']
|
||||
|
||||
# We allow warnings for third-party code that can be updated from upstream.
|
||||
ALLOW_COMPILER_WARNINGS = True
|
||||
# Suppress warnings in third-party code.
|
||||
if CONFIG['GNU_CC']:
|
||||
CFLAGS += [
|
||||
'-Wno-parentheses',
|
||||
'-Wno-pointer-sign',
|
||||
'-Wno-sign-compare',
|
||||
'-Wno-switch',
|
||||
'-Wno-type-limits',
|
||||
'-Wno-unused-function',
|
||||
'-Wno-deprecated-declarations',
|
||||
]
|
||||
if CONFIG['CLANG_CXX']:
|
||||
CFLAGS += [
|
||||
'-Wno-incompatible-pointer-types-discards-qualifiers',
|
||||
'-Wno-logical-op-parentheses',
|
||||
]
|
||||
# Force visibility of cpu and av_log symbols.
|
||||
CFLAGS += ['-include', 'libavutil_visibility.h']
|
||||
elif CONFIG['_MSC_VER']:
|
||||
CFLAGS += [
|
||||
'-wd4090', # 'return' : different 'const' qualifiers
|
||||
'-wd4018', # '>' : signed/unsigned mismatch
|
||||
'-wd4305', # 'initializing' : truncation from '__int64' to 'double'
|
||||
'-wd4554', # '>>' : check operator precedence for possible error
|
||||
'-wd4307', # '+' : integral constant overflow'
|
||||
'-wd4028', # formal parameter 1 different from declaration
|
||||
'-wd4056', # overflow in floating-point constant arithmetic
|
||||
'-wd4756', # overflow in constant arithmetic
|
||||
'-wd4005', #'WIN32_LEAN_AND_MEAN' : macro redefinition
|
||||
'-wd4054', # 'type cast' : from function pointer 'FARPROC' to data pointer 'void *'
|
||||
'-wd4189', # local variable is initialized but not referenced
|
||||
'-wd4133', # 'function' : incompatible types - from 'AVSampleFormat *' to 'int *'
|
||||
'-wd4221', # nonstandard extension used
|
||||
'-wd4206', # nonstandard extension used
|
||||
'-wd4702', # unreachable code
|
||||
'-wd4101', # unreferenced local variable
|
||||
'-wd4245', # conversion from 'int' to 'uint32_t', signed/unsigned mismatch
|
||||
'-wd4703', # potentially uninitialized local pointer
|
||||
'-wd4293', # '<<' : shift count negative or too big, undefined behavior
|
||||
# from FFmpeg configure
|
||||
'-wd4244', '-wd4127', '-wd4018', '-wd4389', '-wd4146', '-wd4701',
|
||||
'-wd4057', '-wd4204', '-wd4706', '-wd4305', '-wd4152', '-wd4324',
|
||||
'-we4013', '-wd4100', '-wd4214', '-wd4307', '-wd4273', '-wd4554',
|
||||
]
|
||||
|
||||
DEFINES['HAVE_AV_CONFIG_H'] = True
|
||||
|
||||
if CONFIG['MOZ_DEBUG']:
|
||||
# Enable all assertions in debug builds.
|
||||
DEFINES['ASSERT_LEVEL'] = 2
|
||||
elif not CONFIG['RELEASE_OR_BETA']:
|
||||
# Enable fast assertions in opt builds of Nightly and Aurora.
|
||||
DEFINES['ASSERT_LEVEL'] = 1
|
||||
687
media/ffvpx/libavcodec/allcodecs.c
Normal file
687
media/ffvpx/libavcodec/allcodecs.c
Normal file
|
|
@ -0,0 +1,687 @@
|
|||
/*
|
||||
* Provide registration of all codecs, parsers and bitstream filters for libavcodec.
|
||||
* Copyright (c) 2002 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
* Provide registration of all codecs, parsers and bitstream filters for libavcodec.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "avcodec.h"
|
||||
#include "version.h"
|
||||
|
||||
#define REGISTER_HWACCEL(X, x) \
|
||||
{ \
|
||||
extern AVHWAccel ff_##x##_hwaccel; \
|
||||
if (CONFIG_##X##_HWACCEL) \
|
||||
av_register_hwaccel(&ff_##x##_hwaccel); \
|
||||
}
|
||||
|
||||
#define REGISTER_ENCODER(X, x) \
|
||||
{ \
|
||||
extern AVCodec ff_##x##_encoder; \
|
||||
if (CONFIG_##X##_ENCODER) \
|
||||
avcodec_register(&ff_##x##_encoder); \
|
||||
}
|
||||
|
||||
#define REGISTER_DECODER(X, x) \
|
||||
{ \
|
||||
extern AVCodec ff_##x##_decoder; \
|
||||
if (CONFIG_##X##_DECODER) \
|
||||
avcodec_register(&ff_##x##_decoder); \
|
||||
}
|
||||
|
||||
#define REGISTER_ENCDEC(X, x) REGISTER_ENCODER(X, x); REGISTER_DECODER(X, x)
|
||||
|
||||
#define REGISTER_PARSER(X, x) \
|
||||
{ \
|
||||
extern AVCodecParser ff_##x##_parser; \
|
||||
if (CONFIG_##X##_PARSER) \
|
||||
av_register_codec_parser(&ff_##x##_parser); \
|
||||
}
|
||||
|
||||
void avcodec_register_all(void)
|
||||
{
|
||||
static int initialized;
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
initialized = 1;
|
||||
|
||||
/* hardware accelerators */
|
||||
REGISTER_HWACCEL(H263_VAAPI, h263_vaapi);
|
||||
REGISTER_HWACCEL(H263_VIDEOTOOLBOX, h263_videotoolbox);
|
||||
REGISTER_HWACCEL(H264_CUVID, h264_cuvid);
|
||||
REGISTER_HWACCEL(H264_D3D11VA, h264_d3d11va);
|
||||
REGISTER_HWACCEL(H264_DXVA2, h264_dxva2);
|
||||
REGISTER_HWACCEL(H264_MMAL, h264_mmal);
|
||||
REGISTER_HWACCEL(H264_QSV, h264_qsv);
|
||||
REGISTER_HWACCEL(H264_VAAPI, h264_vaapi);
|
||||
REGISTER_HWACCEL(H264_VDA, h264_vda);
|
||||
REGISTER_HWACCEL(H264_VDA_OLD, h264_vda_old);
|
||||
REGISTER_HWACCEL(H264_VDPAU, h264_vdpau);
|
||||
REGISTER_HWACCEL(H264_VIDEOTOOLBOX, h264_videotoolbox);
|
||||
REGISTER_HWACCEL(HEVC_CUVID, hevc_cuvid);
|
||||
REGISTER_HWACCEL(HEVC_D3D11VA, hevc_d3d11va);
|
||||
REGISTER_HWACCEL(HEVC_DXVA2, hevc_dxva2);
|
||||
REGISTER_HWACCEL(HEVC_QSV, hevc_qsv);
|
||||
REGISTER_HWACCEL(HEVC_VAAPI, hevc_vaapi);
|
||||
REGISTER_HWACCEL(HEVC_VDPAU, hevc_vdpau);
|
||||
REGISTER_HWACCEL(MPEG1_XVMC, mpeg1_xvmc);
|
||||
REGISTER_HWACCEL(MPEG1_VDPAU, mpeg1_vdpau);
|
||||
REGISTER_HWACCEL(MPEG1_VIDEOTOOLBOX, mpeg1_videotoolbox);
|
||||
REGISTER_HWACCEL(MPEG2_XVMC, mpeg2_xvmc);
|
||||
REGISTER_HWACCEL(MPEG2_D3D11VA, mpeg2_d3d11va);
|
||||
REGISTER_HWACCEL(MPEG2_DXVA2, mpeg2_dxva2);
|
||||
REGISTER_HWACCEL(MPEG2_MMAL, mpeg2_mmal);
|
||||
REGISTER_HWACCEL(MPEG2_QSV, mpeg2_qsv);
|
||||
REGISTER_HWACCEL(MPEG2_VAAPI, mpeg2_vaapi);
|
||||
REGISTER_HWACCEL(MPEG2_VDPAU, mpeg2_vdpau);
|
||||
REGISTER_HWACCEL(MPEG2_VIDEOTOOLBOX, mpeg2_videotoolbox);
|
||||
REGISTER_HWACCEL(MPEG4_MMAL, mpeg4_mmal);
|
||||
REGISTER_HWACCEL(MPEG4_VAAPI, mpeg4_vaapi);
|
||||
REGISTER_HWACCEL(MPEG4_VDPAU, mpeg4_vdpau);
|
||||
REGISTER_HWACCEL(MPEG4_VIDEOTOOLBOX, mpeg4_videotoolbox);
|
||||
REGISTER_HWACCEL(VC1_CUVID, vc1_cuvid);
|
||||
REGISTER_HWACCEL(VC1_D3D11VA, vc1_d3d11va);
|
||||
REGISTER_HWACCEL(VC1_DXVA2, vc1_dxva2);
|
||||
REGISTER_HWACCEL(VC1_VAAPI, vc1_vaapi);
|
||||
REGISTER_HWACCEL(VC1_VDPAU, vc1_vdpau);
|
||||
REGISTER_HWACCEL(VC1_MMAL, vc1_mmal);
|
||||
REGISTER_HWACCEL(VC1_QSV, vc1_qsv);
|
||||
REGISTER_HWACCEL(VP8_CUVID, vp8_cuvid);
|
||||
REGISTER_HWACCEL(VP9_CUVID, vp9_cuvid);
|
||||
REGISTER_HWACCEL(VP9_D3D11VA, vp9_d3d11va);
|
||||
REGISTER_HWACCEL(VP9_DXVA2, vp9_dxva2);
|
||||
REGISTER_HWACCEL(VP9_VAAPI, vp9_vaapi);
|
||||
REGISTER_HWACCEL(WMV3_D3D11VA, wmv3_d3d11va);
|
||||
REGISTER_HWACCEL(WMV3_DXVA2, wmv3_dxva2);
|
||||
REGISTER_HWACCEL(WMV3_VAAPI, wmv3_vaapi);
|
||||
REGISTER_HWACCEL(WMV3_VDPAU, wmv3_vdpau);
|
||||
|
||||
/* video codecs */
|
||||
REGISTER_ENCODER(A64MULTI, a64multi);
|
||||
REGISTER_ENCODER(A64MULTI5, a64multi5);
|
||||
REGISTER_DECODER(AASC, aasc);
|
||||
REGISTER_DECODER(AIC, aic);
|
||||
REGISTER_ENCDEC (ALIAS_PIX, alias_pix);
|
||||
REGISTER_ENCDEC (AMV, amv);
|
||||
REGISTER_DECODER(ANM, anm);
|
||||
REGISTER_DECODER(ANSI, ansi);
|
||||
REGISTER_ENCDEC (APNG, apng);
|
||||
REGISTER_ENCDEC (ASV1, asv1);
|
||||
REGISTER_ENCDEC (ASV2, asv2);
|
||||
REGISTER_DECODER(AURA, aura);
|
||||
REGISTER_DECODER(AURA2, aura2);
|
||||
REGISTER_ENCDEC (AVRP, avrp);
|
||||
REGISTER_DECODER(AVRN, avrn);
|
||||
REGISTER_DECODER(AVS, avs);
|
||||
REGISTER_ENCDEC (AVUI, avui);
|
||||
REGISTER_ENCDEC (AYUV, ayuv);
|
||||
REGISTER_DECODER(BETHSOFTVID, bethsoftvid);
|
||||
REGISTER_DECODER(BFI, bfi);
|
||||
REGISTER_DECODER(BINK, bink);
|
||||
REGISTER_ENCDEC (BMP, bmp);
|
||||
REGISTER_DECODER(BMV_VIDEO, bmv_video);
|
||||
REGISTER_DECODER(BRENDER_PIX, brender_pix);
|
||||
REGISTER_DECODER(C93, c93);
|
||||
REGISTER_DECODER(CAVS, cavs);
|
||||
REGISTER_DECODER(CDGRAPHICS, cdgraphics);
|
||||
REGISTER_DECODER(CDXL, cdxl);
|
||||
REGISTER_DECODER(CFHD, cfhd);
|
||||
REGISTER_ENCDEC (CINEPAK, cinepak);
|
||||
REGISTER_ENCDEC (CLJR, cljr);
|
||||
REGISTER_DECODER(CLLC, cllc);
|
||||
REGISTER_ENCDEC (COMFORTNOISE, comfortnoise);
|
||||
REGISTER_DECODER(CPIA, cpia);
|
||||
REGISTER_DECODER(CSCD, cscd);
|
||||
REGISTER_DECODER(CYUV, cyuv);
|
||||
REGISTER_DECODER(DDS, dds);
|
||||
REGISTER_DECODER(DFA, dfa);
|
||||
REGISTER_DECODER(DIRAC, dirac);
|
||||
REGISTER_ENCDEC (DNXHD, dnxhd);
|
||||
REGISTER_ENCDEC (DPX, dpx);
|
||||
REGISTER_DECODER(DSICINVIDEO, dsicinvideo);
|
||||
REGISTER_DECODER(DVAUDIO, dvaudio);
|
||||
REGISTER_ENCDEC (DVVIDEO, dvvideo);
|
||||
REGISTER_DECODER(DXA, dxa);
|
||||
REGISTER_DECODER(DXTORY, dxtory);
|
||||
REGISTER_DECODER(DXV, dxv);
|
||||
REGISTER_DECODER(EACMV, eacmv);
|
||||
REGISTER_DECODER(EAMAD, eamad);
|
||||
REGISTER_DECODER(EATGQ, eatgq);
|
||||
REGISTER_DECODER(EATGV, eatgv);
|
||||
REGISTER_DECODER(EATQI, eatqi);
|
||||
REGISTER_DECODER(EIGHTBPS, eightbps);
|
||||
REGISTER_DECODER(EIGHTSVX_EXP, eightsvx_exp);
|
||||
REGISTER_DECODER(EIGHTSVX_FIB, eightsvx_fib);
|
||||
REGISTER_DECODER(ESCAPE124, escape124);
|
||||
REGISTER_DECODER(ESCAPE130, escape130);
|
||||
REGISTER_DECODER(EXR, exr);
|
||||
REGISTER_ENCDEC (FFV1, ffv1);
|
||||
REGISTER_ENCDEC (FFVHUFF, ffvhuff);
|
||||
REGISTER_DECODER(FIC, fic);
|
||||
REGISTER_ENCDEC (FLASHSV, flashsv);
|
||||
REGISTER_ENCDEC (FLASHSV2, flashsv2);
|
||||
REGISTER_DECODER(FLIC, flic);
|
||||
REGISTER_ENCDEC (FLV, flv);
|
||||
REGISTER_DECODER(FOURXM, fourxm);
|
||||
REGISTER_DECODER(FRAPS, fraps);
|
||||
REGISTER_DECODER(FRWU, frwu);
|
||||
REGISTER_DECODER(G2M, g2m);
|
||||
REGISTER_ENCDEC (GIF, gif);
|
||||
REGISTER_ENCDEC (H261, h261);
|
||||
REGISTER_ENCDEC (H263, h263);
|
||||
REGISTER_DECODER(H263I, h263i);
|
||||
REGISTER_ENCDEC (H263P, h263p);
|
||||
REGISTER_DECODER(H264, h264);
|
||||
REGISTER_DECODER(H264_CRYSTALHD, h264_crystalhd);
|
||||
REGISTER_DECODER(H264_MEDIACODEC, h264_mediacodec);
|
||||
REGISTER_DECODER(H264_MMAL, h264_mmal);
|
||||
REGISTER_DECODER(H264_QSV, h264_qsv);
|
||||
REGISTER_DECODER(H264_VDA, h264_vda);
|
||||
#if FF_API_VDPAU
|
||||
REGISTER_DECODER(H264_VDPAU, h264_vdpau);
|
||||
#endif
|
||||
REGISTER_ENCDEC (HAP, hap);
|
||||
REGISTER_DECODER(HEVC, hevc);
|
||||
REGISTER_DECODER(HEVC_QSV, hevc_qsv);
|
||||
REGISTER_DECODER(HNM4_VIDEO, hnm4_video);
|
||||
REGISTER_DECODER(HQ_HQA, hq_hqa);
|
||||
REGISTER_DECODER(HQX, hqx);
|
||||
REGISTER_ENCDEC (HUFFYUV, huffyuv);
|
||||
REGISTER_DECODER(IDCIN, idcin);
|
||||
REGISTER_DECODER(IFF_ILBM, iff_ilbm);
|
||||
REGISTER_DECODER(INDEO2, indeo2);
|
||||
REGISTER_DECODER(INDEO3, indeo3);
|
||||
REGISTER_DECODER(INDEO4, indeo4);
|
||||
REGISTER_DECODER(INDEO5, indeo5);
|
||||
REGISTER_DECODER(INTERPLAY_VIDEO, interplay_video);
|
||||
REGISTER_ENCDEC (JPEG2000, jpeg2000);
|
||||
REGISTER_ENCDEC (JPEGLS, jpegls);
|
||||
REGISTER_DECODER(JV, jv);
|
||||
REGISTER_DECODER(KGV1, kgv1);
|
||||
REGISTER_DECODER(KMVC, kmvc);
|
||||
REGISTER_DECODER(LAGARITH, lagarith);
|
||||
REGISTER_ENCODER(LJPEG, ljpeg);
|
||||
REGISTER_DECODER(LOCO, loco);
|
||||
REGISTER_DECODER(M101, m101);
|
||||
REGISTER_DECODER(MAGICYUV, magicyuv);
|
||||
REGISTER_DECODER(MDEC, mdec);
|
||||
REGISTER_DECODER(MIMIC, mimic);
|
||||
REGISTER_ENCDEC (MJPEG, mjpeg);
|
||||
REGISTER_DECODER(MJPEGB, mjpegb);
|
||||
REGISTER_DECODER(MMVIDEO, mmvideo);
|
||||
REGISTER_DECODER(MOTIONPIXELS, motionpixels);
|
||||
#if FF_API_XVMC
|
||||
REGISTER_DECODER(MPEG_XVMC, mpeg_xvmc);
|
||||
#endif /* FF_API_XVMC */
|
||||
REGISTER_ENCDEC (MPEG1VIDEO, mpeg1video);
|
||||
REGISTER_ENCDEC (MPEG2VIDEO, mpeg2video);
|
||||
REGISTER_ENCDEC (MPEG4, mpeg4);
|
||||
REGISTER_DECODER(MPEG4_CRYSTALHD, mpeg4_crystalhd);
|
||||
REGISTER_DECODER(MPEG4_MMAL, mpeg4_mmal);
|
||||
#if FF_API_VDPAU
|
||||
REGISTER_DECODER(MPEG4_VDPAU, mpeg4_vdpau);
|
||||
#endif
|
||||
REGISTER_DECODER(MPEGVIDEO, mpegvideo);
|
||||
#if FF_API_VDPAU
|
||||
REGISTER_DECODER(MPEG_VDPAU, mpeg_vdpau);
|
||||
REGISTER_DECODER(MPEG1_VDPAU, mpeg1_vdpau);
|
||||
#endif
|
||||
REGISTER_DECODER(MPEG2_MMAL, mpeg2_mmal);
|
||||
REGISTER_DECODER(MPEG2_CRYSTALHD, mpeg2_crystalhd);
|
||||
REGISTER_DECODER(MPEG2_QSV, mpeg2_qsv);
|
||||
REGISTER_DECODER(MSA1, msa1);
|
||||
REGISTER_DECODER(MSMPEG4_CRYSTALHD, msmpeg4_crystalhd);
|
||||
REGISTER_DECODER(MSMPEG4V1, msmpeg4v1);
|
||||
REGISTER_ENCDEC (MSMPEG4V2, msmpeg4v2);
|
||||
REGISTER_ENCDEC (MSMPEG4V3, msmpeg4v3);
|
||||
REGISTER_DECODER(MSRLE, msrle);
|
||||
REGISTER_DECODER(MSS1, mss1);
|
||||
REGISTER_DECODER(MSS2, mss2);
|
||||
REGISTER_ENCDEC (MSVIDEO1, msvideo1);
|
||||
REGISTER_DECODER(MSZH, mszh);
|
||||
REGISTER_DECODER(MTS2, mts2);
|
||||
REGISTER_DECODER(MVC1, mvc1);
|
||||
REGISTER_DECODER(MVC2, mvc2);
|
||||
REGISTER_DECODER(MXPEG, mxpeg);
|
||||
REGISTER_DECODER(NUV, nuv);
|
||||
REGISTER_DECODER(PAF_VIDEO, paf_video);
|
||||
REGISTER_ENCDEC (PAM, pam);
|
||||
REGISTER_ENCDEC (PBM, pbm);
|
||||
REGISTER_ENCDEC (PCX, pcx);
|
||||
REGISTER_ENCDEC (PGM, pgm);
|
||||
REGISTER_ENCDEC (PGMYUV, pgmyuv);
|
||||
REGISTER_DECODER(PICTOR, pictor);
|
||||
REGISTER_ENCDEC (PNG, png);
|
||||
REGISTER_ENCDEC (PPM, ppm);
|
||||
REGISTER_ENCDEC (PRORES, prores);
|
||||
REGISTER_ENCODER(PRORES_AW, prores_aw);
|
||||
REGISTER_ENCODER(PRORES_KS, prores_ks);
|
||||
REGISTER_DECODER(PRORES_LGPL, prores_lgpl);
|
||||
REGISTER_DECODER(PTX, ptx);
|
||||
REGISTER_DECODER(QDRAW, qdraw);
|
||||
REGISTER_DECODER(QPEG, qpeg);
|
||||
REGISTER_ENCDEC (QTRLE, qtrle);
|
||||
REGISTER_ENCDEC (R10K, r10k);
|
||||
REGISTER_ENCDEC (R210, r210);
|
||||
REGISTER_ENCDEC (RAWVIDEO, rawvideo);
|
||||
REGISTER_DECODER(RL2, rl2);
|
||||
REGISTER_ENCDEC (ROQ, roq);
|
||||
REGISTER_DECODER(RPZA, rpza);
|
||||
REGISTER_DECODER(RSCC, rscc);
|
||||
REGISTER_ENCDEC (RV10, rv10);
|
||||
REGISTER_ENCDEC (RV20, rv20);
|
||||
REGISTER_DECODER(RV30, rv30);
|
||||
REGISTER_DECODER(RV40, rv40);
|
||||
REGISTER_ENCDEC (S302M, s302m);
|
||||
REGISTER_DECODER(SANM, sanm);
|
||||
REGISTER_DECODER(SCREENPRESSO, screenpresso);
|
||||
REGISTER_DECODER(SDX2_DPCM, sdx2_dpcm);
|
||||
REGISTER_ENCDEC (SGI, sgi);
|
||||
REGISTER_DECODER(SGIRLE, sgirle);
|
||||
REGISTER_DECODER(SHEERVIDEO, sheervideo);
|
||||
REGISTER_DECODER(SMACKER, smacker);
|
||||
REGISTER_DECODER(SMC, smc);
|
||||
REGISTER_DECODER(SMVJPEG, smvjpeg);
|
||||
REGISTER_ENCDEC (SNOW, snow);
|
||||
REGISTER_DECODER(SP5X, sp5x);
|
||||
REGISTER_ENCDEC (SUNRAST, sunrast);
|
||||
REGISTER_ENCDEC (SVQ1, svq1);
|
||||
REGISTER_DECODER(SVQ3, svq3);
|
||||
REGISTER_ENCDEC (TARGA, targa);
|
||||
REGISTER_DECODER(TARGA_Y216, targa_y216);
|
||||
REGISTER_DECODER(TDSC, tdsc);
|
||||
REGISTER_DECODER(THEORA, theora);
|
||||
REGISTER_DECODER(THP, thp);
|
||||
REGISTER_DECODER(TIERTEXSEQVIDEO, tiertexseqvideo);
|
||||
REGISTER_ENCDEC (TIFF, tiff);
|
||||
REGISTER_DECODER(TMV, tmv);
|
||||
REGISTER_DECODER(TRUEMOTION1, truemotion1);
|
||||
REGISTER_DECODER(TRUEMOTION2, truemotion2);
|
||||
REGISTER_DECODER(TRUEMOTION2RT, truemotion2rt);
|
||||
REGISTER_DECODER(TSCC, tscc);
|
||||
REGISTER_DECODER(TSCC2, tscc2);
|
||||
REGISTER_DECODER(TXD, txd);
|
||||
REGISTER_DECODER(ULTI, ulti);
|
||||
REGISTER_ENCDEC (UTVIDEO, utvideo);
|
||||
REGISTER_ENCDEC (V210, v210);
|
||||
REGISTER_DECODER(V210X, v210x);
|
||||
REGISTER_ENCDEC (V308, v308);
|
||||
REGISTER_ENCDEC (V408, v408);
|
||||
REGISTER_ENCDEC (V410, v410);
|
||||
REGISTER_DECODER(VB, vb);
|
||||
REGISTER_DECODER(VBLE, vble);
|
||||
REGISTER_DECODER(VC1, vc1);
|
||||
REGISTER_DECODER(VC1_CRYSTALHD, vc1_crystalhd);
|
||||
#if FF_API_VDPAU
|
||||
REGISTER_DECODER(VC1_VDPAU, vc1_vdpau);
|
||||
#endif
|
||||
REGISTER_DECODER(VC1IMAGE, vc1image);
|
||||
REGISTER_DECODER(VC1_MMAL, vc1_mmal);
|
||||
REGISTER_DECODER(VC1_QSV, vc1_qsv);
|
||||
REGISTER_ENCODER(VC2, vc2);
|
||||
REGISTER_DECODER(VCR1, vcr1);
|
||||
REGISTER_DECODER(VMDVIDEO, vmdvideo);
|
||||
REGISTER_DECODER(VMNC, vmnc);
|
||||
REGISTER_DECODER(VP3, vp3);
|
||||
REGISTER_DECODER(VP5, vp5);
|
||||
REGISTER_DECODER(VP6, vp6);
|
||||
REGISTER_DECODER(VP6A, vp6a);
|
||||
REGISTER_DECODER(VP6F, vp6f);
|
||||
REGISTER_DECODER(VP7, vp7);
|
||||
REGISTER_DECODER(VP8, vp8);
|
||||
REGISTER_DECODER(VP9, vp9);
|
||||
REGISTER_DECODER(VQA, vqa);
|
||||
REGISTER_DECODER(WEBP, webp);
|
||||
REGISTER_ENCODER(WRAPPED_AVFRAME, wrapped_avframe);
|
||||
REGISTER_ENCDEC (WMV1, wmv1);
|
||||
REGISTER_ENCDEC (WMV2, wmv2);
|
||||
REGISTER_DECODER(WMV3, wmv3);
|
||||
REGISTER_DECODER(WMV3_CRYSTALHD, wmv3_crystalhd);
|
||||
#if FF_API_VDPAU
|
||||
REGISTER_DECODER(WMV3_VDPAU, wmv3_vdpau);
|
||||
#endif
|
||||
REGISTER_DECODER(WMV3IMAGE, wmv3image);
|
||||
REGISTER_DECODER(WNV1, wnv1);
|
||||
REGISTER_DECODER(XAN_WC3, xan_wc3);
|
||||
REGISTER_DECODER(XAN_WC4, xan_wc4);
|
||||
REGISTER_ENCDEC (XBM, xbm);
|
||||
REGISTER_ENCDEC (XFACE, xface);
|
||||
REGISTER_DECODER(XL, xl);
|
||||
REGISTER_ENCDEC (XWD, xwd);
|
||||
REGISTER_ENCDEC (Y41P, y41p);
|
||||
REGISTER_DECODER(YLC, ylc);
|
||||
REGISTER_DECODER(YOP, yop);
|
||||
REGISTER_ENCDEC (YUV4, yuv4);
|
||||
REGISTER_DECODER(ZERO12V, zero12v);
|
||||
REGISTER_DECODER(ZEROCODEC, zerocodec);
|
||||
REGISTER_ENCDEC (ZLIB, zlib);
|
||||
REGISTER_ENCDEC (ZMBV, zmbv);
|
||||
|
||||
/* audio codecs */
|
||||
REGISTER_ENCDEC (AAC, aac);
|
||||
REGISTER_DECODER(AAC_FIXED, aac_fixed);
|
||||
REGISTER_DECODER(AAC_LATM, aac_latm);
|
||||
REGISTER_ENCDEC (AC3, ac3);
|
||||
REGISTER_ENCDEC (AC3_FIXED, ac3_fixed);
|
||||
REGISTER_ENCDEC (ALAC, alac);
|
||||
REGISTER_DECODER(ALS, als);
|
||||
REGISTER_DECODER(AMRNB, amrnb);
|
||||
REGISTER_DECODER(AMRWB, amrwb);
|
||||
REGISTER_DECODER(APE, ape);
|
||||
REGISTER_DECODER(ATRAC1, atrac1);
|
||||
REGISTER_DECODER(ATRAC3, atrac3);
|
||||
REGISTER_DECODER(ATRAC3P, atrac3p);
|
||||
REGISTER_DECODER(BINKAUDIO_DCT, binkaudio_dct);
|
||||
REGISTER_DECODER(BINKAUDIO_RDFT, binkaudio_rdft);
|
||||
REGISTER_DECODER(BMV_AUDIO, bmv_audio);
|
||||
REGISTER_DECODER(COOK, cook);
|
||||
REGISTER_ENCDEC (DCA, dca);
|
||||
REGISTER_DECODER(DSD_LSBF, dsd_lsbf);
|
||||
REGISTER_DECODER(DSD_MSBF, dsd_msbf);
|
||||
REGISTER_DECODER(DSD_LSBF_PLANAR, dsd_lsbf_planar);
|
||||
REGISTER_DECODER(DSD_MSBF_PLANAR, dsd_msbf_planar);
|
||||
REGISTER_DECODER(DSICINAUDIO, dsicinaudio);
|
||||
REGISTER_DECODER(DSS_SP, dss_sp);
|
||||
REGISTER_DECODER(DST, dst);
|
||||
REGISTER_ENCDEC (EAC3, eac3);
|
||||
REGISTER_DECODER(EVRC, evrc);
|
||||
REGISTER_DECODER(FFWAVESYNTH, ffwavesynth);
|
||||
REGISTER_ENCDEC (FLAC, flac);
|
||||
REGISTER_ENCDEC (G723_1, g723_1);
|
||||
REGISTER_DECODER(G729, g729);
|
||||
REGISTER_DECODER(GSM, gsm);
|
||||
REGISTER_DECODER(GSM_MS, gsm_ms);
|
||||
REGISTER_DECODER(IAC, iac);
|
||||
REGISTER_DECODER(IMC, imc);
|
||||
REGISTER_DECODER(INTERPLAY_ACM, interplay_acm);
|
||||
REGISTER_DECODER(MACE3, mace3);
|
||||
REGISTER_DECODER(MACE6, mace6);
|
||||
REGISTER_DECODER(METASOUND, metasound);
|
||||
REGISTER_DECODER(MLP, mlp);
|
||||
REGISTER_DECODER(MP1, mp1);
|
||||
REGISTER_DECODER(MP1FLOAT, mp1float);
|
||||
REGISTER_ENCDEC (MP2, mp2);
|
||||
REGISTER_DECODER(MP2FLOAT, mp2float);
|
||||
REGISTER_ENCODER(MP2FIXED, mp2fixed);
|
||||
REGISTER_DECODER(MP3, mp3);
|
||||
REGISTER_DECODER(MP3FLOAT, mp3float);
|
||||
REGISTER_DECODER(MP3ADU, mp3adu);
|
||||
REGISTER_DECODER(MP3ADUFLOAT, mp3adufloat);
|
||||
REGISTER_DECODER(MP3ON4, mp3on4);
|
||||
REGISTER_DECODER(MP3ON4FLOAT, mp3on4float);
|
||||
REGISTER_DECODER(MPC7, mpc7);
|
||||
REGISTER_DECODER(MPC8, mpc8);
|
||||
REGISTER_ENCDEC (NELLYMOSER, nellymoser);
|
||||
REGISTER_DECODER(ON2AVC, on2avc);
|
||||
REGISTER_DECODER(OPUS, opus);
|
||||
REGISTER_DECODER(PAF_AUDIO, paf_audio);
|
||||
REGISTER_DECODER(QCELP, qcelp);
|
||||
REGISTER_DECODER(QDM2, qdm2);
|
||||
REGISTER_ENCDEC (RA_144, ra_144);
|
||||
REGISTER_DECODER(RA_288, ra_288);
|
||||
REGISTER_DECODER(RALF, ralf);
|
||||
REGISTER_DECODER(SHORTEN, shorten);
|
||||
REGISTER_DECODER(SIPR, sipr);
|
||||
REGISTER_DECODER(SMACKAUD, smackaud);
|
||||
REGISTER_ENCDEC (SONIC, sonic);
|
||||
REGISTER_ENCODER(SONIC_LS, sonic_ls);
|
||||
REGISTER_DECODER(TAK, tak);
|
||||
REGISTER_DECODER(TRUEHD, truehd);
|
||||
REGISTER_DECODER(TRUESPEECH, truespeech);
|
||||
REGISTER_ENCDEC (TTA, tta);
|
||||
REGISTER_DECODER(TWINVQ, twinvq);
|
||||
REGISTER_DECODER(VMDAUDIO, vmdaudio);
|
||||
REGISTER_ENCDEC (VORBIS, vorbis);
|
||||
REGISTER_ENCDEC (WAVPACK, wavpack);
|
||||
REGISTER_DECODER(WMALOSSLESS, wmalossless);
|
||||
REGISTER_DECODER(WMAPRO, wmapro);
|
||||
REGISTER_ENCDEC (WMAV1, wmav1);
|
||||
REGISTER_ENCDEC (WMAV2, wmav2);
|
||||
REGISTER_DECODER(WMAVOICE, wmavoice);
|
||||
REGISTER_DECODER(WS_SND1, ws_snd1);
|
||||
REGISTER_DECODER(XMA1, xma1);
|
||||
REGISTER_DECODER(XMA2, xma2);
|
||||
|
||||
/* PCM codecs */
|
||||
REGISTER_ENCDEC (PCM_ALAW, pcm_alaw);
|
||||
REGISTER_DECODER(PCM_BLURAY, pcm_bluray);
|
||||
REGISTER_DECODER(PCM_DVD, pcm_dvd);
|
||||
REGISTER_ENCDEC (PCM_F32BE, pcm_f32be);
|
||||
REGISTER_ENCDEC (PCM_F32LE, pcm_f32le);
|
||||
REGISTER_ENCDEC (PCM_F64BE, pcm_f64be);
|
||||
REGISTER_ENCDEC (PCM_F64LE, pcm_f64le);
|
||||
REGISTER_DECODER(PCM_LXF, pcm_lxf);
|
||||
REGISTER_ENCDEC (PCM_MULAW, pcm_mulaw);
|
||||
REGISTER_ENCDEC (PCM_S8, pcm_s8);
|
||||
REGISTER_ENCDEC (PCM_S8_PLANAR, pcm_s8_planar);
|
||||
REGISTER_ENCDEC (PCM_S16BE, pcm_s16be);
|
||||
REGISTER_ENCDEC (PCM_S16BE_PLANAR, pcm_s16be_planar);
|
||||
REGISTER_ENCDEC (PCM_S16LE, pcm_s16le);
|
||||
REGISTER_ENCDEC (PCM_S16LE_PLANAR, pcm_s16le_planar);
|
||||
REGISTER_ENCDEC (PCM_S24BE, pcm_s24be);
|
||||
REGISTER_ENCDEC (PCM_S24DAUD, pcm_s24daud);
|
||||
REGISTER_ENCDEC (PCM_S24LE, pcm_s24le);
|
||||
REGISTER_ENCDEC (PCM_S24LE_PLANAR, pcm_s24le_planar);
|
||||
REGISTER_ENCDEC (PCM_S32BE, pcm_s32be);
|
||||
REGISTER_ENCDEC (PCM_S32LE, pcm_s32le);
|
||||
REGISTER_ENCDEC (PCM_S32LE_PLANAR, pcm_s32le_planar);
|
||||
REGISTER_ENCDEC (PCM_U8, pcm_u8);
|
||||
REGISTER_ENCDEC (PCM_U16BE, pcm_u16be);
|
||||
REGISTER_ENCDEC (PCM_U16LE, pcm_u16le);
|
||||
REGISTER_ENCDEC (PCM_U24BE, pcm_u24be);
|
||||
REGISTER_ENCDEC (PCM_U24LE, pcm_u24le);
|
||||
REGISTER_ENCDEC (PCM_U32BE, pcm_u32be);
|
||||
REGISTER_ENCDEC (PCM_U32LE, pcm_u32le);
|
||||
REGISTER_DECODER(PCM_ZORK, pcm_zork);
|
||||
|
||||
/* DPCM codecs */
|
||||
REGISTER_DECODER(INTERPLAY_DPCM, interplay_dpcm);
|
||||
REGISTER_ENCDEC (ROQ_DPCM, roq_dpcm);
|
||||
REGISTER_DECODER(SOL_DPCM, sol_dpcm);
|
||||
REGISTER_DECODER(XAN_DPCM, xan_dpcm);
|
||||
|
||||
/* ADPCM codecs */
|
||||
REGISTER_DECODER(ADPCM_4XM, adpcm_4xm);
|
||||
REGISTER_ENCDEC (ADPCM_ADX, adpcm_adx);
|
||||
REGISTER_DECODER(ADPCM_AFC, adpcm_afc);
|
||||
REGISTER_DECODER(ADPCM_AICA, adpcm_aica);
|
||||
REGISTER_DECODER(ADPCM_CT, adpcm_ct);
|
||||
REGISTER_DECODER(ADPCM_DTK, adpcm_dtk);
|
||||
REGISTER_DECODER(ADPCM_EA, adpcm_ea);
|
||||
REGISTER_DECODER(ADPCM_EA_MAXIS_XA, adpcm_ea_maxis_xa);
|
||||
REGISTER_DECODER(ADPCM_EA_R1, adpcm_ea_r1);
|
||||
REGISTER_DECODER(ADPCM_EA_R2, adpcm_ea_r2);
|
||||
REGISTER_DECODER(ADPCM_EA_R3, adpcm_ea_r3);
|
||||
REGISTER_DECODER(ADPCM_EA_XAS, adpcm_ea_xas);
|
||||
REGISTER_ENCDEC (ADPCM_G722, adpcm_g722);
|
||||
REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);
|
||||
REGISTER_DECODER(ADPCM_G726LE, adpcm_g726le);
|
||||
REGISTER_DECODER(ADPCM_IMA_AMV, adpcm_ima_amv);
|
||||
REGISTER_DECODER(ADPCM_IMA_APC, adpcm_ima_apc);
|
||||
REGISTER_DECODER(ADPCM_IMA_DAT4, adpcm_ima_dat4);
|
||||
REGISTER_DECODER(ADPCM_IMA_DK3, adpcm_ima_dk3);
|
||||
REGISTER_DECODER(ADPCM_IMA_DK4, adpcm_ima_dk4);
|
||||
REGISTER_DECODER(ADPCM_IMA_EA_EACS, adpcm_ima_ea_eacs);
|
||||
REGISTER_DECODER(ADPCM_IMA_EA_SEAD, adpcm_ima_ea_sead);
|
||||
REGISTER_DECODER(ADPCM_IMA_ISS, adpcm_ima_iss);
|
||||
REGISTER_DECODER(ADPCM_IMA_OKI, adpcm_ima_oki);
|
||||
REGISTER_ENCDEC (ADPCM_IMA_QT, adpcm_ima_qt);
|
||||
REGISTER_DECODER(ADPCM_IMA_RAD, adpcm_ima_rad);
|
||||
REGISTER_DECODER(ADPCM_IMA_SMJPEG, adpcm_ima_smjpeg);
|
||||
REGISTER_ENCDEC (ADPCM_IMA_WAV, adpcm_ima_wav);
|
||||
REGISTER_DECODER(ADPCM_IMA_WS, adpcm_ima_ws);
|
||||
REGISTER_ENCDEC (ADPCM_MS, adpcm_ms);
|
||||
REGISTER_DECODER(ADPCM_MTAF, adpcm_mtaf);
|
||||
REGISTER_DECODER(ADPCM_PSX, adpcm_psx);
|
||||
REGISTER_DECODER(ADPCM_SBPRO_2, adpcm_sbpro_2);
|
||||
REGISTER_DECODER(ADPCM_SBPRO_3, adpcm_sbpro_3);
|
||||
REGISTER_DECODER(ADPCM_SBPRO_4, adpcm_sbpro_4);
|
||||
REGISTER_ENCDEC (ADPCM_SWF, adpcm_swf);
|
||||
REGISTER_DECODER(ADPCM_THP, adpcm_thp);
|
||||
REGISTER_DECODER(ADPCM_THP_LE, adpcm_thp_le);
|
||||
REGISTER_DECODER(ADPCM_VIMA, adpcm_vima);
|
||||
REGISTER_DECODER(ADPCM_XA, adpcm_xa);
|
||||
REGISTER_ENCDEC (ADPCM_YAMAHA, adpcm_yamaha);
|
||||
|
||||
/* subtitles */
|
||||
REGISTER_ENCDEC (SSA, ssa);
|
||||
REGISTER_ENCDEC (ASS, ass);
|
||||
REGISTER_DECODER(CCAPTION, ccaption);
|
||||
REGISTER_ENCDEC (DVBSUB, dvbsub);
|
||||
REGISTER_ENCDEC (DVDSUB, dvdsub);
|
||||
REGISTER_DECODER(JACOSUB, jacosub);
|
||||
REGISTER_DECODER(MICRODVD, microdvd);
|
||||
REGISTER_ENCDEC (MOVTEXT, movtext);
|
||||
REGISTER_DECODER(MPL2, mpl2);
|
||||
REGISTER_DECODER(PGSSUB, pgssub);
|
||||
REGISTER_DECODER(PJS, pjs);
|
||||
REGISTER_DECODER(REALTEXT, realtext);
|
||||
REGISTER_DECODER(SAMI, sami);
|
||||
REGISTER_ENCDEC (SRT, srt);
|
||||
REGISTER_DECODER(STL, stl);
|
||||
REGISTER_ENCDEC (SUBRIP, subrip);
|
||||
REGISTER_DECODER(SUBVIEWER, subviewer);
|
||||
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
||||
REGISTER_ENCDEC (TEXT, text);
|
||||
REGISTER_DECODER(VPLAYER, vplayer);
|
||||
REGISTER_ENCDEC (WEBVTT, webvtt);
|
||||
REGISTER_ENCDEC (XSUB, xsub);
|
||||
|
||||
/* external libraries */
|
||||
REGISTER_ENCDEC (AAC_AT, aac_at);
|
||||
REGISTER_DECODER(AC3_AT, ac3_at);
|
||||
REGISTER_DECODER(ADPCM_IMA_QT_AT, adpcm_ima_qt_at);
|
||||
REGISTER_ENCDEC (ALAC_AT, alac_at);
|
||||
REGISTER_DECODER(AMR_NB_AT, amr_nb_at);
|
||||
REGISTER_DECODER(EAC3_AT, eac3_at);
|
||||
REGISTER_DECODER(GSM_MS_AT, gsm_ms_at);
|
||||
REGISTER_ENCDEC (ILBC_AT, ilbc_at);
|
||||
REGISTER_DECODER(MP1_AT, mp1_at);
|
||||
REGISTER_DECODER(MP2_AT, mp2_at);
|
||||
REGISTER_DECODER(MP3_AT, mp3_at);
|
||||
REGISTER_ENCDEC (PCM_ALAW_AT, pcm_alaw_at);
|
||||
REGISTER_ENCDEC (PCM_MULAW_AT, pcm_mulaw_at);
|
||||
REGISTER_DECODER(QDMC_AT, qdmc_at);
|
||||
REGISTER_DECODER(QDM2_AT, qdm2_at);
|
||||
REGISTER_DECODER(LIBCELT, libcelt);
|
||||
REGISTER_ENCODER(LIBFAAC, libfaac);
|
||||
REGISTER_ENCDEC (LIBFDK_AAC, libfdk_aac);
|
||||
REGISTER_ENCDEC (LIBGSM, libgsm);
|
||||
REGISTER_ENCDEC (LIBGSM_MS, libgsm_ms);
|
||||
REGISTER_ENCDEC (LIBILBC, libilbc);
|
||||
REGISTER_ENCODER(LIBMP3LAME, libmp3lame);
|
||||
REGISTER_ENCDEC (LIBOPENCORE_AMRNB, libopencore_amrnb);
|
||||
REGISTER_DECODER(LIBOPENCORE_AMRWB, libopencore_amrwb);
|
||||
REGISTER_ENCDEC (LIBOPENJPEG, libopenjpeg);
|
||||
REGISTER_ENCDEC (LIBOPUS, libopus);
|
||||
REGISTER_ENCDEC (LIBSCHROEDINGER, libschroedinger);
|
||||
REGISTER_ENCODER(LIBSHINE, libshine);
|
||||
REGISTER_ENCDEC (LIBSPEEX, libspeex);
|
||||
REGISTER_ENCODER(LIBTHEORA, libtheora);
|
||||
REGISTER_ENCODER(LIBTWOLAME, libtwolame);
|
||||
REGISTER_ENCODER(LIBVO_AMRWBENC, libvo_amrwbenc);
|
||||
REGISTER_ENCDEC (LIBVORBIS, libvorbis);
|
||||
REGISTER_ENCDEC (LIBVPX_VP8, libvpx_vp8);
|
||||
REGISTER_ENCDEC (LIBVPX_VP9, libvpx_vp9);
|
||||
REGISTER_ENCODER(LIBWAVPACK, libwavpack);
|
||||
REGISTER_ENCODER(LIBWEBP_ANIM, libwebp_anim); /* preferred over libwebp */
|
||||
REGISTER_ENCODER(LIBWEBP, libwebp);
|
||||
REGISTER_ENCODER(LIBX262, libx262);
|
||||
REGISTER_ENCODER(LIBX264, libx264);
|
||||
REGISTER_ENCODER(LIBX264RGB, libx264rgb);
|
||||
REGISTER_ENCODER(LIBX265, libx265);
|
||||
REGISTER_ENCODER(LIBXAVS, libxavs);
|
||||
REGISTER_ENCODER(LIBXVID, libxvid);
|
||||
REGISTER_DECODER(LIBZVBI_TELETEXT, libzvbi_teletext);
|
||||
|
||||
/* text */
|
||||
REGISTER_DECODER(BINTEXT, bintext);
|
||||
REGISTER_DECODER(XBIN, xbin);
|
||||
REGISTER_DECODER(IDF, idf);
|
||||
|
||||
/* external libraries, that shouldn't be used by default if one of the
|
||||
* above is available */
|
||||
REGISTER_ENCODER(LIBOPENH264, libopenh264);
|
||||
REGISTER_DECODER(H264_CUVID, h264_cuvid);
|
||||
REGISTER_ENCODER(H264_NVENC, h264_nvenc);
|
||||
REGISTER_ENCODER(H264_OMX, h264_omx);
|
||||
REGISTER_ENCODER(H264_QSV, h264_qsv);
|
||||
REGISTER_ENCODER(H264_VAAPI, h264_vaapi);
|
||||
REGISTER_ENCODER(H264_VIDEOTOOLBOX, h264_videotoolbox);
|
||||
#if FF_API_NVENC_OLD_NAME
|
||||
REGISTER_ENCODER(NVENC, nvenc);
|
||||
REGISTER_ENCODER(NVENC_H264, nvenc_h264);
|
||||
REGISTER_ENCODER(NVENC_HEVC, nvenc_hevc);
|
||||
#endif
|
||||
REGISTER_DECODER(HEVC_CUVID, hevc_cuvid);
|
||||
REGISTER_ENCODER(HEVC_NVENC, hevc_nvenc);
|
||||
REGISTER_ENCODER(HEVC_QSV, hevc_qsv);
|
||||
REGISTER_ENCODER(HEVC_VAAPI, hevc_vaapi);
|
||||
REGISTER_ENCODER(LIBKVAZAAR, libkvazaar);
|
||||
REGISTER_ENCODER(MJPEG_VAAPI, mjpeg_vaapi);
|
||||
REGISTER_ENCODER(MPEG2_QSV, mpeg2_qsv);
|
||||
REGISTER_DECODER(VC1_CUVID, vc1_cuvid);
|
||||
REGISTER_DECODER(VP8_CUVID, vp8_cuvid);
|
||||
REGISTER_DECODER(VP9_CUVID, vp9_cuvid);
|
||||
|
||||
/* parsers */
|
||||
REGISTER_PARSER(AAC, aac);
|
||||
REGISTER_PARSER(AAC_LATM, aac_latm);
|
||||
REGISTER_PARSER(AC3, ac3);
|
||||
REGISTER_PARSER(ADX, adx);
|
||||
REGISTER_PARSER(BMP, bmp);
|
||||
REGISTER_PARSER(CAVSVIDEO, cavsvideo);
|
||||
REGISTER_PARSER(COOK, cook);
|
||||
REGISTER_PARSER(DCA, dca);
|
||||
REGISTER_PARSER(DIRAC, dirac);
|
||||
REGISTER_PARSER(DNXHD, dnxhd);
|
||||
REGISTER_PARSER(DPX, dpx);
|
||||
REGISTER_PARSER(DVAUDIO, dvaudio);
|
||||
REGISTER_PARSER(DVBSUB, dvbsub);
|
||||
REGISTER_PARSER(DVDSUB, dvdsub);
|
||||
REGISTER_PARSER(DVD_NAV, dvd_nav);
|
||||
REGISTER_PARSER(FLAC, flac);
|
||||
REGISTER_PARSER(G729, g729);
|
||||
REGISTER_PARSER(GSM, gsm);
|
||||
REGISTER_PARSER(H261, h261);
|
||||
REGISTER_PARSER(H263, h263);
|
||||
REGISTER_PARSER(H264, h264);
|
||||
REGISTER_PARSER(HEVC, hevc);
|
||||
REGISTER_PARSER(MJPEG, mjpeg);
|
||||
REGISTER_PARSER(MLP, mlp);
|
||||
REGISTER_PARSER(MPEG4VIDEO, mpeg4video);
|
||||
REGISTER_PARSER(MPEGAUDIO, mpegaudio);
|
||||
REGISTER_PARSER(MPEGVIDEO, mpegvideo);
|
||||
REGISTER_PARSER(OPUS, opus);
|
||||
REGISTER_PARSER(PNG, png);
|
||||
REGISTER_PARSER(PNM, pnm);
|
||||
REGISTER_PARSER(RV30, rv30);
|
||||
REGISTER_PARSER(RV40, rv40);
|
||||
REGISTER_PARSER(TAK, tak);
|
||||
REGISTER_PARSER(VC1, vc1);
|
||||
REGISTER_PARSER(VORBIS, vorbis);
|
||||
REGISTER_PARSER(VP3, vp3);
|
||||
REGISTER_PARSER(VP8, vp8);
|
||||
REGISTER_PARSER(VP9, vp9);
|
||||
}
|
||||
120
media/ffvpx/libavcodec/audioconvert.c
Normal file
120
media/ffvpx/libavcodec/audioconvert.c
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* audio conversion
|
||||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* audio conversion
|
||||
* @author Michael Niedermayer <michaelni@gmx.at>
|
||||
*/
|
||||
|
||||
#include "libavutil/avstring.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/libm.h"
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "avcodec.h"
|
||||
#include "audioconvert.h"
|
||||
|
||||
#if FF_API_AUDIO_CONVERT
|
||||
|
||||
struct AVAudioConvert {
|
||||
int in_channels, out_channels;
|
||||
int fmt_pair;
|
||||
};
|
||||
|
||||
AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels,
|
||||
enum AVSampleFormat in_fmt, int in_channels,
|
||||
const float *matrix, int flags)
|
||||
{
|
||||
AVAudioConvert *ctx;
|
||||
if (in_channels!=out_channels)
|
||||
return NULL; /* FIXME: not supported */
|
||||
ctx = av_malloc(sizeof(AVAudioConvert));
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
ctx->in_channels = in_channels;
|
||||
ctx->out_channels = out_channels;
|
||||
ctx->fmt_pair = out_fmt + AV_SAMPLE_FMT_NB*in_fmt;
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void av_audio_convert_free(AVAudioConvert *ctx)
|
||||
{
|
||||
av_free(ctx);
|
||||
}
|
||||
|
||||
int av_audio_convert(AVAudioConvert *ctx,
|
||||
void * const out[6], const int out_stride[6],
|
||||
const void * const in[6], const int in_stride[6], int len)
|
||||
{
|
||||
int ch;
|
||||
|
||||
//FIXME optimize common cases
|
||||
|
||||
for(ch=0; ch<ctx->out_channels; ch++){
|
||||
const int is= in_stride[ch];
|
||||
const int os= out_stride[ch];
|
||||
const uint8_t *pi= in[ch];
|
||||
uint8_t *po= out[ch];
|
||||
uint8_t *end= po + os*len;
|
||||
if(!out[ch])
|
||||
continue;
|
||||
|
||||
#define CONV(ofmt, otype, ifmt, expr)\
|
||||
if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
|
||||
do{\
|
||||
*(otype*)po = expr; pi += is; po += os;\
|
||||
}while(po < end);\
|
||||
}
|
||||
|
||||
//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
|
||||
//FIXME rounding ?
|
||||
|
||||
CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_U8 , *(const uint8_t*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8)
|
||||
else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<24)
|
||||
else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7)))
|
||||
else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7)))
|
||||
else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S16, (*(const int16_t*)pi>>8) + 0x80)
|
||||
else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi<<16)
|
||||
else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15)))
|
||||
else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15)))
|
||||
else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S32, (*(const int32_t*)pi>>24) + 0x80)
|
||||
else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi>>16)
|
||||
else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1U<<31)))
|
||||
else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1U<<31)))
|
||||
else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8( lrintf(*(const float*)pi * (1<<7)) + 0x80))
|
||||
else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16( lrintf(*(const float*)pi * (1<<15))))
|
||||
else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31))))
|
||||
else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_FLT, *(const float*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_FLT, *(const float*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8( lrint(*(const double*)pi * (1<<7)) + 0x80))
|
||||
else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16( lrint(*(const double*)pi * (1<<15))))
|
||||
else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31))))
|
||||
else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_DBL, *(const double*)pi)
|
||||
else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_DBL, *(const double*)pi)
|
||||
else return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* FF_API_AUDIO_CONVERT */
|
||||
86
media/ffvpx/libavcodec/audioconvert.h
Normal file
86
media/ffvpx/libavcodec/audioconvert.h
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* audio conversion
|
||||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||||
* Copyright (c) 2008 Peter Ross
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_AUDIOCONVERT_H
|
||||
#define AVCODEC_AUDIOCONVERT_H
|
||||
|
||||
#include "version.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Audio format conversion routines
|
||||
* This interface is deprecated and will be dropped in a future
|
||||
* version. You should use the libswresample library instead.
|
||||
*/
|
||||
|
||||
#if FF_API_AUDIO_CONVERT
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "avcodec.h"
|
||||
#include "libavutil/channel_layout.h"
|
||||
|
||||
struct AVAudioConvert;
|
||||
typedef struct AVAudioConvert AVAudioConvert;
|
||||
|
||||
/**
|
||||
* Create an audio sample format converter context
|
||||
* @param out_fmt Output sample format
|
||||
* @param out_channels Number of output channels
|
||||
* @param in_fmt Input sample format
|
||||
* @param in_channels Number of input channels
|
||||
* @param[in] matrix Channel mixing matrix (of dimension in_channel*out_channels). Set to NULL to ignore.
|
||||
* @param flags See AV_CPU_FLAG_xx
|
||||
* @return NULL on error
|
||||
* @deprecated See libswresample
|
||||
*/
|
||||
|
||||
attribute_deprecated
|
||||
AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels,
|
||||
enum AVSampleFormat in_fmt, int in_channels,
|
||||
const float *matrix, int flags);
|
||||
|
||||
/**
|
||||
* Free audio sample format converter context
|
||||
* @deprecated See libswresample
|
||||
*/
|
||||
|
||||
attribute_deprecated
|
||||
void av_audio_convert_free(AVAudioConvert *ctx);
|
||||
|
||||
/**
|
||||
* Convert between audio sample formats
|
||||
* @param[in] out array of output buffers for each channel. set to NULL to ignore processing of the given channel.
|
||||
* @param[in] out_stride distance between consecutive output samples (measured in bytes)
|
||||
* @param[in] in array of input buffers for each channel
|
||||
* @param[in] in_stride distance between consecutive input samples (measured in bytes)
|
||||
* @param len length of audio frame size (measured in samples)
|
||||
* @deprecated See libswresample
|
||||
*/
|
||||
|
||||
attribute_deprecated
|
||||
int av_audio_convert(AVAudioConvert *ctx,
|
||||
void * const out[6], const int out_stride[6],
|
||||
const void * const in[6], const int in_stride[6], int len);
|
||||
|
||||
#endif /* FF_API_AUDIO_CONVERT */
|
||||
|
||||
#endif /* AVCODEC_AUDIOCONVERT_H */
|
||||
6100
media/ffvpx/libavcodec/avcodec.h
Normal file
6100
media/ffvpx/libavcodec/avcodec.h
Normal file
File diff suppressed because it is too large
Load diff
129
media/ffvpx/libavcodec/avcodec.symbols
Normal file
129
media/ffvpx/libavcodec/avcodec.symbols
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
av_bitstream_filter_close
|
||||
av_bitstream_filter_filter
|
||||
av_bitstream_filter_init
|
||||
av_bitstream_filter_next
|
||||
av_codec_ffversion
|
||||
av_codec_get_chroma_intra_matrix
|
||||
av_codec_get_codec_descriptor
|
||||
av_codec_get_codec_properties
|
||||
av_codec_get_lowres
|
||||
av_codec_get_max_lowres
|
||||
av_codec_get_pkt_timebase
|
||||
av_codec_get_seek_preroll
|
||||
av_codec_is_decoder
|
||||
av_codec_is_encoder
|
||||
av_codec_next
|
||||
av_codec_set_chroma_intra_matrix
|
||||
av_codec_set_codec_descriptor
|
||||
av_codec_set_lowres
|
||||
av_codec_set_pkt_timebase
|
||||
av_codec_set_seek_preroll
|
||||
av_copy_packet
|
||||
av_copy_packet_side_data
|
||||
av_dup_packet
|
||||
av_fast_padded_malloc
|
||||
av_fast_padded_mallocz
|
||||
av_free_packet
|
||||
av_get_audio_frame_duration
|
||||
av_get_bits_per_sample
|
||||
av_get_codec_tag_string
|
||||
av_get_exact_bits_per_sample
|
||||
av_get_pcm_codec
|
||||
av_get_profile_name
|
||||
av_grow_packet
|
||||
av_hwaccel_next
|
||||
av_init_packet
|
||||
av_lockmgr_register
|
||||
av_log_ask_for_sample
|
||||
av_log_missing_feature
|
||||
av_new_packet
|
||||
av_packet_copy_props
|
||||
av_packet_free_side_data
|
||||
av_packet_from_data
|
||||
av_packet_get_side_data
|
||||
av_packet_merge_side_data
|
||||
av_packet_move_ref
|
||||
av_packet_new_side_data
|
||||
av_packet_pack_dictionary
|
||||
av_packet_ref
|
||||
av_packet_rescale_ts
|
||||
av_packet_shrink_side_data
|
||||
av_packet_side_data_name
|
||||
av_packet_split_side_data
|
||||
av_packet_unpack_dictionary
|
||||
av_packet_unref
|
||||
av_parser_change
|
||||
av_parser_close
|
||||
av_parser_init
|
||||
av_parser_next
|
||||
av_parser_parse2
|
||||
av_picture_copy
|
||||
av_picture_crop
|
||||
av_picture_pad
|
||||
av_qsv_alloc_context
|
||||
av_register_bitstream_filter
|
||||
av_register_codec_parser
|
||||
av_register_hwaccel
|
||||
av_resample
|
||||
av_resample_close
|
||||
av_resample_compensate
|
||||
av_resample_init
|
||||
av_shrink_packet
|
||||
av_vorbis_parse_frame
|
||||
av_vorbis_parse_frame_flags
|
||||
av_vorbis_parse_free
|
||||
av_vorbis_parse_init
|
||||
av_vorbis_parse_reset
|
||||
av_xiphlacing
|
||||
avcodec_align_dimensions
|
||||
avcodec_align_dimensions2
|
||||
avcodec_alloc_context3
|
||||
avcodec_chroma_pos_to_enum
|
||||
avcodec_close
|
||||
avcodec_configuration
|
||||
avcodec_copy_context
|
||||
avcodec_decode_audio4
|
||||
avcodec_decode_subtitle2
|
||||
avcodec_decode_video2
|
||||
avcodec_default_execute
|
||||
avcodec_default_execute2
|
||||
avcodec_default_get_buffer2
|
||||
avcodec_default_get_format
|
||||
avcodec_descriptor_get
|
||||
avcodec_descriptor_get_by_name
|
||||
avcodec_descriptor_next
|
||||
avcodec_enum_to_chroma_pos
|
||||
avcodec_fill_audio_frame
|
||||
avcodec_find_best_pix_fmt2
|
||||
avcodec_find_best_pix_fmt_of_2
|
||||
avcodec_find_best_pix_fmt_of_list
|
||||
avcodec_find_decoder
|
||||
avcodec_find_decoder_by_name
|
||||
avcodec_find_encoder
|
||||
avcodec_find_encoder_by_name
|
||||
avcodec_flush_buffers
|
||||
avcodec_free_context
|
||||
avcodec_get_chroma_sub_sample
|
||||
avcodec_get_class
|
||||
avcodec_get_context_defaults3
|
||||
avcodec_get_edge_width
|
||||
avcodec_get_frame_class
|
||||
avcodec_get_name
|
||||
avcodec_get_pix_fmt_loss
|
||||
avcodec_get_subtitle_rect_class
|
||||
avcodec_get_type
|
||||
avcodec_is_open
|
||||
avcodec_license
|
||||
avcodec_open2
|
||||
avcodec_pix_fmt_to_codec_tag
|
||||
avcodec_register
|
||||
avcodec_register_all
|
||||
avcodec_set_dimensions
|
||||
avcodec_string
|
||||
avcodec_version
|
||||
avpicture_alloc
|
||||
avpicture_fill
|
||||
avpicture_free
|
||||
avpicture_get_size
|
||||
avpicture_layout
|
||||
avsubtitle_free
|
||||
84
media/ffvpx/libavcodec/avdct.h
Normal file
84
media/ffvpx/libavcodec/avdct.h
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_AVDCT_H
|
||||
#define AVCODEC_AVDCT_H
|
||||
|
||||
#include "libavutil/opt.h"
|
||||
|
||||
/**
|
||||
* AVDCT context.
|
||||
* @note function pointers can be NULL if the specific features have been
|
||||
* disabled at build time.
|
||||
*/
|
||||
typedef struct AVDCT {
|
||||
const AVClass *av_class;
|
||||
|
||||
void (*idct)(int16_t *block /* align 16 */);
|
||||
|
||||
/**
|
||||
* IDCT input permutation.
|
||||
* Several optimized IDCTs need a permutated input (relative to the
|
||||
* normal order of the reference IDCT).
|
||||
* This permutation must be performed before the idct_put/add.
|
||||
* Note, normally this can be merged with the zigzag/alternate scan<br>
|
||||
* An example to avoid confusion:
|
||||
* - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
|
||||
* - (x -> reference DCT -> reference IDCT -> x)
|
||||
* - (x -> reference DCT -> simple_mmx_perm = idct_permutation
|
||||
* -> simple_idct_mmx -> x)
|
||||
* - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
|
||||
* -> simple_idct_mmx -> ...)
|
||||
*/
|
||||
uint8_t idct_permutation[64];
|
||||
|
||||
void (*fdct)(int16_t *block /* align 16 */);
|
||||
|
||||
|
||||
/**
|
||||
* DCT algorithm.
|
||||
* must use AVOptions to set this field.
|
||||
*/
|
||||
int dct_algo;
|
||||
|
||||
/**
|
||||
* IDCT algorithm.
|
||||
* must use AVOptions to set this field.
|
||||
*/
|
||||
int idct_algo;
|
||||
|
||||
void (*get_pixels)(int16_t *block /* align 16 */,
|
||||
const uint8_t *pixels /* align 8 */,
|
||||
ptrdiff_t line_size);
|
||||
|
||||
int bits_per_sample;
|
||||
} AVDCT;
|
||||
|
||||
/**
|
||||
* Allocates a AVDCT context.
|
||||
* This needs to be initialized with avcodec_dct_init() after optionally
|
||||
* configuring it with AVOptions.
|
||||
*
|
||||
* To free it use av_free()
|
||||
*/
|
||||
AVDCT *avcodec_dct_alloc(void);
|
||||
int avcodec_dct_init(AVDCT *);
|
||||
|
||||
const AVClass *avcodec_dct_get_class(void);
|
||||
|
||||
#endif /* AVCODEC_AVDCT_H */
|
||||
664
media/ffvpx/libavcodec/avpacket.c
Normal file
664
media/ffvpx/libavcodec/avpacket.c
Normal file
|
|
@ -0,0 +1,664 @@
|
|||
/*
|
||||
* AVPacket functions for libavcodec
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
*
|
||||
* 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 <string.h>
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "avcodec.h"
|
||||
#include "bytestream.h"
|
||||
#include "internal.h"
|
||||
|
||||
void av_init_packet(AVPacket *pkt)
|
||||
{
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
pkt->dts = AV_NOPTS_VALUE;
|
||||
pkt->pos = -1;
|
||||
pkt->duration = 0;
|
||||
#if FF_API_CONVERGENCE_DURATION
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
pkt->convergence_duration = 0;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
pkt->flags = 0;
|
||||
pkt->stream_index = 0;
|
||||
pkt->buf = NULL;
|
||||
pkt->side_data = NULL;
|
||||
pkt->side_data_elems = 0;
|
||||
}
|
||||
|
||||
AVPacket *av_packet_alloc(void)
|
||||
{
|
||||
AVPacket *pkt = av_mallocz(sizeof(AVPacket));
|
||||
if (!pkt)
|
||||
return pkt;
|
||||
|
||||
av_packet_unref(pkt);
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
void av_packet_free(AVPacket **pkt)
|
||||
{
|
||||
if (!pkt || !*pkt)
|
||||
return;
|
||||
|
||||
av_packet_unref(*pkt);
|
||||
av_freep(pkt);
|
||||
}
|
||||
|
||||
static int packet_alloc(AVBufferRef **buf, int size)
|
||||
{
|
||||
int ret;
|
||||
if (size < 0 || size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
ret = av_buffer_realloc(buf, size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
memset((*buf)->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_new_packet(AVPacket *pkt, int size)
|
||||
{
|
||||
AVBufferRef *buf = NULL;
|
||||
int ret = packet_alloc(&buf, size);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
av_init_packet(pkt);
|
||||
pkt->buf = buf;
|
||||
pkt->data = buf->data;
|
||||
pkt->size = size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void av_shrink_packet(AVPacket *pkt, int size)
|
||||
{
|
||||
if (pkt->size <= size)
|
||||
return;
|
||||
pkt->size = size;
|
||||
memset(pkt->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
}
|
||||
|
||||
int av_grow_packet(AVPacket *pkt, int grow_by)
|
||||
{
|
||||
int new_size;
|
||||
av_assert0((unsigned)pkt->size <= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if ((unsigned)grow_by >
|
||||
INT_MAX - (pkt->size + AV_INPUT_BUFFER_PADDING_SIZE))
|
||||
return -1;
|
||||
|
||||
new_size = pkt->size + grow_by + AV_INPUT_BUFFER_PADDING_SIZE;
|
||||
if (pkt->buf) {
|
||||
size_t data_offset;
|
||||
uint8_t *old_data = pkt->data;
|
||||
if (pkt->data == NULL) {
|
||||
data_offset = 0;
|
||||
pkt->data = pkt->buf->data;
|
||||
} else {
|
||||
data_offset = pkt->data - pkt->buf->data;
|
||||
if (data_offset > INT_MAX - new_size)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (new_size + data_offset > pkt->buf->size) {
|
||||
int ret = av_buffer_realloc(&pkt->buf, new_size + data_offset);
|
||||
if (ret < 0) {
|
||||
pkt->data = old_data;
|
||||
return ret;
|
||||
}
|
||||
pkt->data = pkt->buf->data + data_offset;
|
||||
}
|
||||
} else {
|
||||
pkt->buf = av_buffer_alloc(new_size);
|
||||
if (!pkt->buf)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(pkt->buf->data, pkt->data, pkt->size);
|
||||
pkt->data = pkt->buf->data;
|
||||
}
|
||||
pkt->size += grow_by;
|
||||
memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
|
||||
{
|
||||
if (size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
pkt->buf = av_buffer_create(data, size + AV_INPUT_BUFFER_PADDING_SIZE,
|
||||
av_buffer_default_free, NULL, 0);
|
||||
if (!pkt->buf)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
pkt->data = data;
|
||||
pkt->size = size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if FF_API_AVPACKET_OLD_API
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
#define ALLOC_MALLOC(data, size) data = av_malloc(size)
|
||||
#define ALLOC_BUF(data, size) \
|
||||
do { \
|
||||
av_buffer_realloc(&pkt->buf, size); \
|
||||
data = pkt->buf ? pkt->buf->data : NULL; \
|
||||
} while (0)
|
||||
|
||||
#define DUP_DATA(dst, src, size, padding, ALLOC) \
|
||||
do { \
|
||||
void *data; \
|
||||
if (padding) { \
|
||||
if ((unsigned)(size) > \
|
||||
(unsigned)(size) + AV_INPUT_BUFFER_PADDING_SIZE) \
|
||||
goto failed_alloc; \
|
||||
ALLOC(data, size + AV_INPUT_BUFFER_PADDING_SIZE); \
|
||||
} else { \
|
||||
ALLOC(data, size); \
|
||||
} \
|
||||
if (!data) \
|
||||
goto failed_alloc; \
|
||||
memcpy(data, src, size); \
|
||||
if (padding) \
|
||||
memset((uint8_t *)data + size, 0, \
|
||||
AV_INPUT_BUFFER_PADDING_SIZE); \
|
||||
dst = data; \
|
||||
} while (0)
|
||||
|
||||
/* Makes duplicates of data, side_data, but does not copy any other fields */
|
||||
static int copy_packet_data(AVPacket *pkt, const AVPacket *src, int dup)
|
||||
{
|
||||
pkt->data = NULL;
|
||||
pkt->side_data = NULL;
|
||||
if (pkt->buf) {
|
||||
AVBufferRef *ref = av_buffer_ref(src->buf);
|
||||
if (!ref)
|
||||
return AVERROR(ENOMEM);
|
||||
pkt->buf = ref;
|
||||
pkt->data = ref->data;
|
||||
} else {
|
||||
DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
|
||||
}
|
||||
if (pkt->side_data_elems && dup)
|
||||
pkt->side_data = src->side_data;
|
||||
if (pkt->side_data_elems && !dup) {
|
||||
return av_copy_packet_side_data(pkt, src);
|
||||
}
|
||||
return 0;
|
||||
|
||||
failed_alloc:
|
||||
av_packet_unref(pkt);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
int av_copy_packet_side_data(AVPacket *pkt, const AVPacket *src)
|
||||
{
|
||||
if (src->side_data_elems) {
|
||||
int i;
|
||||
DUP_DATA(pkt->side_data, src->side_data,
|
||||
src->side_data_elems * sizeof(*src->side_data), 0, ALLOC_MALLOC);
|
||||
if (src != pkt) {
|
||||
memset(pkt->side_data, 0,
|
||||
src->side_data_elems * sizeof(*src->side_data));
|
||||
}
|
||||
for (i = 0; i < src->side_data_elems; i++) {
|
||||
DUP_DATA(pkt->side_data[i].data, src->side_data[i].data,
|
||||
src->side_data[i].size, 1, ALLOC_MALLOC);
|
||||
pkt->side_data[i].size = src->side_data[i].size;
|
||||
pkt->side_data[i].type = src->side_data[i].type;
|
||||
}
|
||||
}
|
||||
pkt->side_data_elems = src->side_data_elems;
|
||||
return 0;
|
||||
|
||||
failed_alloc:
|
||||
av_packet_unref(pkt);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
|
||||
int av_dup_packet(AVPacket *pkt)
|
||||
{
|
||||
AVPacket tmp_pkt;
|
||||
|
||||
if (!pkt->buf && pkt->data) {
|
||||
tmp_pkt = *pkt;
|
||||
return copy_packet_data(pkt, &tmp_pkt, 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_copy_packet(AVPacket *dst, const AVPacket *src)
|
||||
{
|
||||
*dst = *src;
|
||||
return copy_packet_data(dst, src, 0);
|
||||
}
|
||||
|
||||
void av_packet_free_side_data(AVPacket *pkt)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < pkt->side_data_elems; i++)
|
||||
av_freep(&pkt->side_data[i].data);
|
||||
av_freep(&pkt->side_data);
|
||||
pkt->side_data_elems = 0;
|
||||
}
|
||||
|
||||
#if FF_API_AVPACKET_OLD_API
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
void av_free_packet(AVPacket *pkt)
|
||||
{
|
||||
if (pkt) {
|
||||
if (pkt->buf)
|
||||
av_buffer_unref(&pkt->buf);
|
||||
pkt->data = NULL;
|
||||
pkt->size = 0;
|
||||
|
||||
av_packet_free_side_data(pkt);
|
||||
}
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
|
||||
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||
uint8_t *data, size_t size)
|
||||
{
|
||||
int elems = pkt->side_data_elems;
|
||||
|
||||
if ((unsigned)elems + 1 > INT_MAX / sizeof(*pkt->side_data))
|
||||
return AVERROR(ERANGE);
|
||||
|
||||
pkt->side_data = av_realloc(pkt->side_data,
|
||||
(elems + 1) * sizeof(*pkt->side_data));
|
||||
if (!pkt->side_data)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
pkt->side_data[elems].data = data;
|
||||
pkt->side_data[elems].size = size;
|
||||
pkt->side_data[elems].type = type;
|
||||
pkt->side_data_elems++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||
int size)
|
||||
{
|
||||
int ret;
|
||||
uint8_t *data;
|
||||
|
||||
if ((unsigned)size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
|
||||
return NULL;
|
||||
data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!data)
|
||||
return NULL;
|
||||
|
||||
ret = av_packet_add_side_data(pkt, type, data, size);
|
||||
if (ret < 0) {
|
||||
av_freep(&data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||
int *size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pkt->side_data_elems; i++) {
|
||||
if (pkt->side_data[i].type == type) {
|
||||
if (size)
|
||||
*size = pkt->side_data[i].size;
|
||||
return pkt->side_data[i].data;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *av_packet_side_data_name(enum AVPacketSideDataType type)
|
||||
{
|
||||
switch(type) {
|
||||
case AV_PKT_DATA_PALETTE: return "Palette";
|
||||
case AV_PKT_DATA_NEW_EXTRADATA: return "New Extradata";
|
||||
case AV_PKT_DATA_PARAM_CHANGE: return "Param Change";
|
||||
case AV_PKT_DATA_H263_MB_INFO: return "H263 MB Info";
|
||||
case AV_PKT_DATA_REPLAYGAIN: return "Replay Gain";
|
||||
case AV_PKT_DATA_DISPLAYMATRIX: return "Display Matrix";
|
||||
case AV_PKT_DATA_STEREO3D: return "Stereo 3D";
|
||||
case AV_PKT_DATA_AUDIO_SERVICE_TYPE: return "Audio Service Type";
|
||||
case AV_PKT_DATA_SKIP_SAMPLES: return "Skip Samples";
|
||||
case AV_PKT_DATA_JP_DUALMONO: return "JP Dual Mono";
|
||||
case AV_PKT_DATA_STRINGS_METADATA: return "Strings Metadata";
|
||||
case AV_PKT_DATA_SUBTITLE_POSITION: return "Subtitle Position";
|
||||
case AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL: return "Matroska BlockAdditional";
|
||||
case AV_PKT_DATA_WEBVTT_IDENTIFIER: return "WebVTT ID";
|
||||
case AV_PKT_DATA_WEBVTT_SETTINGS: return "WebVTT Settings";
|
||||
case AV_PKT_DATA_METADATA_UPDATE: return "Metadata Update";
|
||||
case AV_PKT_DATA_MPEGTS_STREAM_ID: return "MPEGTS Stream ID";
|
||||
case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata";
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define FF_MERGE_MARKER 0x8c4d9d108e25e9feULL
|
||||
|
||||
int av_packet_merge_side_data(AVPacket *pkt){
|
||||
if(pkt->side_data_elems){
|
||||
AVBufferRef *buf;
|
||||
int i;
|
||||
uint8_t *p;
|
||||
uint64_t size= pkt->size + 8LL + AV_INPUT_BUFFER_PADDING_SIZE;
|
||||
AVPacket old= *pkt;
|
||||
for (i=0; i<old.side_data_elems; i++) {
|
||||
size += old.side_data[i].size + 5LL;
|
||||
}
|
||||
if (size > INT_MAX)
|
||||
return AVERROR(EINVAL);
|
||||
buf = av_buffer_alloc(size);
|
||||
if (!buf)
|
||||
return AVERROR(ENOMEM);
|
||||
pkt->buf = buf;
|
||||
pkt->data = p = buf->data;
|
||||
pkt->size = size - AV_INPUT_BUFFER_PADDING_SIZE;
|
||||
bytestream_put_buffer(&p, old.data, old.size);
|
||||
for (i=old.side_data_elems-1; i>=0; i--) {
|
||||
bytestream_put_buffer(&p, old.side_data[i].data, old.side_data[i].size);
|
||||
bytestream_put_be32(&p, old.side_data[i].size);
|
||||
*p++ = old.side_data[i].type | ((i==old.side_data_elems-1)*128);
|
||||
}
|
||||
bytestream_put_be64(&p, FF_MERGE_MARKER);
|
||||
av_assert0(p-pkt->data == pkt->size);
|
||||
memset(p, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
av_packet_unref(&old);
|
||||
pkt->side_data_elems = 0;
|
||||
pkt->side_data = NULL;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_packet_split_side_data(AVPacket *pkt){
|
||||
if (!pkt->side_data_elems && pkt->size >12 && AV_RB64(pkt->data + pkt->size - 8) == FF_MERGE_MARKER){
|
||||
int i;
|
||||
unsigned int size;
|
||||
uint8_t *p;
|
||||
|
||||
p = pkt->data + pkt->size - 8 - 5;
|
||||
for (i=1; ; i++){
|
||||
size = AV_RB32(p);
|
||||
if (size>INT_MAX - 5 || p - pkt->data < size)
|
||||
return 0;
|
||||
if (p[4]&128)
|
||||
break;
|
||||
if (p - pkt->data < size + 5)
|
||||
return 0;
|
||||
p-= size+5;
|
||||
}
|
||||
|
||||
pkt->side_data = av_malloc_array(i, sizeof(*pkt->side_data));
|
||||
if (!pkt->side_data)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
p= pkt->data + pkt->size - 8 - 5;
|
||||
for (i=0; ; i++){
|
||||
size= AV_RB32(p);
|
||||
av_assert0(size<=INT_MAX - 5 && p - pkt->data >= size);
|
||||
pkt->side_data[i].data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
pkt->side_data[i].size = size;
|
||||
pkt->side_data[i].type = p[4]&127;
|
||||
if (!pkt->side_data[i].data)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(pkt->side_data[i].data, p-size, size);
|
||||
pkt->size -= size + 5;
|
||||
if(p[4]&128)
|
||||
break;
|
||||
p-= size+5;
|
||||
}
|
||||
pkt->size -= 8;
|
||||
pkt->side_data_elems = i+1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size)
|
||||
{
|
||||
AVDictionaryEntry *t = NULL;
|
||||
uint8_t *data = NULL;
|
||||
*size = 0;
|
||||
|
||||
if (!dict)
|
||||
return NULL;
|
||||
|
||||
while ((t = av_dict_get(dict, "", t, AV_DICT_IGNORE_SUFFIX))) {
|
||||
const size_t keylen = strlen(t->key);
|
||||
const size_t valuelen = strlen(t->value);
|
||||
const size_t new_size = *size + keylen + 1 + valuelen + 1;
|
||||
uint8_t *const new_data = av_realloc(data, new_size);
|
||||
|
||||
if (!new_data)
|
||||
goto fail;
|
||||
data = new_data;
|
||||
if (new_size > INT_MAX)
|
||||
goto fail;
|
||||
|
||||
memcpy(data + *size, t->key, keylen + 1);
|
||||
memcpy(data + *size + keylen + 1, t->value, valuelen + 1);
|
||||
|
||||
*size = new_size;
|
||||
}
|
||||
|
||||
return data;
|
||||
|
||||
fail:
|
||||
av_freep(&data);
|
||||
*size = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict)
|
||||
{
|
||||
const uint8_t *end = data + size;
|
||||
int ret = 0;
|
||||
|
||||
if (!dict || !data || !size)
|
||||
return ret;
|
||||
if (size && end[-1])
|
||||
return AVERROR_INVALIDDATA;
|
||||
while (data < end) {
|
||||
const uint8_t *key = data;
|
||||
const uint8_t *val = data + strlen(key) + 1;
|
||||
|
||||
if (val >= end)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
ret = av_dict_set(dict, key, val, 0);
|
||||
if (ret < 0)
|
||||
break;
|
||||
data = val + strlen(val) + 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||
int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pkt->side_data_elems; i++) {
|
||||
if (pkt->side_data[i].type == type) {
|
||||
if (size > pkt->side_data[i].size)
|
||||
return AVERROR(ENOMEM);
|
||||
pkt->side_data[i].size = size;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return AVERROR(ENOENT);
|
||||
}
|
||||
|
||||
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
|
||||
{
|
||||
int i;
|
||||
|
||||
dst->pts = src->pts;
|
||||
dst->dts = src->dts;
|
||||
dst->pos = src->pos;
|
||||
dst->duration = src->duration;
|
||||
#if FF_API_CONVERGENCE_DURATION
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
dst->convergence_duration = src->convergence_duration;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
dst->flags = src->flags;
|
||||
dst->stream_index = src->stream_index;
|
||||
|
||||
for (i = 0; i < src->side_data_elems; i++) {
|
||||
enum AVPacketSideDataType type = src->side_data[i].type;
|
||||
int size = src->side_data[i].size;
|
||||
uint8_t *src_data = src->side_data[i].data;
|
||||
uint8_t *dst_data = av_packet_new_side_data(dst, type, size);
|
||||
|
||||
if (!dst_data) {
|
||||
av_packet_free_side_data(dst);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
memcpy(dst_data, src_data, size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void av_packet_unref(AVPacket *pkt)
|
||||
{
|
||||
av_packet_free_side_data(pkt);
|
||||
av_buffer_unref(&pkt->buf);
|
||||
av_init_packet(pkt);
|
||||
pkt->data = NULL;
|
||||
pkt->size = 0;
|
||||
}
|
||||
|
||||
int av_packet_ref(AVPacket *dst, const AVPacket *src)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = av_packet_copy_props(dst, src);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!src->buf) {
|
||||
ret = packet_alloc(&dst->buf, src->size);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
memcpy(dst->buf->data, src->data, src->size);
|
||||
|
||||
dst->data = dst->buf->data;
|
||||
} else {
|
||||
dst->buf = av_buffer_ref(src->buf);
|
||||
if (!dst->buf) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
dst->data = src->data;
|
||||
}
|
||||
|
||||
dst->size = src->size;
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
av_packet_free_side_data(dst);
|
||||
return ret;
|
||||
}
|
||||
|
||||
AVPacket *av_packet_clone(AVPacket *src)
|
||||
{
|
||||
AVPacket *ret = av_packet_alloc();
|
||||
|
||||
if (!ret)
|
||||
return ret;
|
||||
|
||||
if (av_packet_ref(ret, src))
|
||||
av_packet_free(&ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
|
||||
{
|
||||
*dst = *src;
|
||||
av_init_packet(src);
|
||||
src->data = NULL;
|
||||
src->size = 0;
|
||||
}
|
||||
|
||||
void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
|
||||
{
|
||||
if (pkt->pts != AV_NOPTS_VALUE)
|
||||
pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb);
|
||||
if (pkt->dts != AV_NOPTS_VALUE)
|
||||
pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb);
|
||||
if (pkt->duration > 0)
|
||||
pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb);
|
||||
#if FF_API_CONVERGENCE_DURATION
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
if (pkt->convergence_duration > 0)
|
||||
pkt->convergence_duration = av_rescale_q(pkt->convergence_duration, src_tb, dst_tb);
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
}
|
||||
|
||||
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
|
||||
{
|
||||
uint8_t *side_data;
|
||||
int side_data_size;
|
||||
int i;
|
||||
|
||||
side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, &side_data_size);
|
||||
if (!side_data) {
|
||||
side_data_size = 4+4+8*error_count;
|
||||
side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_STATS,
|
||||
side_data_size);
|
||||
}
|
||||
|
||||
if (!side_data || side_data_size < 4+4+8*error_count)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
AV_WL32(side_data , quality );
|
||||
side_data[4] = pict_type;
|
||||
side_data[5] = error_count;
|
||||
for (i = 0; i<error_count; i++)
|
||||
AV_WL64(side_data+8 + 8*i , error[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
82
media/ffvpx/libavcodec/avpicture.c
Normal file
82
media/ffvpx/libavcodec/avpicture.c
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* AVPicture management routines
|
||||
* Copyright (c) 2001, 2002, 2003 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
* AVPicture management routines
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/colorspace.h"
|
||||
|
||||
#if FF_API_AVPICTURE
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
int avpicture_fill(AVPicture *picture, const uint8_t *ptr,
|
||||
enum AVPixelFormat pix_fmt, int width, int height)
|
||||
{
|
||||
return av_image_fill_arrays(picture->data, picture->linesize,
|
||||
ptr, pix_fmt, width, height, 1);
|
||||
}
|
||||
|
||||
int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, int width, int height,
|
||||
unsigned char *dest, int dest_size)
|
||||
{
|
||||
return av_image_copy_to_buffer(dest, dest_size,
|
||||
(const uint8_t * const*)src->data, src->linesize,
|
||||
pix_fmt, width, height, 1);
|
||||
}
|
||||
|
||||
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
|
||||
{
|
||||
return av_image_get_buffer_size(pix_fmt, width, height, 1);
|
||||
}
|
||||
|
||||
int avpicture_alloc(AVPicture *picture,
|
||||
enum AVPixelFormat pix_fmt, int width, int height)
|
||||
{
|
||||
int ret = av_image_alloc(picture->data, picture->linesize,
|
||||
width, height, pix_fmt, 1);
|
||||
if (ret < 0) {
|
||||
memset(picture, 0, sizeof(AVPicture));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void avpicture_free(AVPicture *picture)
|
||||
{
|
||||
av_freep(&picture->data[0]);
|
||||
}
|
||||
|
||||
void av_picture_copy(AVPicture *dst, const AVPicture *src,
|
||||
enum AVPixelFormat pix_fmt, int width, int height)
|
||||
{
|
||||
av_image_copy(dst->data, dst->linesize, (const uint8_t **)src->data,
|
||||
src->linesize, pix_fmt, width, height);
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif /* FF_API_AVPICTURE */
|
||||
93
media/ffvpx/libavcodec/bit_depth_template.c
Normal file
93
media/ffvpx/libavcodec/bit_depth_template.c
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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 "mathops.h"
|
||||
#include "rnd_avg.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
|
||||
#ifndef BIT_DEPTH
|
||||
#define BIT_DEPTH 8
|
||||
#endif
|
||||
|
||||
#ifdef AVCODEC_BIT_DEPTH_TEMPLATE_C
|
||||
# undef pixel
|
||||
# undef pixel2
|
||||
# undef pixel4
|
||||
# undef dctcoef
|
||||
# undef INIT_CLIP
|
||||
# undef no_rnd_avg_pixel4
|
||||
# undef rnd_avg_pixel4
|
||||
# undef AV_RN2P
|
||||
# undef AV_RN4P
|
||||
# undef AV_RN4PA
|
||||
# undef AV_WN2P
|
||||
# undef AV_WN4P
|
||||
# undef AV_WN4PA
|
||||
# undef CLIP
|
||||
# undef FUNC
|
||||
# undef FUNCC
|
||||
# undef av_clip_pixel
|
||||
# undef PIXEL_SPLAT_X4
|
||||
#else
|
||||
# define AVCODEC_BIT_DEPTH_TEMPLATE_C
|
||||
#endif
|
||||
|
||||
#if BIT_DEPTH > 8
|
||||
# define pixel uint16_t
|
||||
# define pixel2 uint32_t
|
||||
# define pixel4 uint64_t
|
||||
# define dctcoef int32_t
|
||||
|
||||
# define INIT_CLIP
|
||||
# define no_rnd_avg_pixel4 no_rnd_avg64
|
||||
# define rnd_avg_pixel4 rnd_avg64
|
||||
# define AV_RN2P AV_RN32
|
||||
# define AV_RN4P AV_RN64
|
||||
# define AV_RN4PA AV_RN64A
|
||||
# define AV_WN2P AV_WN32
|
||||
# define AV_WN4P AV_WN64
|
||||
# define AV_WN4PA AV_WN64A
|
||||
# define PIXEL_SPLAT_X4(x) ((x)*0x0001000100010001ULL)
|
||||
|
||||
# define av_clip_pixel(a) av_clip_uintp2(a, BIT_DEPTH)
|
||||
# define CLIP(a) av_clip_uintp2(a, BIT_DEPTH)
|
||||
#else
|
||||
# define pixel uint8_t
|
||||
# define pixel2 uint16_t
|
||||
# define pixel4 uint32_t
|
||||
# define dctcoef int16_t
|
||||
|
||||
# define INIT_CLIP
|
||||
# define no_rnd_avg_pixel4 no_rnd_avg32
|
||||
# define rnd_avg_pixel4 rnd_avg32
|
||||
# define AV_RN2P AV_RN16
|
||||
# define AV_RN4P AV_RN32
|
||||
# define AV_RN4PA AV_RN32A
|
||||
# define AV_WN2P AV_WN16
|
||||
# define AV_WN4P AV_WN32
|
||||
# define AV_WN4PA AV_WN32A
|
||||
# define PIXEL_SPLAT_X4(x) ((x)*0x01010101U)
|
||||
|
||||
# define av_clip_pixel(a) av_clip_uint8(a)
|
||||
# define CLIP(a) av_clip_uint8(a)
|
||||
#endif
|
||||
|
||||
#define FUNC3(a, b, c) a ## _ ## b ## c
|
||||
#define FUNC2(a, b, c) FUNC3(a, b, c)
|
||||
#define FUNC(a) FUNC2(a, BIT_DEPTH,)
|
||||
#define FUNCC(a) FUNC2(a, BIT_DEPTH, _c)
|
||||
363
media/ffvpx/libavcodec/bitstream.c
Normal file
363
media/ffvpx/libavcodec/bitstream.c
Normal file
|
|
@ -0,0 +1,363 @@
|
|||
/*
|
||||
* Common bit i/o utils
|
||||
* Copyright (c) 2000, 2001 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
* Copyright (c) 2010 Loren Merritt
|
||||
*
|
||||
* alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* bitstream api.
|
||||
*/
|
||||
|
||||
#include "libavutil/atomic.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/qsort.h"
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "mathops.h"
|
||||
#include "put_bits.h"
|
||||
#include "vlc.h"
|
||||
|
||||
const uint8_t ff_log2_run[41]={
|
||||
0, 0, 0, 0, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 3, 3, 3, 3,
|
||||
4, 4, 5, 5, 6, 6, 7, 7,
|
||||
8, 9,10,11,12,13,14,15,
|
||||
16,17,18,19,20,21,22,23,
|
||||
24,
|
||||
};
|
||||
|
||||
void avpriv_align_put_bits(PutBitContext *s)
|
||||
{
|
||||
put_bits(s, s->bit_left & 7, 0);
|
||||
}
|
||||
|
||||
void avpriv_put_string(PutBitContext *pb, const char *string,
|
||||
int terminate_string)
|
||||
{
|
||||
while (*string) {
|
||||
put_bits(pb, 8, *string);
|
||||
string++;
|
||||
}
|
||||
if (terminate_string)
|
||||
put_bits(pb, 8, 0);
|
||||
}
|
||||
|
||||
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
|
||||
{
|
||||
int words = length >> 4;
|
||||
int bits = length & 15;
|
||||
int i;
|
||||
|
||||
if (length == 0)
|
||||
return;
|
||||
|
||||
av_assert0(length <= put_bits_left(pb));
|
||||
|
||||
if (CONFIG_SMALL || words < 16 || put_bits_count(pb) & 7) {
|
||||
for (i = 0; i < words; i++)
|
||||
put_bits(pb, 16, AV_RB16(src + 2 * i));
|
||||
} else {
|
||||
for (i = 0; put_bits_count(pb) & 31; i++)
|
||||
put_bits(pb, 8, src[i]);
|
||||
flush_put_bits(pb);
|
||||
memcpy(put_bits_ptr(pb), src + i, 2 * words - i);
|
||||
skip_put_bytes(pb, 2 * words - i);
|
||||
}
|
||||
|
||||
put_bits(pb, bits, AV_RB16(src + 2 * words) >> (16 - bits));
|
||||
}
|
||||
|
||||
/* VLC decoding */
|
||||
|
||||
#define GET_DATA(v, table, i, wrap, size) \
|
||||
{ \
|
||||
const uint8_t *ptr = (const uint8_t *)table + i * wrap; \
|
||||
switch(size) { \
|
||||
case 1: \
|
||||
v = *(const uint8_t *)ptr; \
|
||||
break; \
|
||||
case 2: \
|
||||
v = *(const uint16_t *)ptr; \
|
||||
break; \
|
||||
default: \
|
||||
v = *(const uint32_t *)ptr; \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
static int alloc_table(VLC *vlc, int size, int use_static)
|
||||
{
|
||||
int index = vlc->table_size;
|
||||
|
||||
vlc->table_size += size;
|
||||
if (vlc->table_size > vlc->table_allocated) {
|
||||
if (use_static)
|
||||
abort(); // cannot do anything, init_vlc() is used with too little memory
|
||||
vlc->table_allocated += (1 << vlc->bits);
|
||||
vlc->table = av_realloc_f(vlc->table, vlc->table_allocated, sizeof(VLC_TYPE) * 2);
|
||||
if (!vlc->table) {
|
||||
vlc->table_allocated = 0;
|
||||
vlc->table_size = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
memset(vlc->table + vlc->table_allocated - (1 << vlc->bits), 0, sizeof(VLC_TYPE) * 2 << vlc->bits);
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
static av_always_inline uint32_t bitswap_32(uint32_t x)
|
||||
{
|
||||
return (uint32_t)ff_reverse[ x & 0xFF] << 24 |
|
||||
(uint32_t)ff_reverse[(x >> 8) & 0xFF] << 16 |
|
||||
(uint32_t)ff_reverse[(x >> 16) & 0xFF] << 8 |
|
||||
(uint32_t)ff_reverse[ x >> 24];
|
||||
}
|
||||
|
||||
typedef struct VLCcode {
|
||||
uint8_t bits;
|
||||
uint16_t symbol;
|
||||
/** codeword, with the first bit-to-be-read in the msb
|
||||
* (even if intended for a little-endian bitstream reader) */
|
||||
uint32_t code;
|
||||
} VLCcode;
|
||||
|
||||
static int compare_vlcspec(const void *a, const void *b)
|
||||
{
|
||||
const VLCcode *sa = a, *sb = b;
|
||||
return (sa->code >> 1) - (sb->code >> 1);
|
||||
}
|
||||
/**
|
||||
* Build VLC decoding tables suitable for use with get_vlc().
|
||||
*
|
||||
* @param vlc the context to be initialized
|
||||
*
|
||||
* @param table_nb_bits max length of vlc codes to store directly in this table
|
||||
* (Longer codes are delegated to subtables.)
|
||||
*
|
||||
* @param nb_codes number of elements in codes[]
|
||||
*
|
||||
* @param codes descriptions of the vlc codes
|
||||
* These must be ordered such that codes going into the same subtable are contiguous.
|
||||
* Sorting by VLCcode.code is sufficient, though not necessary.
|
||||
*/
|
||||
static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
|
||||
VLCcode *codes, int flags)
|
||||
{
|
||||
int table_size, table_index, index, code_prefix, symbol, subtable_bits;
|
||||
int i, j, k, n, nb, inc;
|
||||
uint32_t code;
|
||||
volatile VLC_TYPE (* volatile table)[2]; // the double volatile is needed to prevent an internal compiler error in gcc 4.2
|
||||
|
||||
table_size = 1 << table_nb_bits;
|
||||
if (table_nb_bits > 30)
|
||||
return -1;
|
||||
table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
|
||||
ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
|
||||
if (table_index < 0)
|
||||
return table_index;
|
||||
table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
|
||||
|
||||
/* first pass: map codes and compute auxiliary table sizes */
|
||||
for (i = 0; i < nb_codes; i++) {
|
||||
n = codes[i].bits;
|
||||
code = codes[i].code;
|
||||
symbol = codes[i].symbol;
|
||||
ff_dlog(NULL, "i=%d n=%d code=0x%x\n", i, n, code);
|
||||
if (n <= table_nb_bits) {
|
||||
/* no need to add another table */
|
||||
j = code >> (32 - table_nb_bits);
|
||||
nb = 1 << (table_nb_bits - n);
|
||||
inc = 1;
|
||||
if (flags & INIT_VLC_LE) {
|
||||
j = bitswap_32(code);
|
||||
inc = 1 << n;
|
||||
}
|
||||
for (k = 0; k < nb; k++) {
|
||||
int bits = table[j][1];
|
||||
ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
|
||||
if (bits != 0 && bits != n) {
|
||||
av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
table[j][1] = n; //bits
|
||||
table[j][0] = symbol;
|
||||
j += inc;
|
||||
}
|
||||
} else {
|
||||
/* fill auxiliary table recursively */
|
||||
n -= table_nb_bits;
|
||||
code_prefix = code >> (32 - table_nb_bits);
|
||||
subtable_bits = n;
|
||||
codes[i].bits = n;
|
||||
codes[i].code = code << table_nb_bits;
|
||||
for (k = i+1; k < nb_codes; k++) {
|
||||
n = codes[k].bits - table_nb_bits;
|
||||
if (n <= 0)
|
||||
break;
|
||||
code = codes[k].code;
|
||||
if (code >> (32 - table_nb_bits) != code_prefix)
|
||||
break;
|
||||
codes[k].bits = n;
|
||||
codes[k].code = code << table_nb_bits;
|
||||
subtable_bits = FFMAX(subtable_bits, n);
|
||||
}
|
||||
subtable_bits = FFMIN(subtable_bits, table_nb_bits);
|
||||
j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix;
|
||||
table[j][1] = -subtable_bits;
|
||||
ff_dlog(NULL, "%4x: n=%d (subtable)\n",
|
||||
j, codes[i].bits + table_nb_bits);
|
||||
index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
|
||||
if (index < 0)
|
||||
return index;
|
||||
/* note: realloc has been done, so reload tables */
|
||||
table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
|
||||
table[j][0] = index; //code
|
||||
i = k-1;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < table_size; i++) {
|
||||
if (table[i][1] == 0) //bits
|
||||
table[i][0] = -1; //codes
|
||||
}
|
||||
|
||||
return table_index;
|
||||
}
|
||||
|
||||
|
||||
/* Build VLC decoding tables suitable for use with get_vlc().
|
||||
|
||||
'nb_bits' sets the decoding table size (2^nb_bits) entries. The
|
||||
bigger it is, the faster is the decoding. But it should not be too
|
||||
big to save memory and L1 cache. '9' is a good compromise.
|
||||
|
||||
'nb_codes' : number of vlcs codes
|
||||
|
||||
'bits' : table which gives the size (in bits) of each vlc code.
|
||||
|
||||
'codes' : table which gives the bit pattern of of each vlc code.
|
||||
|
||||
'symbols' : table which gives the values to be returned from get_vlc().
|
||||
|
||||
'xxx_wrap' : give the number of bytes between each entry of the
|
||||
'bits' or 'codes' tables.
|
||||
|
||||
'xxx_size' : gives the number of bytes of each entry of the 'bits'
|
||||
or 'codes' tables.
|
||||
|
||||
'wrap' and 'size' make it possible to use any memory configuration and types
|
||||
(byte/word/long) to store the 'bits', 'codes', and 'symbols' tables.
|
||||
|
||||
'use_static' should be set to 1 for tables, which should be freed
|
||||
with av_free_static(), 0 if ff_free_vlc() will be used.
|
||||
*/
|
||||
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
|
||||
const void *bits, int bits_wrap, int bits_size,
|
||||
const void *codes, int codes_wrap, int codes_size,
|
||||
const void *symbols, int symbols_wrap, int symbols_size,
|
||||
int flags)
|
||||
{
|
||||
VLCcode *buf;
|
||||
int i, j, ret;
|
||||
VLCcode localbuf[1500]; // the maximum currently needed is 1296 by rv34
|
||||
VLC localvlc, *vlc;
|
||||
|
||||
vlc = vlc_arg;
|
||||
vlc->bits = nb_bits;
|
||||
if (flags & INIT_VLC_USE_NEW_STATIC) {
|
||||
av_assert0(nb_codes + 1 <= FF_ARRAY_ELEMS(localbuf));
|
||||
buf = localbuf;
|
||||
localvlc = *vlc_arg;
|
||||
vlc = &localvlc;
|
||||
vlc->table_size = 0;
|
||||
} else {
|
||||
vlc->table = NULL;
|
||||
vlc->table_allocated = 0;
|
||||
vlc->table_size = 0;
|
||||
|
||||
buf = av_malloc_array((nb_codes + 1), sizeof(VLCcode));
|
||||
if (!buf)
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
|
||||
av_assert0(symbols_size <= 2 || !symbols);
|
||||
j = 0;
|
||||
#define COPY(condition)\
|
||||
for (i = 0; i < nb_codes; i++) { \
|
||||
GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size); \
|
||||
if (!(condition)) \
|
||||
continue; \
|
||||
if (buf[j].bits > 3*nb_bits || buf[j].bits>32) { \
|
||||
av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
|
||||
if (!(flags & INIT_VLC_USE_NEW_STATIC)) \
|
||||
av_free(buf); \
|
||||
return -1; \
|
||||
} \
|
||||
GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size); \
|
||||
if (buf[j].code >= (1LL<<buf[j].bits)) { \
|
||||
av_log(NULL, AV_LOG_ERROR, "Invalid code %x for %d in init_vlc\n", buf[j].code, i);\
|
||||
if (!(flags & INIT_VLC_USE_NEW_STATIC)) \
|
||||
av_free(buf); \
|
||||
return -1; \
|
||||
} \
|
||||
if (flags & INIT_VLC_LE) \
|
||||
buf[j].code = bitswap_32(buf[j].code); \
|
||||
else \
|
||||
buf[j].code <<= 32 - buf[j].bits; \
|
||||
if (symbols) \
|
||||
GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size) \
|
||||
else \
|
||||
buf[j].symbol = i; \
|
||||
j++; \
|
||||
}
|
||||
COPY(buf[j].bits > nb_bits);
|
||||
// qsort is the slowest part of init_vlc, and could probably be improved or avoided
|
||||
AV_QSORT(buf, j, struct VLCcode, compare_vlcspec);
|
||||
COPY(buf[j].bits && buf[j].bits <= nb_bits);
|
||||
nb_codes = j;
|
||||
|
||||
ret = build_table(vlc, nb_bits, nb_codes, buf, flags);
|
||||
|
||||
if (flags & INIT_VLC_USE_NEW_STATIC) {
|
||||
if(vlc->table_size != vlc->table_allocated)
|
||||
av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
|
||||
|
||||
av_assert0(ret >= 0);
|
||||
*vlc_arg = *vlc;
|
||||
} else {
|
||||
av_free(buf);
|
||||
if (ret < 0) {
|
||||
av_freep(&vlc->table);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ff_free_vlc(VLC *vlc)
|
||||
{
|
||||
av_freep(&vlc->table);
|
||||
}
|
||||
49
media/ffvpx/libavcodec/blockdsp.h
Normal file
49
media/ffvpx/libavcodec/blockdsp.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_BLOCKDSP_H
|
||||
#define AVCODEC_BLOCKDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "version.h"
|
||||
|
||||
/* add and put pixel (decoding)
|
||||
* Block sizes for op_pixels_func are 8x4,8x8 16x8 16x16.
|
||||
* h for op_pixels_func is limited to { width / 2, width },
|
||||
* but never larger than 16 and never smaller than 4. */
|
||||
typedef void (*op_fill_func)(uint8_t *block /* align width (8 or 16) */,
|
||||
uint8_t value, int line_size, int h);
|
||||
|
||||
typedef struct BlockDSPContext {
|
||||
void (*clear_block)(int16_t *block /* align 16 */);
|
||||
void (*clear_blocks)(int16_t *blocks /* align 16 */);
|
||||
|
||||
op_fill_func fill_block_tab[2];
|
||||
} BlockDSPContext;
|
||||
|
||||
void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx);
|
||||
|
||||
void ff_blockdsp_init_alpha(BlockDSPContext *c);
|
||||
void ff_blockdsp_init_arm(BlockDSPContext *c);
|
||||
void ff_blockdsp_init_ppc(BlockDSPContext *c);
|
||||
void ff_blockdsp_init_x86(BlockDSPContext *c, AVCodecContext *avctx);
|
||||
void ff_blockdsp_init_mips(BlockDSPContext *c);
|
||||
|
||||
#endif /* AVCODEC_BLOCKDSP_H */
|
||||
33
media/ffvpx/libavcodec/bsf.h
Normal file
33
media/ffvpx/libavcodec/bsf.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_BSF_H
|
||||
#define AVCODEC_BSF_H
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
/**
|
||||
* Called by the bitstream filters to get the next packet for filtering.
|
||||
* The filter is responsible for either freeing the packet or passing it to the
|
||||
* caller.
|
||||
*/
|
||||
int ff_bsf_get_packet(AVBSFContext *ctx, AVPacket **pkt);
|
||||
|
||||
const AVClass *ff_bsf_child_class_next(const AVClass *prev);
|
||||
|
||||
#endif /* AVCODEC_BSF_H */
|
||||
376
media/ffvpx/libavcodec/bytestream.h
Normal file
376
media/ffvpx/libavcodec/bytestream.h
Normal file
|
|
@ -0,0 +1,376 @@
|
|||
/*
|
||||
* Bytestream functions
|
||||
* copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
|
||||
* Copyright (c) 2012 Aneesh Dogra (lionaneesh) <lionaneesh@gmail.com>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_BYTESTREAM_H
|
||||
#define AVCODEC_BYTESTREAM_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
|
||||
typedef struct GetByteContext {
|
||||
const uint8_t *buffer, *buffer_end, *buffer_start;
|
||||
} GetByteContext;
|
||||
|
||||
typedef struct PutByteContext {
|
||||
uint8_t *buffer, *buffer_end, *buffer_start;
|
||||
int eof;
|
||||
} PutByteContext;
|
||||
|
||||
#define DEF(type, name, bytes, read, write) \
|
||||
static av_always_inline type bytestream_get_ ## name(const uint8_t **b) \
|
||||
{ \
|
||||
(*b) += bytes; \
|
||||
return read(*b - bytes); \
|
||||
} \
|
||||
static av_always_inline void bytestream_put_ ## name(uint8_t **b, \
|
||||
const type value) \
|
||||
{ \
|
||||
write(*b, value); \
|
||||
(*b) += bytes; \
|
||||
} \
|
||||
static av_always_inline void bytestream2_put_ ## name ## u(PutByteContext *p, \
|
||||
const type value) \
|
||||
{ \
|
||||
bytestream_put_ ## name(&p->buffer, value); \
|
||||
} \
|
||||
static av_always_inline void bytestream2_put_ ## name(PutByteContext *p, \
|
||||
const type value) \
|
||||
{ \
|
||||
if (!p->eof && (p->buffer_end - p->buffer >= bytes)) { \
|
||||
write(p->buffer, value); \
|
||||
p->buffer += bytes; \
|
||||
} else \
|
||||
p->eof = 1; \
|
||||
} \
|
||||
static av_always_inline type bytestream2_get_ ## name ## u(GetByteContext *g) \
|
||||
{ \
|
||||
return bytestream_get_ ## name(&g->buffer); \
|
||||
} \
|
||||
static av_always_inline type bytestream2_get_ ## name(GetByteContext *g) \
|
||||
{ \
|
||||
if (g->buffer_end - g->buffer < bytes) { \
|
||||
g->buffer = g->buffer_end; \
|
||||
return 0; \
|
||||
} \
|
||||
return bytestream2_get_ ## name ## u(g); \
|
||||
} \
|
||||
static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g) \
|
||||
{ \
|
||||
if (g->buffer_end - g->buffer < bytes) \
|
||||
return 0; \
|
||||
return read(g->buffer); \
|
||||
}
|
||||
|
||||
DEF(uint64_t, le64, 8, AV_RL64, AV_WL64)
|
||||
DEF(unsigned int, le32, 4, AV_RL32, AV_WL32)
|
||||
DEF(unsigned int, le24, 3, AV_RL24, AV_WL24)
|
||||
DEF(unsigned int, le16, 2, AV_RL16, AV_WL16)
|
||||
DEF(uint64_t, be64, 8, AV_RB64, AV_WB64)
|
||||
DEF(unsigned int, be32, 4, AV_RB32, AV_WB32)
|
||||
DEF(unsigned int, be24, 3, AV_RB24, AV_WB24)
|
||||
DEF(unsigned int, be16, 2, AV_RB16, AV_WB16)
|
||||
DEF(unsigned int, byte, 1, AV_RB8 , AV_WB8)
|
||||
|
||||
#if HAVE_BIGENDIAN
|
||||
# define bytestream2_get_ne16 bytestream2_get_be16
|
||||
# define bytestream2_get_ne24 bytestream2_get_be24
|
||||
# define bytestream2_get_ne32 bytestream2_get_be32
|
||||
# define bytestream2_get_ne64 bytestream2_get_be64
|
||||
# define bytestream2_get_ne16u bytestream2_get_be16u
|
||||
# define bytestream2_get_ne24u bytestream2_get_be24u
|
||||
# define bytestream2_get_ne32u bytestream2_get_be32u
|
||||
# define bytestream2_get_ne64u bytestream2_get_be64u
|
||||
# define bytestream2_put_ne16 bytestream2_put_be16
|
||||
# define bytestream2_put_ne24 bytestream2_put_be24
|
||||
# define bytestream2_put_ne32 bytestream2_put_be32
|
||||
# define bytestream2_put_ne64 bytestream2_put_be64
|
||||
# define bytestream2_peek_ne16 bytestream2_peek_be16
|
||||
# define bytestream2_peek_ne24 bytestream2_peek_be24
|
||||
# define bytestream2_peek_ne32 bytestream2_peek_be32
|
||||
# define bytestream2_peek_ne64 bytestream2_peek_be64
|
||||
#else
|
||||
# define bytestream2_get_ne16 bytestream2_get_le16
|
||||
# define bytestream2_get_ne24 bytestream2_get_le24
|
||||
# define bytestream2_get_ne32 bytestream2_get_le32
|
||||
# define bytestream2_get_ne64 bytestream2_get_le64
|
||||
# define bytestream2_get_ne16u bytestream2_get_le16u
|
||||
# define bytestream2_get_ne24u bytestream2_get_le24u
|
||||
# define bytestream2_get_ne32u bytestream2_get_le32u
|
||||
# define bytestream2_get_ne64u bytestream2_get_le64u
|
||||
# define bytestream2_put_ne16 bytestream2_put_le16
|
||||
# define bytestream2_put_ne24 bytestream2_put_le24
|
||||
# define bytestream2_put_ne32 bytestream2_put_le32
|
||||
# define bytestream2_put_ne64 bytestream2_put_le64
|
||||
# define bytestream2_peek_ne16 bytestream2_peek_le16
|
||||
# define bytestream2_peek_ne24 bytestream2_peek_le24
|
||||
# define bytestream2_peek_ne32 bytestream2_peek_le32
|
||||
# define bytestream2_peek_ne64 bytestream2_peek_le64
|
||||
#endif
|
||||
|
||||
static av_always_inline void bytestream2_init(GetByteContext *g,
|
||||
const uint8_t *buf,
|
||||
int buf_size)
|
||||
{
|
||||
av_assert0(buf_size >= 0);
|
||||
g->buffer = buf;
|
||||
g->buffer_start = buf;
|
||||
g->buffer_end = buf + buf_size;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_init_writer(PutByteContext *p,
|
||||
uint8_t *buf,
|
||||
int buf_size)
|
||||
{
|
||||
av_assert0(buf_size >= 0);
|
||||
p->buffer = buf;
|
||||
p->buffer_start = buf;
|
||||
p->buffer_end = buf + buf_size;
|
||||
p->eof = 0;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
|
||||
{
|
||||
return g->buffer_end - g->buffer;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_get_bytes_left_p(PutByteContext *p)
|
||||
{
|
||||
return p->buffer_end - p->buffer;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_skip(GetByteContext *g,
|
||||
unsigned int size)
|
||||
{
|
||||
g->buffer += FFMIN(g->buffer_end - g->buffer, size);
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_skipu(GetByteContext *g,
|
||||
unsigned int size)
|
||||
{
|
||||
g->buffer += size;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_skip_p(PutByteContext *p,
|
||||
unsigned int size)
|
||||
{
|
||||
int size2;
|
||||
if (p->eof)
|
||||
return;
|
||||
size2 = FFMIN(p->buffer_end - p->buffer, size);
|
||||
if (size2 != size)
|
||||
p->eof = 1;
|
||||
p->buffer += size2;
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_tell(GetByteContext *g)
|
||||
{
|
||||
return (int)(g->buffer - g->buffer_start);
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_tell_p(PutByteContext *p)
|
||||
{
|
||||
return (int)(p->buffer - p->buffer_start);
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_size(GetByteContext *g)
|
||||
{
|
||||
return (int)(g->buffer_end - g->buffer_start);
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_size_p(PutByteContext *p)
|
||||
{
|
||||
return (int)(p->buffer_end - p->buffer_start);
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_seek(GetByteContext *g,
|
||||
int offset,
|
||||
int whence)
|
||||
{
|
||||
switch (whence) {
|
||||
case SEEK_CUR:
|
||||
offset = av_clip(offset, -(g->buffer - g->buffer_start),
|
||||
g->buffer_end - g->buffer);
|
||||
g->buffer += offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
offset = av_clip(offset, -(g->buffer_end - g->buffer_start), 0);
|
||||
g->buffer = g->buffer_end + offset;
|
||||
break;
|
||||
case SEEK_SET:
|
||||
offset = av_clip(offset, 0, g->buffer_end - g->buffer_start);
|
||||
g->buffer = g->buffer_start + offset;
|
||||
break;
|
||||
default:
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
return bytestream2_tell(g);
|
||||
}
|
||||
|
||||
static av_always_inline int bytestream2_seek_p(PutByteContext *p,
|
||||
int offset,
|
||||
int whence)
|
||||
{
|
||||
p->eof = 0;
|
||||
switch (whence) {
|
||||
case SEEK_CUR:
|
||||
if (p->buffer_end - p->buffer < offset)
|
||||
p->eof = 1;
|
||||
offset = av_clip(offset, -(p->buffer - p->buffer_start),
|
||||
p->buffer_end - p->buffer);
|
||||
p->buffer += offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
if (offset > 0)
|
||||
p->eof = 1;
|
||||
offset = av_clip(offset, -(p->buffer_end - p->buffer_start), 0);
|
||||
p->buffer = p->buffer_end + offset;
|
||||
break;
|
||||
case SEEK_SET:
|
||||
if (p->buffer_end - p->buffer_start < offset)
|
||||
p->eof = 1;
|
||||
offset = av_clip(offset, 0, p->buffer_end - p->buffer_start);
|
||||
p->buffer = p->buffer_start + offset;
|
||||
break;
|
||||
default:
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
return bytestream2_tell_p(p);
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g,
|
||||
uint8_t *dst,
|
||||
unsigned int size)
|
||||
{
|
||||
int size2 = FFMIN(g->buffer_end - g->buffer, size);
|
||||
memcpy(dst, g->buffer, size2);
|
||||
g->buffer += size2;
|
||||
return size2;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g,
|
||||
uint8_t *dst,
|
||||
unsigned int size)
|
||||
{
|
||||
memcpy(dst, g->buffer, size);
|
||||
g->buffer += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_put_buffer(PutByteContext *p,
|
||||
const uint8_t *src,
|
||||
unsigned int size)
|
||||
{
|
||||
int size2;
|
||||
if (p->eof)
|
||||
return 0;
|
||||
size2 = FFMIN(p->buffer_end - p->buffer, size);
|
||||
if (size2 != size)
|
||||
p->eof = 1;
|
||||
memcpy(p->buffer, src, size2);
|
||||
p->buffer += size2;
|
||||
return size2;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_put_bufferu(PutByteContext *p,
|
||||
const uint8_t *src,
|
||||
unsigned int size)
|
||||
{
|
||||
memcpy(p->buffer, src, size);
|
||||
p->buffer += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_set_buffer(PutByteContext *p,
|
||||
const uint8_t c,
|
||||
unsigned int size)
|
||||
{
|
||||
int size2;
|
||||
if (p->eof)
|
||||
return;
|
||||
size2 = FFMIN(p->buffer_end - p->buffer, size);
|
||||
if (size2 != size)
|
||||
p->eof = 1;
|
||||
memset(p->buffer, c, size2);
|
||||
p->buffer += size2;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream2_set_bufferu(PutByteContext *p,
|
||||
const uint8_t c,
|
||||
unsigned int size)
|
||||
{
|
||||
memset(p->buffer, c, size);
|
||||
p->buffer += size;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
|
||||
{
|
||||
return p->eof;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_copy_bufferu(PutByteContext *p,
|
||||
GetByteContext *g,
|
||||
unsigned int size)
|
||||
{
|
||||
memcpy(p->buffer, g->buffer, size);
|
||||
p->buffer += size;
|
||||
g->buffer += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream2_copy_buffer(PutByteContext *p,
|
||||
GetByteContext *g,
|
||||
unsigned int size)
|
||||
{
|
||||
int size2;
|
||||
|
||||
if (p->eof)
|
||||
return 0;
|
||||
size = FFMIN(g->buffer_end - g->buffer, size);
|
||||
size2 = FFMIN(p->buffer_end - p->buffer, size);
|
||||
if (size2 != size)
|
||||
p->eof = 1;
|
||||
|
||||
return bytestream2_copy_bufferu(p, g, size2);
|
||||
}
|
||||
|
||||
static av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b,
|
||||
uint8_t *dst,
|
||||
unsigned int size)
|
||||
{
|
||||
memcpy(dst, *b, size);
|
||||
(*b) += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static av_always_inline void bytestream_put_buffer(uint8_t **b,
|
||||
const uint8_t *src,
|
||||
unsigned int size)
|
||||
{
|
||||
memcpy(*b, src, size);
|
||||
(*b) += size;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_BYTESTREAM_H */
|
||||
2989
media/ffvpx/libavcodec/codec_desc.c
Normal file
2989
media/ffvpx/libavcodec/codec_desc.c
Normal file
File diff suppressed because it is too large
Load diff
68
media/ffvpx/libavcodec/dct.h
Normal file
68
media/ffvpx/libavcodec/dct.h
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* (I)DCT Transforms
|
||||
* Copyright (c) 2009 Peter Ross <pross@xvid.org>
|
||||
* Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
|
||||
* Copyright (c) 2010 Vitor Sessak
|
||||
*
|
||||
* 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#if !defined(AVCODEC_DCT_H) && (!defined(FFT_FLOAT) || FFT_FLOAT)
|
||||
#define AVCODEC_DCT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "rdft.h"
|
||||
|
||||
struct DCTContext {
|
||||
int nbits;
|
||||
int inverse;
|
||||
RDFTContext rdft;
|
||||
const float *costab;
|
||||
FFTSample *csc2;
|
||||
void (*dct_calc)(struct DCTContext *s, FFTSample *data);
|
||||
void (*dct32)(FFTSample *out, const FFTSample *in);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set up DCT.
|
||||
* @param nbits size of the input array:
|
||||
* (1 << nbits) for DCT-II, DCT-III and DST-I
|
||||
* (1 << nbits) + 1 for DCT-I
|
||||
*
|
||||
* @note the first element of the input of DST-I is ignored
|
||||
*/
|
||||
int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType type);
|
||||
void ff_dct_end (DCTContext *s);
|
||||
|
||||
void ff_dct_init_x86(DCTContext *s);
|
||||
|
||||
void ff_fdct_ifast(int16_t *data);
|
||||
void ff_fdct_ifast248(int16_t *data);
|
||||
void ff_jpeg_fdct_islow_8(int16_t *data);
|
||||
void ff_jpeg_fdct_islow_10(int16_t *data);
|
||||
void ff_fdct248_islow_8(int16_t *data);
|
||||
void ff_fdct248_islow_10(int16_t *data);
|
||||
|
||||
void ff_j_rev_dct(int16_t *data);
|
||||
void ff_j_rev_dct4(int16_t *data);
|
||||
void ff_j_rev_dct2(int16_t *data);
|
||||
void ff_j_rev_dct1(int16_t *data);
|
||||
void ff_jref_idct_put(uint8_t *dest, int line_size, int16_t *block);
|
||||
void ff_jref_idct_add(uint8_t *dest, int line_size, int16_t *block);
|
||||
|
||||
#endif /* AVCODEC_DCT_H */
|
||||
801
media/ffvpx/libavcodec/dummy_funcs.c
Normal file
801
media/ffvpx/libavcodec/dummy_funcs.c
Normal file
|
|
@ -0,0 +1,801 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
typedef struct H264PredContext H264PredContext;
|
||||
typedef struct VideoDSPContext VideoDSPContext;
|
||||
typedef struct VP8DSPContext VP8DSPContext;
|
||||
typedef struct VP9DSPContext VP9DSPContext;
|
||||
typedef struct FLACDSPContext FLACDSPContext;
|
||||
|
||||
AVHWAccel ff_h263_vaapi_hwaccel;
|
||||
AVHWAccel ff_h263_vdpau_hwaccel;
|
||||
AVHWAccel ff_h263_videotoolbox_hwaccel;
|
||||
AVHWAccel ff_h264_d3d11va_hwaccel;
|
||||
AVHWAccel ff_h264_dxva2_hwaccel;
|
||||
AVHWAccel ff_h264_mmal_hwaccel;
|
||||
AVHWAccel ff_h264_qsv_hwaccel;
|
||||
AVHWAccel ff_h264_vaapi_hwaccel;
|
||||
AVHWAccel ff_h264_vda_hwaccel;
|
||||
AVHWAccel ff_h264_vda_old_hwaccel;
|
||||
AVHWAccel ff_h264_vdpau_hwaccel;
|
||||
AVHWAccel ff_h264_videotoolbox_hwaccel;
|
||||
AVHWAccel ff_hevc_d3d11va_hwaccel;
|
||||
AVHWAccel ff_hevc_dxva2_hwaccel;
|
||||
AVHWAccel ff_hevc_qsv_hwaccel;
|
||||
AVHWAccel ff_hevc_vaapi_hwaccel;
|
||||
AVHWAccel ff_hevc_vdpau_hwaccel;
|
||||
AVHWAccel ff_mpeg1_xvmc_hwaccel;
|
||||
AVHWAccel ff_mpeg1_vdpau_hwaccel;
|
||||
AVHWAccel ff_mpeg1_videotoolbox_hwaccel;
|
||||
AVHWAccel ff_mpeg2_xvmc_hwaccel;
|
||||
AVHWAccel ff_mpeg2_d3d11va_hwaccel;
|
||||
AVHWAccel ff_mpeg2_dxva2_hwaccel;
|
||||
AVHWAccel ff_mpeg2_qsv_hwaccel;
|
||||
AVHWAccel ff_mpeg2_vaapi_hwaccel;
|
||||
AVHWAccel ff_mpeg2_vdpau_hwaccel;
|
||||
AVHWAccel ff_mpeg2_videotoolbox_hwaccel;
|
||||
AVHWAccel ff_mpeg4_mmal_hwaccel;
|
||||
AVHWAccel ff_mpeg4_vaapi_hwaccel;
|
||||
AVHWAccel ff_mpeg4_vdpau_hwaccel;
|
||||
AVHWAccel ff_mpeg4_videotoolbox_hwaccel;
|
||||
AVHWAccel ff_vc1_d3d11va_hwaccel;
|
||||
AVHWAccel ff_vc1_dxva2_hwaccel;
|
||||
AVHWAccel ff_vc1_vaapi_hwaccel;
|
||||
AVHWAccel ff_vc1_vdpau_hwaccel;
|
||||
AVHWAccel ff_vc1_qsv_hwaccel;
|
||||
AVHWAccel ff_wmv3_d3d11va_hwaccel;
|
||||
AVHWAccel ff_wmv3_dxva2_hwaccel;
|
||||
AVHWAccel ff_wmv3_vaapi_hwaccel;
|
||||
AVHWAccel ff_wmv3_vdpau_hwaccel;
|
||||
AVHWAccel ff_mpeg2_mmal_hwaccel;
|
||||
AVHWAccel ff_vc1_mmal_hwaccel;
|
||||
AVHWAccel ff_vp9_d3d11va_hwaccel;
|
||||
AVHWAccel ff_vp9_dxva2_hwaccel;
|
||||
AVHWAccel ff_vp9_vaapi_hwaccel;
|
||||
AVHWAccel ff_vp9_cuvid_hwaccel;
|
||||
AVHWAccel ff_vp8_cuvid_hwaccel;
|
||||
AVHWAccel ff_vc1_cuvid_hwaccel;
|
||||
AVHWAccel ff_hevc_cuvid_hwaccel;
|
||||
AVHWAccel ff_h264_cuvid_hwaccel;
|
||||
|
||||
AVCodec ff_a64multi_encoder;
|
||||
AVCodec ff_a64multi5_encoder;
|
||||
AVCodec ff_aasc_decoder;
|
||||
AVCodec ff_aic_decoder;
|
||||
AVCodec ff_alias_pix_encoder;
|
||||
AVCodec ff_alias_pix_decoder;
|
||||
AVCodec ff_amv_encoder;
|
||||
AVCodec ff_amv_decoder;
|
||||
AVCodec ff_anm_decoder;
|
||||
AVCodec ff_ansi_decoder;
|
||||
AVCodec ff_apng_encoder;
|
||||
AVCodec ff_apng_decoder;
|
||||
AVCodec ff_asv1_encoder;
|
||||
AVCodec ff_asv1_decoder;
|
||||
AVCodec ff_asv2_encoder;
|
||||
AVCodec ff_asv2_decoder;
|
||||
AVCodec ff_aura_decoder;
|
||||
AVCodec ff_aura2_decoder;
|
||||
AVCodec ff_avrp_encoder;
|
||||
AVCodec ff_avrp_decoder;
|
||||
AVCodec ff_avrn_decoder;
|
||||
AVCodec ff_avs_decoder;
|
||||
AVCodec ff_avui_encoder;
|
||||
AVCodec ff_avui_decoder;
|
||||
AVCodec ff_ayuv_encoder;
|
||||
AVCodec ff_ayuv_decoder;
|
||||
AVCodec ff_bethsoftvid_decoder;
|
||||
AVCodec ff_bfi_decoder;
|
||||
AVCodec ff_bink_decoder;
|
||||
AVCodec ff_bmp_encoder;
|
||||
AVCodec ff_bmp_decoder;
|
||||
AVCodec ff_bmv_video_decoder;
|
||||
AVCodec ff_brender_pix_decoder;
|
||||
AVCodec ff_c93_decoder;
|
||||
AVCodec ff_cavs_decoder;
|
||||
AVCodec ff_cdgraphics_decoder;
|
||||
AVCodec ff_cdxl_decoder;
|
||||
AVCodec ff_cfhd_decoder;
|
||||
AVCodec ff_cinepak_encoder;
|
||||
AVCodec ff_cinepak_decoder;
|
||||
AVCodec ff_cljr_encoder;
|
||||
AVCodec ff_cljr_decoder;
|
||||
AVCodec ff_cllc_decoder;
|
||||
AVCodec ff_comfortnoise_encoder;
|
||||
AVCodec ff_comfortnoise_decoder;
|
||||
AVCodec ff_cpia_decoder;
|
||||
AVCodec ff_cscd_decoder;
|
||||
AVCodec ff_cyuv_decoder;
|
||||
AVCodec ff_dds_decoder;
|
||||
AVCodec ff_dfa_decoder;
|
||||
AVCodec ff_dirac_decoder;
|
||||
AVCodec ff_dnxhd_encoder;
|
||||
AVCodec ff_dnxhd_decoder;
|
||||
AVCodec ff_dpx_encoder;
|
||||
AVCodec ff_dpx_decoder;
|
||||
AVCodec ff_dsicinvideo_decoder;
|
||||
AVCodec ff_dvaudio_decoder;
|
||||
AVCodec ff_dvvideo_encoder;
|
||||
AVCodec ff_dvvideo_decoder;
|
||||
AVCodec ff_dxa_decoder;
|
||||
AVCodec ff_dxtory_decoder;
|
||||
AVCodec ff_eacmv_decoder;
|
||||
AVCodec ff_eamad_decoder;
|
||||
AVCodec ff_eatgq_decoder;
|
||||
AVCodec ff_eatgv_decoder;
|
||||
AVCodec ff_eatqi_decoder;
|
||||
AVCodec ff_eightbps_decoder;
|
||||
AVCodec ff_eightsvx_exp_decoder;
|
||||
AVCodec ff_eightsvx_fib_decoder;
|
||||
AVCodec ff_escape124_decoder;
|
||||
AVCodec ff_escape130_decoder;
|
||||
AVCodec ff_exr_decoder;
|
||||
AVCodec ff_ffv1_encoder;
|
||||
AVCodec ff_ffv1_decoder;
|
||||
AVCodec ff_ffvhuff_encoder;
|
||||
AVCodec ff_ffvhuff_decoder;
|
||||
AVCodec ff_fic_decoder;
|
||||
AVCodec ff_flashsv_encoder;
|
||||
AVCodec ff_flashsv_decoder;
|
||||
AVCodec ff_flashsv2_encoder;
|
||||
AVCodec ff_flashsv2_decoder;
|
||||
AVCodec ff_flic_decoder;
|
||||
AVCodec ff_flv_encoder;
|
||||
AVCodec ff_flv_decoder;
|
||||
AVCodec ff_fourxm_decoder;
|
||||
AVCodec ff_fraps_decoder;
|
||||
AVCodec ff_frwu_decoder;
|
||||
AVCodec ff_g2m_decoder;
|
||||
AVCodec ff_gif_encoder;
|
||||
AVCodec ff_gif_decoder;
|
||||
AVCodec ff_h261_encoder;
|
||||
AVCodec ff_h261_decoder;
|
||||
AVCodec ff_h263_encoder;
|
||||
AVCodec ff_h263_decoder;
|
||||
AVCodec ff_h263i_decoder;
|
||||
AVCodec ff_h263p_encoder;
|
||||
AVCodec ff_h263p_decoder;
|
||||
AVCodec ff_h264_decoder;
|
||||
AVCodec ff_h264_crystalhd_decoder;
|
||||
AVCodec ff_h264_mmal_decoder;
|
||||
AVCodec ff_h264_qsv_decoder;
|
||||
AVCodec ff_h264_vda_decoder;
|
||||
AVCodec ff_h264_vdpau_decoder;
|
||||
AVCodec ff_hap_encoder;
|
||||
AVCodec ff_hap_decoder;
|
||||
AVCodec ff_hevc_decoder;
|
||||
AVCodec ff_hevc_qsv_decoder;
|
||||
AVCodec ff_hnm4_video_decoder;
|
||||
AVCodec ff_hq_hqa_decoder;
|
||||
AVCodec ff_hqx_decoder;
|
||||
AVCodec ff_huffyuv_encoder;
|
||||
AVCodec ff_huffyuv_decoder;
|
||||
AVCodec ff_idcin_decoder;
|
||||
AVCodec ff_iff_byterun1_decoder;
|
||||
AVCodec ff_iff_ilbm_decoder;
|
||||
AVCodec ff_indeo2_decoder;
|
||||
AVCodec ff_indeo3_decoder;
|
||||
AVCodec ff_indeo4_decoder;
|
||||
AVCodec ff_indeo5_decoder;
|
||||
AVCodec ff_interplay_video_decoder;
|
||||
AVCodec ff_jpeg2000_encoder;
|
||||
AVCodec ff_jpeg2000_decoder;
|
||||
AVCodec ff_jpegls_encoder;
|
||||
AVCodec ff_jpegls_decoder;
|
||||
AVCodec ff_jv_decoder;
|
||||
AVCodec ff_kgv1_decoder;
|
||||
AVCodec ff_kmvc_decoder;
|
||||
AVCodec ff_lagarith_decoder;
|
||||
AVCodec ff_ljpeg_encoder;
|
||||
AVCodec ff_loco_decoder;
|
||||
AVCodec ff_mdec_decoder;
|
||||
AVCodec ff_mimic_decoder;
|
||||
AVCodec ff_mjpeg_encoder;
|
||||
AVCodec ff_mjpeg_decoder;
|
||||
AVCodec ff_mjpegb_decoder;
|
||||
AVCodec ff_mmvideo_decoder;
|
||||
AVCodec ff_motionpixels_decoder;
|
||||
AVCodec ff_mpeg_xvmc_decoder;
|
||||
AVCodec ff_mpeg1video_encoder;
|
||||
AVCodec ff_mpeg1video_decoder;
|
||||
AVCodec ff_mpeg2video_encoder;
|
||||
AVCodec ff_mpeg2video_decoder;
|
||||
AVCodec ff_mpeg4_encoder;
|
||||
AVCodec ff_mpeg4_decoder;
|
||||
AVCodec ff_mpeg4_crystalhd_decoder;
|
||||
AVCodec ff_mpeg4_mmal_decoder;
|
||||
AVCodec ff_mpeg4_vdpau_decoder;
|
||||
AVCodec ff_mpegvideo_decoder;
|
||||
AVCodec ff_mpeg_vdpau_decoder;
|
||||
AVCodec ff_mpeg1_vdpau_decoder;
|
||||
AVCodec ff_mpeg2_crystalhd_decoder;
|
||||
AVCodec ff_mpeg2_qsv_decoder;
|
||||
AVCodec ff_msa1_decoder;
|
||||
AVCodec ff_msmpeg4_crystalhd_decoder;
|
||||
AVCodec ff_msmpeg4v1_decoder;
|
||||
AVCodec ff_msmpeg4v2_encoder;
|
||||
AVCodec ff_msmpeg4v2_decoder;
|
||||
AVCodec ff_msmpeg4v3_encoder;
|
||||
AVCodec ff_msmpeg4v3_decoder;
|
||||
AVCodec ff_msrle_decoder;
|
||||
AVCodec ff_mss1_decoder;
|
||||
AVCodec ff_mss2_decoder;
|
||||
AVCodec ff_msvideo1_encoder;
|
||||
AVCodec ff_msvideo1_decoder;
|
||||
AVCodec ff_mszh_decoder;
|
||||
AVCodec ff_mts2_decoder;
|
||||
AVCodec ff_mvc1_decoder;
|
||||
AVCodec ff_mvc2_decoder;
|
||||
AVCodec ff_mxpeg_decoder;
|
||||
AVCodec ff_nuv_decoder;
|
||||
AVCodec ff_paf_video_decoder;
|
||||
AVCodec ff_pam_encoder;
|
||||
AVCodec ff_pam_decoder;
|
||||
AVCodec ff_pbm_encoder;
|
||||
AVCodec ff_pbm_decoder;
|
||||
AVCodec ff_pcx_encoder;
|
||||
AVCodec ff_pcx_decoder;
|
||||
AVCodec ff_pgm_encoder;
|
||||
AVCodec ff_pgm_decoder;
|
||||
AVCodec ff_pgmyuv_encoder;
|
||||
AVCodec ff_pgmyuv_decoder;
|
||||
AVCodec ff_pictor_decoder;
|
||||
AVCodec ff_png_encoder;
|
||||
AVCodec ff_png_decoder;
|
||||
AVCodec ff_ppm_encoder;
|
||||
AVCodec ff_ppm_decoder;
|
||||
AVCodec ff_prores_encoder;
|
||||
AVCodec ff_prores_decoder;
|
||||
AVCodec ff_prores_aw_encoder;
|
||||
AVCodec ff_prores_ks_encoder;
|
||||
AVCodec ff_prores_lgpl_decoder;
|
||||
AVCodec ff_ptx_decoder;
|
||||
AVCodec ff_qdraw_decoder;
|
||||
AVCodec ff_qpeg_decoder;
|
||||
AVCodec ff_qtrle_encoder;
|
||||
AVCodec ff_qtrle_decoder;
|
||||
AVCodec ff_r10k_encoder;
|
||||
AVCodec ff_r10k_decoder;
|
||||
AVCodec ff_r210_encoder;
|
||||
AVCodec ff_r210_decoder;
|
||||
AVCodec ff_rawvideo_encoder;
|
||||
AVCodec ff_rawvideo_decoder;
|
||||
AVCodec ff_rl2_decoder;
|
||||
AVCodec ff_roq_encoder;
|
||||
AVCodec ff_roq_decoder;
|
||||
AVCodec ff_rpza_decoder;
|
||||
AVCodec ff_rv10_encoder;
|
||||
AVCodec ff_rv10_decoder;
|
||||
AVCodec ff_rv20_encoder;
|
||||
AVCodec ff_rv20_decoder;
|
||||
AVCodec ff_rv30_decoder;
|
||||
AVCodec ff_rv40_decoder;
|
||||
AVCodec ff_s302m_encoder;
|
||||
AVCodec ff_s302m_decoder;
|
||||
AVCodec ff_sanm_decoder;
|
||||
AVCodec ff_sgi_encoder;
|
||||
AVCodec ff_sgi_decoder;
|
||||
AVCodec ff_sgirle_decoder;
|
||||
AVCodec ff_smacker_decoder;
|
||||
AVCodec ff_smc_decoder;
|
||||
AVCodec ff_smvjpeg_decoder;
|
||||
AVCodec ff_snow_encoder;
|
||||
AVCodec ff_snow_decoder;
|
||||
AVCodec ff_sp5x_decoder;
|
||||
AVCodec ff_sunrast_encoder;
|
||||
AVCodec ff_sunrast_decoder;
|
||||
AVCodec ff_svq1_encoder;
|
||||
AVCodec ff_svq1_decoder;
|
||||
AVCodec ff_svq3_decoder;
|
||||
AVCodec ff_targa_encoder;
|
||||
AVCodec ff_targa_decoder;
|
||||
AVCodec ff_targa_y216_decoder;
|
||||
AVCodec ff_tdsc_decoder;
|
||||
AVCodec ff_theora_decoder;
|
||||
AVCodec ff_thp_decoder;
|
||||
AVCodec ff_tiertexseqvideo_decoder;
|
||||
AVCodec ff_tiff_encoder;
|
||||
AVCodec ff_tiff_decoder;
|
||||
AVCodec ff_tmv_decoder;
|
||||
AVCodec ff_truemotion1_decoder;
|
||||
AVCodec ff_truemotion2_decoder;
|
||||
AVCodec ff_tscc_decoder;
|
||||
AVCodec ff_tscc2_decoder;
|
||||
AVCodec ff_txd_decoder;
|
||||
AVCodec ff_ulti_decoder;
|
||||
AVCodec ff_utvideo_encoder;
|
||||
AVCodec ff_utvideo_decoder;
|
||||
AVCodec ff_v210_encoder;
|
||||
AVCodec ff_v210_decoder;
|
||||
AVCodec ff_v210x_decoder;
|
||||
AVCodec ff_v308_encoder;
|
||||
AVCodec ff_v308_decoder;
|
||||
AVCodec ff_v408_encoder;
|
||||
AVCodec ff_v408_decoder;
|
||||
AVCodec ff_v410_encoder;
|
||||
AVCodec ff_v410_decoder;
|
||||
AVCodec ff_vb_decoder;
|
||||
AVCodec ff_vble_decoder;
|
||||
AVCodec ff_vc1_decoder;
|
||||
AVCodec ff_vc1_crystalhd_decoder;
|
||||
AVCodec ff_vc1_vdpau_decoder;
|
||||
AVCodec ff_vc1image_decoder;
|
||||
AVCodec ff_vc1_qsv_decoder;
|
||||
AVCodec ff_vc2_encoder;
|
||||
AVCodec ff_vcr1_decoder;
|
||||
AVCodec ff_vmdvideo_decoder;
|
||||
AVCodec ff_vmnc_decoder;
|
||||
AVCodec ff_vp3_decoder;
|
||||
AVCodec ff_vp5_decoder;
|
||||
AVCodec ff_vp6_decoder;
|
||||
AVCodec ff_vp6a_decoder;
|
||||
AVCodec ff_vp6f_decoder;
|
||||
AVCodec ff_vp7_decoder;
|
||||
AVCodec ff_vqa_decoder;
|
||||
AVCodec ff_webp_decoder;
|
||||
AVCodec ff_wmv1_encoder;
|
||||
AVCodec ff_wmv1_decoder;
|
||||
AVCodec ff_wmv2_encoder;
|
||||
AVCodec ff_wmv2_decoder;
|
||||
AVCodec ff_wmv3_decoder;
|
||||
AVCodec ff_wmv3_crystalhd_decoder;
|
||||
AVCodec ff_wmv3_vdpau_decoder;
|
||||
AVCodec ff_wmv3image_decoder;
|
||||
AVCodec ff_wnv1_decoder;
|
||||
AVCodec ff_xan_wc3_decoder;
|
||||
AVCodec ff_xan_wc4_decoder;
|
||||
AVCodec ff_xbm_encoder;
|
||||
AVCodec ff_xbm_decoder;
|
||||
AVCodec ff_xface_encoder;
|
||||
AVCodec ff_xface_decoder;
|
||||
AVCodec ff_xl_decoder;
|
||||
AVCodec ff_xwd_encoder;
|
||||
AVCodec ff_xwd_decoder;
|
||||
AVCodec ff_y41p_encoder;
|
||||
AVCodec ff_y41p_decoder;
|
||||
AVCodec ff_yop_decoder;
|
||||
AVCodec ff_yuv4_encoder;
|
||||
AVCodec ff_yuv4_decoder;
|
||||
AVCodec ff_zero12v_decoder;
|
||||
AVCodec ff_zerocodec_decoder;
|
||||
AVCodec ff_zlib_encoder;
|
||||
AVCodec ff_zlib_decoder;
|
||||
AVCodec ff_zmbv_encoder;
|
||||
AVCodec ff_zmbv_decoder;
|
||||
AVCodec ff_aac_encoder;
|
||||
AVCodec ff_aac_decoder;
|
||||
AVCodec ff_aac_fixed_decoder;
|
||||
AVCodec ff_aac_latm_decoder;
|
||||
AVCodec ff_ac3_encoder;
|
||||
AVCodec ff_ac3_decoder;
|
||||
AVCodec ff_ac3_fixed_encoder;
|
||||
AVCodec ff_ac3_fixed_decoder;
|
||||
AVCodec ff_alac_encoder;
|
||||
AVCodec ff_alac_decoder;
|
||||
AVCodec ff_als_decoder;
|
||||
AVCodec ff_amrnb_decoder;
|
||||
AVCodec ff_amrwb_decoder;
|
||||
AVCodec ff_ape_decoder;
|
||||
AVCodec ff_atrac1_decoder;
|
||||
AVCodec ff_atrac3_decoder;
|
||||
AVCodec ff_atrac3p_decoder;
|
||||
AVCodec ff_binkaudio_dct_decoder;
|
||||
AVCodec ff_binkaudio_rdft_decoder;
|
||||
AVCodec ff_bmv_audio_decoder;
|
||||
AVCodec ff_cook_decoder;
|
||||
AVCodec ff_dca_encoder;
|
||||
AVCodec ff_dca_decoder;
|
||||
AVCodec ff_dsd_lsbf_decoder;
|
||||
AVCodec ff_dsd_msbf_decoder;
|
||||
AVCodec ff_dsd_lsbf_planar_decoder;
|
||||
AVCodec ff_dsd_msbf_planar_decoder;
|
||||
AVCodec ff_dsicinaudio_decoder;
|
||||
AVCodec ff_dss_sp_decoder;
|
||||
AVCodec ff_eac3_encoder;
|
||||
AVCodec ff_eac3_decoder;
|
||||
AVCodec ff_evrc_decoder;
|
||||
AVCodec ff_ffwavesynth_decoder;
|
||||
AVCodec ff_flac_encoder;
|
||||
AVCodec ff_g723_1_encoder;
|
||||
AVCodec ff_g723_1_decoder;
|
||||
AVCodec ff_g729_decoder;
|
||||
AVCodec ff_gsm_decoder;
|
||||
AVCodec ff_gsm_ms_decoder;
|
||||
AVCodec ff_iac_decoder;
|
||||
AVCodec ff_imc_decoder;
|
||||
AVCodec ff_mace3_decoder;
|
||||
AVCodec ff_mace6_decoder;
|
||||
AVCodec ff_metasound_decoder;
|
||||
AVCodec ff_mlp_decoder;
|
||||
AVCodec ff_mp1_decoder;
|
||||
AVCodec ff_mp1float_decoder;
|
||||
AVCodec ff_mp2_encoder;
|
||||
AVCodec ff_mp2_decoder;
|
||||
AVCodec ff_mp2float_decoder;
|
||||
AVCodec ff_mp2fixed_encoder;
|
||||
AVCodec ff_mp3_decoder;
|
||||
AVCodec ff_mp3float_decoder;
|
||||
AVCodec ff_mp3adu_decoder;
|
||||
AVCodec ff_mp3adufloat_decoder;
|
||||
AVCodec ff_mp3on4_decoder;
|
||||
AVCodec ff_mp3on4float_decoder;
|
||||
AVCodec ff_mpc7_decoder;
|
||||
AVCodec ff_mpc8_decoder;
|
||||
AVCodec ff_nellymoser_encoder;
|
||||
AVCodec ff_nellymoser_decoder;
|
||||
AVCodec ff_on2avc_decoder;
|
||||
AVCodec ff_opus_decoder;
|
||||
AVCodec ff_paf_audio_decoder;
|
||||
AVCodec ff_qcelp_decoder;
|
||||
AVCodec ff_qdm2_decoder;
|
||||
AVCodec ff_ra_144_encoder;
|
||||
AVCodec ff_ra_144_decoder;
|
||||
AVCodec ff_ra_288_decoder;
|
||||
AVCodec ff_ralf_decoder;
|
||||
AVCodec ff_shorten_decoder;
|
||||
AVCodec ff_sipr_decoder;
|
||||
AVCodec ff_smackaud_decoder;
|
||||
AVCodec ff_sonic_encoder;
|
||||
AVCodec ff_sonic_decoder;
|
||||
AVCodec ff_sonic_ls_encoder;
|
||||
AVCodec ff_tak_decoder;
|
||||
AVCodec ff_truehd_decoder;
|
||||
AVCodec ff_truespeech_decoder;
|
||||
AVCodec ff_tta_encoder;
|
||||
AVCodec ff_tta_decoder;
|
||||
AVCodec ff_twinvq_decoder;
|
||||
AVCodec ff_vmdaudio_decoder;
|
||||
AVCodec ff_vorbis_encoder;
|
||||
AVCodec ff_vorbis_decoder;
|
||||
AVCodec ff_wavpack_encoder;
|
||||
AVCodec ff_wavpack_decoder;
|
||||
AVCodec ff_wmalossless_decoder;
|
||||
AVCodec ff_wmapro_decoder;
|
||||
AVCodec ff_wmav1_encoder;
|
||||
AVCodec ff_wmav1_decoder;
|
||||
AVCodec ff_wmav2_encoder;
|
||||
AVCodec ff_wmav2_decoder;
|
||||
AVCodec ff_wmavoice_decoder;
|
||||
AVCodec ff_ws_snd1_decoder;
|
||||
AVCodec ff_pcm_alaw_encoder;
|
||||
AVCodec ff_pcm_alaw_decoder;
|
||||
AVCodec ff_pcm_bluray_decoder;
|
||||
AVCodec ff_pcm_dvd_decoder;
|
||||
AVCodec ff_pcm_f32be_encoder;
|
||||
AVCodec ff_pcm_f32be_decoder;
|
||||
AVCodec ff_pcm_f32le_encoder;
|
||||
AVCodec ff_pcm_f32le_decoder;
|
||||
AVCodec ff_pcm_f64be_encoder;
|
||||
AVCodec ff_pcm_f64be_decoder;
|
||||
AVCodec ff_pcm_f64le_encoder;
|
||||
AVCodec ff_pcm_f64le_decoder;
|
||||
AVCodec ff_pcm_lxf_decoder;
|
||||
AVCodec ff_pcm_mulaw_encoder;
|
||||
AVCodec ff_pcm_mulaw_decoder;
|
||||
AVCodec ff_pcm_s8_encoder;
|
||||
AVCodec ff_pcm_s8_decoder;
|
||||
AVCodec ff_pcm_s8_planar_encoder;
|
||||
AVCodec ff_pcm_s8_planar_decoder;
|
||||
AVCodec ff_pcm_s16be_encoder;
|
||||
AVCodec ff_pcm_s16be_decoder;
|
||||
AVCodec ff_pcm_s16be_planar_encoder;
|
||||
AVCodec ff_pcm_s16be_planar_decoder;
|
||||
AVCodec ff_pcm_s16le_encoder;
|
||||
AVCodec ff_pcm_s16le_decoder;
|
||||
AVCodec ff_pcm_s16le_planar_encoder;
|
||||
AVCodec ff_pcm_s16le_planar_decoder;
|
||||
AVCodec ff_pcm_s24be_encoder;
|
||||
AVCodec ff_pcm_s24be_decoder;
|
||||
AVCodec ff_pcm_s24daud_encoder;
|
||||
AVCodec ff_pcm_s24daud_decoder;
|
||||
AVCodec ff_pcm_s24le_encoder;
|
||||
AVCodec ff_pcm_s24le_decoder;
|
||||
AVCodec ff_pcm_s24le_planar_encoder;
|
||||
AVCodec ff_pcm_s24le_planar_decoder;
|
||||
AVCodec ff_pcm_s32be_encoder;
|
||||
AVCodec ff_pcm_s32be_decoder;
|
||||
AVCodec ff_pcm_s32le_encoder;
|
||||
AVCodec ff_pcm_s32le_decoder;
|
||||
AVCodec ff_pcm_s32le_planar_encoder;
|
||||
AVCodec ff_pcm_s32le_planar_decoder;
|
||||
AVCodec ff_pcm_u8_encoder;
|
||||
AVCodec ff_pcm_u8_decoder;
|
||||
AVCodec ff_pcm_u16be_encoder;
|
||||
AVCodec ff_pcm_u16be_decoder;
|
||||
AVCodec ff_pcm_u16le_encoder;
|
||||
AVCodec ff_pcm_u16le_decoder;
|
||||
AVCodec ff_pcm_u24be_encoder;
|
||||
AVCodec ff_pcm_u24be_decoder;
|
||||
AVCodec ff_pcm_u24le_encoder;
|
||||
AVCodec ff_pcm_u24le_decoder;
|
||||
AVCodec ff_pcm_u32be_encoder;
|
||||
AVCodec ff_pcm_u32be_decoder;
|
||||
AVCodec ff_pcm_u32le_encoder;
|
||||
AVCodec ff_pcm_u32le_decoder;
|
||||
AVCodec ff_pcm_zork_decoder;
|
||||
AVCodec ff_interplay_dpcm_decoder;
|
||||
AVCodec ff_roq_dpcm_encoder;
|
||||
AVCodec ff_roq_dpcm_decoder;
|
||||
AVCodec ff_sol_dpcm_decoder;
|
||||
AVCodec ff_xan_dpcm_decoder;
|
||||
AVCodec ff_adpcm_4xm_decoder;
|
||||
AVCodec ff_adpcm_adx_encoder;
|
||||
AVCodec ff_adpcm_adx_decoder;
|
||||
AVCodec ff_adpcm_afc_decoder;
|
||||
AVCodec ff_adpcm_ct_decoder;
|
||||
AVCodec ff_adpcm_dtk_decoder;
|
||||
AVCodec ff_adpcm_ea_decoder;
|
||||
AVCodec ff_adpcm_ea_maxis_xa_decoder;
|
||||
AVCodec ff_adpcm_ea_r1_decoder;
|
||||
AVCodec ff_adpcm_ea_r2_decoder;
|
||||
AVCodec ff_adpcm_ea_r3_decoder;
|
||||
AVCodec ff_adpcm_ea_xas_decoder;
|
||||
AVCodec ff_adpcm_g722_encoder;
|
||||
AVCodec ff_adpcm_g722_decoder;
|
||||
AVCodec ff_adpcm_g726_encoder;
|
||||
AVCodec ff_adpcm_g726_decoder;
|
||||
AVCodec ff_adpcm_g726le_decoder;
|
||||
AVCodec ff_adpcm_ima_amv_decoder;
|
||||
AVCodec ff_adpcm_ima_apc_decoder;
|
||||
AVCodec ff_adpcm_ima_dk3_decoder;
|
||||
AVCodec ff_adpcm_ima_dk4_decoder;
|
||||
AVCodec ff_adpcm_ima_ea_eacs_decoder;
|
||||
AVCodec ff_adpcm_ima_ea_sead_decoder;
|
||||
AVCodec ff_adpcm_ima_iss_decoder;
|
||||
AVCodec ff_adpcm_ima_oki_decoder;
|
||||
AVCodec ff_adpcm_ima_qt_encoder;
|
||||
AVCodec ff_adpcm_ima_qt_decoder;
|
||||
AVCodec ff_adpcm_ima_rad_decoder;
|
||||
AVCodec ff_adpcm_ima_smjpeg_decoder;
|
||||
AVCodec ff_adpcm_ima_wav_encoder;
|
||||
AVCodec ff_adpcm_ima_wav_decoder;
|
||||
AVCodec ff_adpcm_ima_ws_decoder;
|
||||
AVCodec ff_adpcm_ms_encoder;
|
||||
AVCodec ff_adpcm_ms_decoder;
|
||||
AVCodec ff_adpcm_sbpro_2_decoder;
|
||||
AVCodec ff_adpcm_sbpro_3_decoder;
|
||||
AVCodec ff_adpcm_sbpro_4_decoder;
|
||||
AVCodec ff_adpcm_swf_encoder;
|
||||
AVCodec ff_adpcm_swf_decoder;
|
||||
AVCodec ff_adpcm_thp_decoder;
|
||||
AVCodec ff_adpcm_thp_le_decoder;
|
||||
AVCodec ff_adpcm_vima_decoder;
|
||||
AVCodec ff_adpcm_xa_decoder;
|
||||
AVCodec ff_adpcm_yamaha_encoder;
|
||||
AVCodec ff_adpcm_yamaha_decoder;
|
||||
AVCodec ff_vima_decoder;
|
||||
AVCodec ff_ssa_encoder;
|
||||
AVCodec ff_ssa_decoder;
|
||||
AVCodec ff_ass_encoder;
|
||||
AVCodec ff_ass_decoder;
|
||||
AVCodec ff_ccaption_decoder;
|
||||
AVCodec ff_dvbsub_encoder;
|
||||
AVCodec ff_dvbsub_decoder;
|
||||
AVCodec ff_dvdsub_encoder;
|
||||
AVCodec ff_dvdsub_decoder;
|
||||
AVCodec ff_jacosub_decoder;
|
||||
AVCodec ff_microdvd_decoder;
|
||||
AVCodec ff_movtext_encoder;
|
||||
AVCodec ff_movtext_decoder;
|
||||
AVCodec ff_mpl2_decoder;
|
||||
AVCodec ff_pgssub_decoder;
|
||||
AVCodec ff_pjs_decoder;
|
||||
AVCodec ff_realtext_decoder;
|
||||
AVCodec ff_sami_decoder;
|
||||
AVCodec ff_srt_encoder;
|
||||
AVCodec ff_srt_decoder;
|
||||
AVCodec ff_stl_decoder;
|
||||
AVCodec ff_subrip_encoder;
|
||||
AVCodec ff_subrip_decoder;
|
||||
AVCodec ff_subviewer_decoder;
|
||||
AVCodec ff_subviewer1_decoder;
|
||||
AVCodec ff_text_decoder;
|
||||
AVCodec ff_vplayer_decoder;
|
||||
AVCodec ff_webvtt_encoder;
|
||||
AVCodec ff_webvtt_decoder;
|
||||
AVCodec ff_xsub_encoder;
|
||||
AVCodec ff_xsub_decoder;
|
||||
AVCodec ff_libcelt_decoder;
|
||||
AVCodec ff_libdcadec_decoder;
|
||||
AVCodec ff_libfaac_encoder;
|
||||
AVCodec ff_libfdk_aac_encoder;
|
||||
AVCodec ff_libfdk_aac_decoder;
|
||||
AVCodec ff_libgsm_encoder;
|
||||
AVCodec ff_libgsm_decoder;
|
||||
AVCodec ff_libgsm_ms_encoder;
|
||||
AVCodec ff_libgsm_ms_decoder;
|
||||
AVCodec ff_libilbc_encoder;
|
||||
AVCodec ff_libilbc_decoder;
|
||||
AVCodec ff_libmp3lame_encoder;
|
||||
AVCodec ff_libopencore_amrnb_encoder;
|
||||
AVCodec ff_libopencore_amrnb_decoder;
|
||||
AVCodec ff_libopencore_amrwb_decoder;
|
||||
AVCodec ff_libopenjpeg_encoder;
|
||||
AVCodec ff_libopenjpeg_decoder;
|
||||
AVCodec ff_libopus_encoder;
|
||||
AVCodec ff_libopus_decoder;
|
||||
AVCodec ff_libschroedinger_encoder;
|
||||
AVCodec ff_libschroedinger_decoder;
|
||||
AVCodec ff_libshine_encoder;
|
||||
AVCodec ff_libspeex_encoder;
|
||||
AVCodec ff_libspeex_decoder;
|
||||
AVCodec ff_libstagefright_h264_decoder;
|
||||
AVCodec ff_libtheora_encoder;
|
||||
AVCodec ff_libtwolame_encoder;
|
||||
AVCodec ff_libutvideo_encoder;
|
||||
AVCodec ff_libutvideo_decoder;
|
||||
AVCodec ff_libvo_aacenc_encoder;
|
||||
AVCodec ff_libvo_amrwbenc_encoder;
|
||||
AVCodec ff_libvorbis_encoder;
|
||||
AVCodec ff_libvorbis_decoder;
|
||||
AVCodec ff_libvpx_vp8_encoder;
|
||||
AVCodec ff_libvpx_vp8_decoder;
|
||||
AVCodec ff_libvpx_vp9_encoder;
|
||||
AVCodec ff_libvpx_vp9_decoder;
|
||||
AVCodec ff_libwavpack_encoder;
|
||||
AVCodec ff_libwebp_anim_encoder;
|
||||
AVCodec ff_libwebp_encoder;
|
||||
AVCodec ff_libx262_encoder;
|
||||
AVCodec ff_libx264_encoder;
|
||||
AVCodec ff_libx264rgb_encoder;
|
||||
AVCodec ff_libx265_encoder;
|
||||
AVCodec ff_libxavs_encoder;
|
||||
AVCodec ff_libxvid_encoder;
|
||||
AVCodec ff_libzvbi_teletext_decoder;
|
||||
AVCodec ff_libaacplus_encoder;
|
||||
AVCodec ff_bintext_decoder;
|
||||
AVCodec ff_xbin_decoder;
|
||||
AVCodec ff_idf_decoder;
|
||||
AVCodec ff_libopenh264_encoder;
|
||||
AVCodec ff_h264_qsv_encoder;
|
||||
AVCodec ff_nvenc_encoder;
|
||||
AVCodec ff_nvenc_h264_encoder;
|
||||
AVCodec ff_nvenc_hevc_encoder;
|
||||
AVCodec ff_hevc_qsv_encoder;
|
||||
AVCodec ff_libkvazaar_encoder;
|
||||
AVCodec ff_mpeg2_qsv_encoder;
|
||||
AVCodec ff_dxv_decoder;
|
||||
AVCodec ff_mpeg2_mmal_decoder;
|
||||
AVCodec ff_rscc_decoder;
|
||||
AVCodec ff_screenpresso_decoder;
|
||||
AVCodec ff_sdx2_dpcm_decoder;
|
||||
AVCodec ff_vc1_mmal_decoder;
|
||||
AVCodec ff_wrapped_avframe_encoder;
|
||||
AVCodec ff_interplay_acm_decoder;
|
||||
AVCodec ff_xma1_decoder;
|
||||
AVCodec ff_xma2_decoder;
|
||||
AVCodec ff_adpcm_aica_decoder;
|
||||
AVCodec ff_adpcm_psx_decoder;
|
||||
AVCodec ff_text_encoder;
|
||||
AVCodec ff_vp9_cuvid_decoder;
|
||||
AVCodec ff_vp8_cuvid_decoder;
|
||||
AVCodec ff_vc1_cuvid_decoder;
|
||||
AVCodec ff_mjpeg_vaapi_encoder;
|
||||
AVCodec ff_hevc_vaapi_encoder;
|
||||
AVCodec ff_hevc_nvenc_encoder;
|
||||
AVCodec ff_hevc_cuvid_decoder;
|
||||
AVCodec ff_h264_videotoolbox_encoder;
|
||||
AVCodec ff_h264_vaapi_encoder;
|
||||
AVCodec ff_h264_omx_encoder;
|
||||
AVCodec ff_h264_nvenc_encoder;
|
||||
AVCodec ff_h264_cuvid_decoder;
|
||||
AVCodec ff_qdm2_at_decoder;
|
||||
AVCodec ff_qdmc_at_decoder;
|
||||
AVCodec ff_pcm_mulaw_at_decoder;
|
||||
AVCodec ff_pcm_mulaw_at_encoder;
|
||||
AVCodec ff_pcm_alaw_at_decoder;
|
||||
AVCodec ff_pcm_alaw_at_encoder;
|
||||
AVCodec ff_mp3_at_decoder;
|
||||
AVCodec ff_mp2_at_decoder;
|
||||
AVCodec ff_mp1_at_decoder;
|
||||
AVCodec ff_ilbc_at_decoder;
|
||||
AVCodec ff_ilbc_at_encoder;
|
||||
AVCodec ff_gsm_ms_at_decoder;
|
||||
AVCodec ff_eac3_at_decoder;
|
||||
AVCodec ff_amr_nb_at_decoder;
|
||||
AVCodec ff_alac_at_decoder;
|
||||
AVCodec ff_alac_at_encoder;
|
||||
AVCodec ff_adpcm_ima_qt_at_decoder;
|
||||
AVCodec ff_ac3_at_decoder;
|
||||
AVCodec ff_aac_at_decoder;
|
||||
AVCodec ff_aac_at_encoder;
|
||||
AVCodec ff_adpcm_mtaf_decoder;
|
||||
AVCodec ff_adpcm_ima_dat4_decoder;
|
||||
AVCodec ff_dst_decoder;
|
||||
AVCodec ff_ylc_decoder;
|
||||
AVCodec ff_truemotion2rt_decoder;
|
||||
AVCodec ff_sheervideo_decoder;
|
||||
AVCodec ff_magicyuv_decoder;
|
||||
AVCodec ff_m101_decoder;
|
||||
AVCodec ff_h264_mediacodec_decoder;
|
||||
|
||||
AVCodecParser ff_aac_parser;
|
||||
AVCodecParser ff_aac_latm_parser;
|
||||
AVCodecParser ff_ac3_parser;
|
||||
AVCodecParser ff_adx_parser;
|
||||
AVCodecParser ff_bmp_parser;
|
||||
AVCodecParser ff_cavsvideo_parser;
|
||||
AVCodecParser ff_cook_parser;
|
||||
AVCodecParser ff_dca_parser;
|
||||
AVCodecParser ff_dirac_parser;
|
||||
AVCodecParser ff_dnxhd_parser;
|
||||
AVCodecParser ff_dpx_parser;
|
||||
AVCodecParser ff_dvaudio_parser;
|
||||
AVCodecParser ff_dvbsub_parser;
|
||||
AVCodecParser ff_dvdsub_parser;
|
||||
AVCodecParser ff_dvd_nav_parser;
|
||||
AVCodecParser ff_g729_parser;
|
||||
AVCodecParser ff_gsm_parser;
|
||||
AVCodecParser ff_h261_parser;
|
||||
AVCodecParser ff_h263_parser;
|
||||
AVCodecParser ff_h264_parser;
|
||||
AVCodecParser ff_hevc_parser;
|
||||
AVCodecParser ff_mjpeg_parser;
|
||||
AVCodecParser ff_mlp_parser;
|
||||
AVCodecParser ff_mpeg4video_parser;
|
||||
AVCodecParser ff_mpegaudio_parser;
|
||||
AVCodecParser ff_mpegvideo_parser;
|
||||
AVCodecParser ff_opus_parser;
|
||||
AVCodecParser ff_png_parser;
|
||||
AVCodecParser ff_pnm_parser;
|
||||
AVCodecParser ff_rv30_parser;
|
||||
AVCodecParser ff_rv40_parser;
|
||||
AVCodecParser ff_tak_parser;
|
||||
AVCodecParser ff_vc1_parser;
|
||||
AVCodecParser ff_vorbis_parser;
|
||||
AVCodecParser ff_vp3_parser;
|
||||
AVBitStreamFilter ff_aac_adtstoasc_bsf;
|
||||
AVBitStreamFilter ff_chomp_bsf;
|
||||
AVBitStreamFilter ff_dump_extradata_bsf;
|
||||
AVBitStreamFilter ff_h264_mp4toannexb_bsf;
|
||||
AVBitStreamFilter ff_hevc_mp4toannexb_bsf;
|
||||
AVBitStreamFilter ff_imx_dump_header_bsf;
|
||||
AVBitStreamFilter ff_mjpeg2jpeg_bsf;
|
||||
AVBitStreamFilter ff_mjpega_dump_header_bsf;
|
||||
AVBitStreamFilter ff_mp3_header_decompress_bsf;
|
||||
AVBitStreamFilter ff_mpeg4_unpack_bframes_bsf;
|
||||
AVBitStreamFilter ff_mov2textsub_bsf;
|
||||
AVBitStreamFilter ff_noise_bsf;
|
||||
AVBitStreamFilter ff_remove_extradata_bsf;
|
||||
AVBitStreamFilter ff_text2movsub_bsf;
|
||||
|
||||
void ff_h264_pred_init_aarch64(H264PredContext *h, int codec_id,
|
||||
const int bit_depth,
|
||||
const int chroma_format_idc) {}
|
||||
void ff_h264_pred_init_arm(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc) {}
|
||||
void ff_h264_pred_init_mips(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc) {}
|
||||
void ff_me_cmp_init_static(void) {}
|
||||
int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options) { return 0; }
|
||||
void ff_frame_thread_encoder_free(AVCodecContext *avctx) {}
|
||||
int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr) { return 0; }
|
||||
void ff_videodsp_init_aarch64(VideoDSPContext *ctx, int bpc) {}
|
||||
void ff_videodsp_init_arm(VideoDSPContext *ctx, int bpc) {}
|
||||
void ff_videodsp_init_ppc(VideoDSPContext *ctx, int bpc) {}
|
||||
void ff_vp7dsp_init(VP8DSPContext *c) {}
|
||||
void ff_vp78dsp_init_arm(VP8DSPContext *c) {}
|
||||
void ff_vp78dsp_init_ppc(VP8DSPContext *c) {}
|
||||
void ff_vp8dsp_init_arm(VP8DSPContext *c) {}
|
||||
void ff_vp8dsp_init_mips(VP8DSPContext *c) {}
|
||||
void ff_vp9dsp_init_mips(VP9DSPContext *dsp, int bpp) {}
|
||||
void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt, int channels, int bps) {}
|
||||
#if !defined(HAVE_64BIT_BUILD)
|
||||
void ff_flac_decorrelate_indep8_16_sse2(uint8_t **out, int32_t **in, int channels, int len, int shift) {}
|
||||
void ff_flac_decorrelate_indep8_32_avx(uint8_t **out, int32_t **in, int channels, int len, int shift) {}
|
||||
void ff_flac_decorrelate_indep8_16_avx(uint8_t **out, int32_t **in, int channels, int len, int shift) {}
|
||||
void ff_flac_decorrelate_indep8_32_sse2(uint8_t **out, int32_t **in, int channels, int len, int shift) {}
|
||||
#endif
|
||||
void av_bitstream_filter_close(AVBitStreamFilterContext *bsf) {}
|
||||
int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc,
|
||||
AVCodecContext *avctx, const char *args,
|
||||
uint8_t **poutbuf, int *poutbuf_size,
|
||||
const uint8_t *buf, int buf_size, int keyframe) { return 0; }
|
||||
AVBitStreamFilterContext *av_bitstream_filter_init(const char *name) { return NULL;}
|
||||
AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f) { return NULL; }
|
||||
void av_register_bitstream_filter(AVBitStreamFilter *bsf) {}
|
||||
96
media/ffvpx/libavcodec/error_resilience.h
Normal file
96
media/ffvpx/libavcodec/error_resilience.h
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_ERROR_RESILIENCE_H
|
||||
#define AVCODEC_ERROR_RESILIENCE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "me_cmp.h"
|
||||
#include "thread.h"
|
||||
|
||||
///< current MB is the first after a resync marker
|
||||
#define VP_START 1
|
||||
#define ER_AC_ERROR 2
|
||||
#define ER_DC_ERROR 4
|
||||
#define ER_MV_ERROR 8
|
||||
#define ER_AC_END 16
|
||||
#define ER_DC_END 32
|
||||
#define ER_MV_END 64
|
||||
|
||||
#define ER_MB_ERROR (ER_AC_ERROR|ER_DC_ERROR|ER_MV_ERROR)
|
||||
#define ER_MB_END (ER_AC_END|ER_DC_END|ER_MV_END)
|
||||
|
||||
typedef struct ERPicture {
|
||||
AVFrame *f;
|
||||
ThreadFrame *tf;
|
||||
|
||||
// it is the caller's responsibility to allocate these buffers
|
||||
int16_t (*motion_val[2])[2];
|
||||
int8_t *ref_index[2];
|
||||
|
||||
uint32_t *mb_type;
|
||||
int field_picture;
|
||||
} ERPicture;
|
||||
|
||||
typedef struct ERContext {
|
||||
AVCodecContext *avctx;
|
||||
MECmpContext mecc;
|
||||
int mecc_inited;
|
||||
|
||||
int *mb_index2xy;
|
||||
int mb_num;
|
||||
int mb_width, mb_height;
|
||||
int mb_stride;
|
||||
int b8_stride;
|
||||
|
||||
volatile int error_count;
|
||||
int error_occurred;
|
||||
uint8_t *error_status_table;
|
||||
uint8_t *er_temp_buffer;
|
||||
int16_t *dc_val[3];
|
||||
uint8_t *mbskip_table;
|
||||
uint8_t *mbintra_table;
|
||||
int mv[2][4][2];
|
||||
|
||||
ERPicture cur_pic;
|
||||
ERPicture last_pic;
|
||||
ERPicture next_pic;
|
||||
|
||||
AVBufferRef *ref_index_buf[2];
|
||||
AVBufferRef *motion_val_buf[2];
|
||||
|
||||
uint16_t pp_time;
|
||||
uint16_t pb_time;
|
||||
int quarter_sample;
|
||||
int partitioned_frame;
|
||||
int ref_count;
|
||||
|
||||
void (*decode_mb)(void *opaque, int ref, int mv_dir, int mv_type,
|
||||
int (*mv)[2][4][2],
|
||||
int mb_x, int mb_y, int mb_intra, int mb_skipped);
|
||||
void *opaque;
|
||||
} ERContext;
|
||||
|
||||
void ff_er_frame_start(ERContext *s);
|
||||
void ff_er_frame_end(ERContext *s);
|
||||
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy,
|
||||
int status);
|
||||
|
||||
#endif /* AVCODEC_ERROR_RESILIENCE_H */
|
||||
37
media/ffvpx/libavcodec/fdctdsp.h
Normal file
37
media/ffvpx/libavcodec/fdctdsp.h
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FDCTDSP_H
|
||||
#define AVCODEC_FDCTDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
typedef struct FDCTDSPContext {
|
||||
void (*fdct)(int16_t *block /* align 16 */);
|
||||
void (*fdct248)(int16_t *block /* align 16 */);
|
||||
} FDCTDSPContext;
|
||||
|
||||
void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx);
|
||||
void ff_fdctdsp_init_ppc(FDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_fdctdsp_init_x86(FDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
|
||||
#endif /* AVCODEC_FDCTDSP_H */
|
||||
30
media/ffvpx/libavcodec/ff_options_table.h
Normal file
30
media/ffvpx/libavcodec/ff_options_table.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) 2001 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_OPTIONS_TABLE_H
|
||||
#define AVCODEC_OPTIONS_TABLE_H
|
||||
|
||||
#include "libavutil/opt.h"
|
||||
static const AVOption avcodec_options[] = {
|
||||
{NULL},
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_OPTIONS_TABLE_H */
|
||||
237
media/ffvpx/libavcodec/flac.c
Normal file
237
media/ffvpx/libavcodec/flac.c
Normal file
|
|
@ -0,0 +1,237 @@
|
|||
/*
|
||||
* FLAC common code
|
||||
* Copyright (c) 2009 Justin Ruggles
|
||||
*
|
||||
* 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 "libavutil/channel_layout.h"
|
||||
#include "libavutil/crc.h"
|
||||
#include "libavutil/log.h"
|
||||
#include "bytestream.h"
|
||||
#include "get_bits.h"
|
||||
#include "flac.h"
|
||||
#include "flacdata.h"
|
||||
|
||||
static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 };
|
||||
|
||||
static const uint64_t flac_channel_layouts[8] = {
|
||||
AV_CH_LAYOUT_MONO,
|
||||
AV_CH_LAYOUT_STEREO,
|
||||
AV_CH_LAYOUT_SURROUND,
|
||||
AV_CH_LAYOUT_QUAD,
|
||||
AV_CH_LAYOUT_5POINT0,
|
||||
AV_CH_LAYOUT_5POINT1,
|
||||
AV_CH_LAYOUT_6POINT1,
|
||||
AV_CH_LAYOUT_7POINT1
|
||||
};
|
||||
|
||||
static int64_t get_utf8(GetBitContext *gb)
|
||||
{
|
||||
int64_t val;
|
||||
GET_UTF8(val, get_bits(gb, 8), return -1;)
|
||||
return val;
|
||||
}
|
||||
|
||||
int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
FLACFrameInfo *fi, int log_level_offset)
|
||||
{
|
||||
int bs_code, sr_code, bps_code;
|
||||
|
||||
/* frame sync code */
|
||||
if ((get_bits(gb, 15) & 0x7FFF) != 0x7FFC) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset, "invalid sync code\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* variable block size stream code */
|
||||
fi->is_var_size = get_bits1(gb);
|
||||
|
||||
/* block size and sample rate codes */
|
||||
bs_code = get_bits(gb, 4);
|
||||
sr_code = get_bits(gb, 4);
|
||||
|
||||
/* channels and decorrelation */
|
||||
fi->ch_mode = get_bits(gb, 4);
|
||||
if (fi->ch_mode < FLAC_MAX_CHANNELS) {
|
||||
fi->channels = fi->ch_mode + 1;
|
||||
fi->ch_mode = FLAC_CHMODE_INDEPENDENT;
|
||||
} else if (fi->ch_mode < FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE) {
|
||||
fi->channels = 2;
|
||||
fi->ch_mode -= FLAC_MAX_CHANNELS - 1;
|
||||
} else {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"invalid channel mode: %d\n", fi->ch_mode);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* bits per sample */
|
||||
bps_code = get_bits(gb, 3);
|
||||
if (bps_code == 3 || bps_code == 7) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"invalid sample size code (%d)\n",
|
||||
bps_code);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
fi->bps = sample_size_table[bps_code];
|
||||
|
||||
/* reserved bit */
|
||||
if (get_bits1(gb)) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"broken stream, invalid padding\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* sample or frame count */
|
||||
fi->frame_or_sample_num = get_utf8(gb);
|
||||
if (fi->frame_or_sample_num < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"sample/frame number invalid; utf8 fscked\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* blocksize */
|
||||
if (bs_code == 0) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"reserved blocksize code: 0\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
} else if (bs_code == 6) {
|
||||
fi->blocksize = get_bits(gb, 8) + 1;
|
||||
} else if (bs_code == 7) {
|
||||
fi->blocksize = get_bits(gb, 16) + 1;
|
||||
} else {
|
||||
fi->blocksize = ff_flac_blocksize_table[bs_code];
|
||||
}
|
||||
|
||||
/* sample rate */
|
||||
if (sr_code < 12) {
|
||||
fi->samplerate = ff_flac_sample_rate_table[sr_code];
|
||||
} else if (sr_code == 12) {
|
||||
fi->samplerate = get_bits(gb, 8) * 1000;
|
||||
} else if (sr_code == 13) {
|
||||
fi->samplerate = get_bits(gb, 16);
|
||||
} else if (sr_code == 14) {
|
||||
fi->samplerate = get_bits(gb, 16) * 10;
|
||||
} else {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"illegal sample rate code %d\n",
|
||||
sr_code);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* header CRC-8 check */
|
||||
skip_bits(gb, 8);
|
||||
if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer,
|
||||
get_bits_count(gb)/8)) {
|
||||
av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
||||
"header crc mismatch\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_flac_get_max_frame_size(int blocksize, int ch, int bps)
|
||||
{
|
||||
/* Technically, there is no limit to FLAC frame size, but an encoder
|
||||
should not write a frame that is larger than if verbatim encoding mode
|
||||
were to be used. */
|
||||
|
||||
int count;
|
||||
|
||||
count = 16; /* frame header */
|
||||
count += ch * ((7+bps+7)/8); /* subframe headers */
|
||||
if (ch == 2) {
|
||||
/* for stereo, need to account for using decorrelation */
|
||||
count += (( 2*bps+1) * blocksize + 7) / 8;
|
||||
} else {
|
||||
count += ( ch*bps * blocksize + 7) / 8;
|
||||
}
|
||||
count += 2; /* frame footer */
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int ff_flac_is_extradata_valid(AVCodecContext *avctx,
|
||||
enum FLACExtradataFormat *format,
|
||||
uint8_t **streaminfo_start)
|
||||
{
|
||||
if (!avctx->extradata || avctx->extradata_size < FLAC_STREAMINFO_SIZE) {
|
||||
av_log(avctx, AV_LOG_ERROR, "extradata NULL or too small.\n");
|
||||
return 0;
|
||||
}
|
||||
if (AV_RL32(avctx->extradata) != MKTAG('f','L','a','C')) {
|
||||
/* extradata contains STREAMINFO only */
|
||||
if (avctx->extradata_size != FLAC_STREAMINFO_SIZE) {
|
||||
av_log(avctx, AV_LOG_WARNING, "extradata contains %d bytes too many.\n",
|
||||
FLAC_STREAMINFO_SIZE-avctx->extradata_size);
|
||||
}
|
||||
*format = FLAC_EXTRADATA_FORMAT_STREAMINFO;
|
||||
*streaminfo_start = avctx->extradata;
|
||||
} else {
|
||||
if (avctx->extradata_size < 8+FLAC_STREAMINFO_SIZE) {
|
||||
av_log(avctx, AV_LOG_ERROR, "extradata too small.\n");
|
||||
return 0;
|
||||
}
|
||||
*format = FLAC_EXTRADATA_FORMAT_FULL_HEADER;
|
||||
*streaminfo_start = &avctx->extradata[8];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ff_flac_set_channel_layout(AVCodecContext *avctx)
|
||||
{
|
||||
if (avctx->channels <= FF_ARRAY_ELEMS(flac_channel_layouts))
|
||||
avctx->channel_layout = flac_channel_layouts[avctx->channels - 1];
|
||||
else
|
||||
avctx->channel_layout = 0;
|
||||
}
|
||||
|
||||
void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
|
||||
const uint8_t *buffer)
|
||||
{
|
||||
GetBitContext gb;
|
||||
init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8);
|
||||
|
||||
skip_bits(&gb, 16); /* skip min blocksize */
|
||||
s->max_blocksize = get_bits(&gb, 16);
|
||||
if (s->max_blocksize < FLAC_MIN_BLOCKSIZE) {
|
||||
av_log(avctx, AV_LOG_WARNING, "invalid max blocksize: %d\n",
|
||||
s->max_blocksize);
|
||||
s->max_blocksize = 16;
|
||||
}
|
||||
|
||||
skip_bits(&gb, 24); /* skip min frame size */
|
||||
s->max_framesize = get_bits_long(&gb, 24);
|
||||
|
||||
s->samplerate = get_bits_long(&gb, 20);
|
||||
s->channels = get_bits(&gb, 3) + 1;
|
||||
s->bps = get_bits(&gb, 5) + 1;
|
||||
|
||||
avctx->channels = s->channels;
|
||||
avctx->sample_rate = s->samplerate;
|
||||
avctx->bits_per_raw_sample = s->bps;
|
||||
|
||||
if (!avctx->channel_layout ||
|
||||
av_get_channel_layout_nb_channels(avctx->channel_layout) != avctx->channels)
|
||||
ff_flac_set_channel_layout(avctx);
|
||||
|
||||
s->samples = get_bits64(&gb, 36);
|
||||
|
||||
skip_bits_long(&gb, 64); /* md5 sum */
|
||||
skip_bits_long(&gb, 64); /* md5 sum */
|
||||
}
|
||||
153
media/ffvpx/libavcodec/flac.h
Normal file
153
media/ffvpx/libavcodec/flac.h
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
* FLAC (Free Lossless Audio Codec) decoder/demuxer common functions
|
||||
* Copyright (c) 2008 Justin Ruggles
|
||||
*
|
||||
* 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
|
||||
* FLAC (Free Lossless Audio Codec) decoder/demuxer common functions
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FLAC_H
|
||||
#define AVCODEC_FLAC_H
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "bytestream.h"
|
||||
#include "get_bits.h"
|
||||
|
||||
#define FLAC_STREAMINFO_SIZE 34
|
||||
#define FLAC_MAX_CHANNELS 8
|
||||
#define FLAC_MIN_BLOCKSIZE 16
|
||||
#define FLAC_MAX_BLOCKSIZE 65535
|
||||
#define FLAC_MIN_FRAME_SIZE 11
|
||||
|
||||
enum {
|
||||
FLAC_CHMODE_INDEPENDENT = 0,
|
||||
FLAC_CHMODE_LEFT_SIDE = 1,
|
||||
FLAC_CHMODE_RIGHT_SIDE = 2,
|
||||
FLAC_CHMODE_MID_SIDE = 3,
|
||||
};
|
||||
|
||||
enum {
|
||||
FLAC_METADATA_TYPE_STREAMINFO = 0,
|
||||
FLAC_METADATA_TYPE_PADDING,
|
||||
FLAC_METADATA_TYPE_APPLICATION,
|
||||
FLAC_METADATA_TYPE_SEEKTABLE,
|
||||
FLAC_METADATA_TYPE_VORBIS_COMMENT,
|
||||
FLAC_METADATA_TYPE_CUESHEET,
|
||||
FLAC_METADATA_TYPE_PICTURE,
|
||||
FLAC_METADATA_TYPE_INVALID = 127
|
||||
};
|
||||
|
||||
enum FLACExtradataFormat {
|
||||
FLAC_EXTRADATA_FORMAT_STREAMINFO = 0,
|
||||
FLAC_EXTRADATA_FORMAT_FULL_HEADER = 1
|
||||
};
|
||||
|
||||
#define FLACCOMMONINFO \
|
||||
int samplerate; /**< sample rate */\
|
||||
int channels; /**< number of channels */\
|
||||
int bps; /**< bits-per-sample */\
|
||||
|
||||
/**
|
||||
* Data needed from the Streaminfo header for use by the raw FLAC demuxer
|
||||
* and/or the FLAC decoder.
|
||||
*/
|
||||
#define FLACSTREAMINFO \
|
||||
FLACCOMMONINFO \
|
||||
int max_blocksize; /**< maximum block size, in samples */\
|
||||
int max_framesize; /**< maximum frame size, in bytes */\
|
||||
int64_t samples; /**< total number of samples */\
|
||||
|
||||
typedef struct FLACStreaminfo {
|
||||
FLACSTREAMINFO
|
||||
} FLACStreaminfo;
|
||||
|
||||
typedef struct FLACFrameInfo {
|
||||
FLACCOMMONINFO
|
||||
int blocksize; /**< block size of the frame */
|
||||
int ch_mode; /**< channel decorrelation mode */
|
||||
int64_t frame_or_sample_num; /**< frame number or sample number */
|
||||
int is_var_size; /**< specifies if the stream uses variable
|
||||
block sizes or a fixed block size;
|
||||
also determines the meaning of
|
||||
frame_or_sample_num */
|
||||
} FLACFrameInfo;
|
||||
|
||||
/**
|
||||
* Parse the Streaminfo metadata block
|
||||
* @param[out] avctx codec context to set basic stream parameters
|
||||
* @param[out] s where parsed information is stored
|
||||
* @param[in] buffer pointer to start of 34-byte streaminfo data
|
||||
*/
|
||||
void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
|
||||
const uint8_t *buffer);
|
||||
|
||||
/**
|
||||
* Validate the FLAC extradata.
|
||||
* @param[in] avctx codec context containing the extradata.
|
||||
* @param[out] format extradata format.
|
||||
* @param[out] streaminfo_start pointer to start of 34-byte STREAMINFO data.
|
||||
* @return 1 if valid, 0 if not valid.
|
||||
*/
|
||||
int ff_flac_is_extradata_valid(AVCodecContext *avctx,
|
||||
enum FLACExtradataFormat *format,
|
||||
uint8_t **streaminfo_start);
|
||||
|
||||
/**
|
||||
* Calculate an estimate for the maximum frame size based on verbatim mode.
|
||||
* @param blocksize block size, in samples
|
||||
* @param ch number of channels
|
||||
* @param bps bits-per-sample
|
||||
*/
|
||||
int ff_flac_get_max_frame_size(int blocksize, int ch, int bps);
|
||||
|
||||
/**
|
||||
* Validate and decode a frame header.
|
||||
* @param avctx AVCodecContext to use as av_log() context
|
||||
* @param gb GetBitContext from which to read frame header
|
||||
* @param[out] fi frame information
|
||||
* @param log_level_offset log level offset. can be used to silence error messages.
|
||||
* @return non-zero on error, 0 if ok
|
||||
*/
|
||||
int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
FLACFrameInfo *fi, int log_level_offset);
|
||||
|
||||
void ff_flac_set_channel_layout(AVCodecContext *avctx);
|
||||
|
||||
/**
|
||||
* Parse the metadata block parameters from the header.
|
||||
* @param[in] block_header header data, at least 4 bytes
|
||||
* @param[out] last indicator for last metadata block
|
||||
* @param[out] type metadata block type
|
||||
* @param[out] size metadata block size
|
||||
*/
|
||||
static av_always_inline void flac_parse_block_header(const uint8_t *block_header,
|
||||
int *last, int *type, int *size)
|
||||
{
|
||||
int tmp = bytestream_get_byte(&block_header);
|
||||
if (last)
|
||||
*last = tmp & 0x80;
|
||||
if (type)
|
||||
*type = tmp & 0x7F;
|
||||
if (size)
|
||||
*size = bytestream_get_be24(&block_header);
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_FLAC_H */
|
||||
755
media/ffvpx/libavcodec/flac_parser.c
Normal file
755
media/ffvpx/libavcodec/flac_parser.c
Normal file
|
|
@ -0,0 +1,755 @@
|
|||
/*
|
||||
* FLAC parser
|
||||
* Copyright (c) 2010 Michael Chinen
|
||||
*
|
||||
* 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
|
||||
* FLAC parser
|
||||
*
|
||||
* The FLAC parser buffers input until FLAC_MIN_HEADERS has been found.
|
||||
* Each time it finds and verifies a CRC-8 header it sees which of the
|
||||
* FLAC_MAX_SEQUENTIAL_HEADERS that came before it have a valid CRC-16 footer
|
||||
* that ends at the newly found header.
|
||||
* Headers are scored by FLAC_HEADER_BASE_SCORE plus the max of its crc-verified
|
||||
* children, penalized by changes in sample rate, frame number, etc.
|
||||
* The parser returns the frame with the highest score.
|
||||
**/
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/crc.h"
|
||||
#include "libavutil/fifo.h"
|
||||
#include "bytestream.h"
|
||||
#include "parser.h"
|
||||
#include "flac.h"
|
||||
|
||||
/** maximum number of adjacent headers that compare CRCs against each other */
|
||||
#define FLAC_MAX_SEQUENTIAL_HEADERS 4
|
||||
/** minimum number of headers buffered and checked before returning frames */
|
||||
#define FLAC_MIN_HEADERS 10
|
||||
/** estimate for average size of a FLAC frame */
|
||||
#define FLAC_AVG_FRAME_SIZE 8192
|
||||
|
||||
/** scoring settings for score_header */
|
||||
#define FLAC_HEADER_BASE_SCORE 10
|
||||
#define FLAC_HEADER_CHANGED_PENALTY 7
|
||||
#define FLAC_HEADER_CRC_FAIL_PENALTY 50
|
||||
#define FLAC_HEADER_NOT_PENALIZED_YET 100000
|
||||
#define FLAC_HEADER_NOT_SCORED_YET -100000
|
||||
|
||||
/** largest possible size of flac header */
|
||||
#define MAX_FRAME_HEADER_SIZE 16
|
||||
|
||||
typedef struct FLACHeaderMarker {
|
||||
int offset; /**< byte offset from start of FLACParseContext->buffer */
|
||||
int *link_penalty; /**< pointer to array of local scores between this header
|
||||
and the one at a distance equal array position */
|
||||
int max_score; /**< maximum score found after checking each child that
|
||||
has a valid CRC */
|
||||
FLACFrameInfo fi; /**< decoded frame header info */
|
||||
struct FLACHeaderMarker *next; /**< next CRC-8 verified header that
|
||||
immediately follows this one in
|
||||
the bytestream */
|
||||
struct FLACHeaderMarker *best_child; /**< following frame header with
|
||||
which this frame has the best
|
||||
score with */
|
||||
} FLACHeaderMarker;
|
||||
|
||||
typedef struct FLACParseContext {
|
||||
AVCodecParserContext *pc; /**< parent context */
|
||||
AVCodecContext *avctx; /**< codec context pointer for logging */
|
||||
FLACHeaderMarker *headers; /**< linked-list that starts at the first
|
||||
CRC-8 verified header within buffer */
|
||||
FLACHeaderMarker *best_header; /**< highest scoring header within buffer */
|
||||
int nb_headers_found; /**< number of headers found in the last
|
||||
flac_parse() call */
|
||||
int nb_headers_buffered; /**< number of headers that are buffered */
|
||||
int best_header_valid; /**< flag set when the parser returns junk;
|
||||
if set return best_header next time */
|
||||
AVFifoBuffer *fifo_buf; /**< buffer to store all data until headers
|
||||
can be verified */
|
||||
int end_padded; /**< specifies if fifo_buf's end is padded */
|
||||
uint8_t *wrap_buf; /**< general fifo read buffer when wrapped */
|
||||
int wrap_buf_allocated_size; /**< actual allocated size of the buffer */
|
||||
FLACFrameInfo last_fi; /**< last decoded frame header info */
|
||||
int last_fi_valid; /**< set if last_fi is valid */
|
||||
} FLACParseContext;
|
||||
|
||||
static int frame_header_is_valid(AVCodecContext *avctx, const uint8_t *buf,
|
||||
FLACFrameInfo *fi)
|
||||
{
|
||||
GetBitContext gb;
|
||||
init_get_bits(&gb, buf, MAX_FRAME_HEADER_SIZE * 8);
|
||||
return !ff_flac_decode_frame_header(avctx, &gb, fi, 127);
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-destructive fast fifo pointer fetching
|
||||
* Returns a pointer from the specified offset.
|
||||
* If possible the pointer points within the fifo buffer.
|
||||
* Otherwise (if it would cause a wrap around,) a pointer to a user-specified
|
||||
* buffer is used.
|
||||
* The pointer can be NULL. In any case it will be reallocated to hold the size.
|
||||
* If the returned pointer will be used after subsequent calls to flac_fifo_read_wrap
|
||||
* then the subsequent calls should pass in a different wrap_buf so as to not
|
||||
* overwrite the contents of the previous wrap_buf.
|
||||
* This function is based on av_fifo_generic_read, which is why there is a comment
|
||||
* about a memory barrier for SMP.
|
||||
*/
|
||||
static uint8_t* flac_fifo_read_wrap(FLACParseContext *fpc, int offset, int len,
|
||||
uint8_t** wrap_buf, int* allocated_size)
|
||||
{
|
||||
AVFifoBuffer *f = fpc->fifo_buf;
|
||||
uint8_t *start = f->rptr + offset;
|
||||
uint8_t *tmp_buf;
|
||||
|
||||
if (start >= f->end)
|
||||
start -= f->end - f->buffer;
|
||||
if (f->end - start >= len)
|
||||
return start;
|
||||
|
||||
tmp_buf = av_fast_realloc(*wrap_buf, allocated_size, len);
|
||||
|
||||
if (!tmp_buf) {
|
||||
av_log(fpc->avctx, AV_LOG_ERROR,
|
||||
"couldn't reallocate wrap buffer of size %d", len);
|
||||
return NULL;
|
||||
}
|
||||
*wrap_buf = tmp_buf;
|
||||
do {
|
||||
int seg_len = FFMIN(f->end - start, len);
|
||||
memcpy(tmp_buf, start, seg_len);
|
||||
tmp_buf = (uint8_t*)tmp_buf + seg_len;
|
||||
// memory barrier needed for SMP here in theory
|
||||
|
||||
start += seg_len - (f->end - f->buffer);
|
||||
len -= seg_len;
|
||||
} while (len > 0);
|
||||
|
||||
return *wrap_buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a pointer in the fifo buffer where the offset starts at until
|
||||
* the wrap point or end of request.
|
||||
* len will contain the valid length of the returned buffer.
|
||||
* A second call to flac_fifo_read (with new offset and len) should be called
|
||||
* to get the post-wrap buf if the returned len is less than the requested.
|
||||
**/
|
||||
static uint8_t* flac_fifo_read(FLACParseContext *fpc, int offset, int *len)
|
||||
{
|
||||
AVFifoBuffer *f = fpc->fifo_buf;
|
||||
uint8_t *start = f->rptr + offset;
|
||||
|
||||
if (start >= f->end)
|
||||
start -= f->end - f->buffer;
|
||||
*len = FFMIN(*len, f->end - start);
|
||||
return start;
|
||||
}
|
||||
|
||||
static int find_headers_search_validate(FLACParseContext *fpc, int offset)
|
||||
{
|
||||
FLACFrameInfo fi;
|
||||
uint8_t *header_buf;
|
||||
int size = 0;
|
||||
header_buf = flac_fifo_read_wrap(fpc, offset,
|
||||
MAX_FRAME_HEADER_SIZE,
|
||||
&fpc->wrap_buf,
|
||||
&fpc->wrap_buf_allocated_size);
|
||||
if (frame_header_is_valid(fpc->avctx, header_buf, &fi)) {
|
||||
FLACHeaderMarker **end_handle = &fpc->headers;
|
||||
int i;
|
||||
|
||||
size = 0;
|
||||
while (*end_handle) {
|
||||
end_handle = &(*end_handle)->next;
|
||||
size++;
|
||||
}
|
||||
|
||||
*end_handle = av_mallocz(sizeof(**end_handle));
|
||||
if (!*end_handle) {
|
||||
av_log(fpc->avctx, AV_LOG_ERROR,
|
||||
"couldn't allocate FLACHeaderMarker\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
(*end_handle)->fi = fi;
|
||||
(*end_handle)->offset = offset;
|
||||
(*end_handle)->link_penalty = av_malloc(sizeof(int) *
|
||||
FLAC_MAX_SEQUENTIAL_HEADERS);
|
||||
if (!(*end_handle)->link_penalty) {
|
||||
av_freep(end_handle);
|
||||
av_log(fpc->avctx, AV_LOG_ERROR,
|
||||
"couldn't allocate link_penalty\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS; i++)
|
||||
(*end_handle)->link_penalty[i] = FLAC_HEADER_NOT_PENALIZED_YET;
|
||||
|
||||
fpc->nb_headers_found++;
|
||||
size++;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static int find_headers_search(FLACParseContext *fpc, uint8_t *buf, int buf_size,
|
||||
int search_start)
|
||||
|
||||
{
|
||||
int size = 0, mod_offset = (buf_size - 1) % 4, i, j;
|
||||
uint32_t x;
|
||||
|
||||
for (i = 0; i < mod_offset; i++) {
|
||||
if ((AV_RB16(buf + i) & 0xFFFE) == 0xFFF8)
|
||||
size = find_headers_search_validate(fpc, search_start + i);
|
||||
}
|
||||
|
||||
for (; i < buf_size - 1; i += 4) {
|
||||
x = AV_RB32(buf + i);
|
||||
if (((x & ~(x + 0x01010101)) & 0x80808080)) {
|
||||
for (j = 0; j < 4; j++) {
|
||||
if ((AV_RB16(buf + i + j) & 0xFFFE) == 0xFFF8)
|
||||
size = find_headers_search_validate(fpc, search_start + i + j);
|
||||
}
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static int find_new_headers(FLACParseContext *fpc, int search_start)
|
||||
{
|
||||
FLACHeaderMarker *end;
|
||||
int search_end, size = 0, read_len, temp;
|
||||
uint8_t *buf;
|
||||
fpc->nb_headers_found = 0;
|
||||
|
||||
/* Search for a new header of at most 16 bytes. */
|
||||
search_end = av_fifo_size(fpc->fifo_buf) - (MAX_FRAME_HEADER_SIZE - 1);
|
||||
read_len = search_end - search_start + 1;
|
||||
buf = flac_fifo_read(fpc, search_start, &read_len);
|
||||
size = find_headers_search(fpc, buf, read_len, search_start);
|
||||
search_start += read_len - 1;
|
||||
|
||||
/* If fifo end was hit do the wrap around. */
|
||||
if (search_start != search_end) {
|
||||
uint8_t wrap[2];
|
||||
|
||||
wrap[0] = buf[read_len - 1];
|
||||
read_len = search_end - search_start + 1;
|
||||
|
||||
/* search_start + 1 is the post-wrap offset in the fifo. */
|
||||
buf = flac_fifo_read(fpc, search_start + 1, &read_len);
|
||||
wrap[1] = buf[0];
|
||||
|
||||
if ((AV_RB16(wrap) & 0xFFFE) == 0xFFF8) {
|
||||
temp = find_headers_search_validate(fpc, search_start);
|
||||
size = FFMAX(size, temp);
|
||||
}
|
||||
search_start++;
|
||||
|
||||
/* Continue to do the last half of the wrap. */
|
||||
temp = find_headers_search(fpc, buf, read_len, search_start);
|
||||
size = FFMAX(size, temp);
|
||||
search_start += read_len - 1;
|
||||
}
|
||||
|
||||
/* Return the size even if no new headers were found. */
|
||||
if (!size && fpc->headers)
|
||||
for (end = fpc->headers; end; end = end->next)
|
||||
size++;
|
||||
return size;
|
||||
}
|
||||
|
||||
static int check_header_fi_mismatch(FLACParseContext *fpc,
|
||||
FLACFrameInfo *header_fi,
|
||||
FLACFrameInfo *child_fi,
|
||||
int log_level_offset)
|
||||
{
|
||||
int deduction = 0;
|
||||
if (child_fi->samplerate != header_fi->samplerate) {
|
||||
deduction += FLAC_HEADER_CHANGED_PENALTY;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"sample rate change detected in adjacent frames\n");
|
||||
}
|
||||
if (child_fi->bps != header_fi->bps) {
|
||||
deduction += FLAC_HEADER_CHANGED_PENALTY;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"bits per sample change detected in adjacent frames\n");
|
||||
}
|
||||
if (child_fi->is_var_size != header_fi->is_var_size) {
|
||||
/* Changing blocking strategy not allowed per the spec */
|
||||
deduction += FLAC_HEADER_BASE_SCORE;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"blocking strategy change detected in adjacent frames\n");
|
||||
}
|
||||
if (child_fi->channels != header_fi->channels) {
|
||||
deduction += FLAC_HEADER_CHANGED_PENALTY;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"number of channels change detected in adjacent frames\n");
|
||||
}
|
||||
return deduction;
|
||||
}
|
||||
|
||||
static int check_header_mismatch(FLACParseContext *fpc,
|
||||
FLACHeaderMarker *header,
|
||||
FLACHeaderMarker *child,
|
||||
int log_level_offset)
|
||||
{
|
||||
FLACFrameInfo *header_fi = &header->fi, *child_fi = &child->fi;
|
||||
int deduction, deduction_expected = 0, i;
|
||||
deduction = check_header_fi_mismatch(fpc, header_fi, child_fi,
|
||||
log_level_offset);
|
||||
/* Check sample and frame numbers. */
|
||||
if ((child_fi->frame_or_sample_num - header_fi->frame_or_sample_num
|
||||
!= header_fi->blocksize) &&
|
||||
(child_fi->frame_or_sample_num
|
||||
!= header_fi->frame_or_sample_num + 1)) {
|
||||
FLACHeaderMarker *curr;
|
||||
int expected_frame_num, expected_sample_num;
|
||||
/* If there are frames in the middle we expect this deduction,
|
||||
as they are probably valid and this one follows it */
|
||||
|
||||
expected_frame_num = expected_sample_num = header_fi->frame_or_sample_num;
|
||||
curr = header;
|
||||
while (curr != child) {
|
||||
/* Ignore frames that failed all crc checks */
|
||||
for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS; i++) {
|
||||
if (curr->link_penalty[i] < FLAC_HEADER_CRC_FAIL_PENALTY) {
|
||||
expected_frame_num++;
|
||||
expected_sample_num += curr->fi.blocksize;
|
||||
break;
|
||||
}
|
||||
}
|
||||
curr = curr->next;
|
||||
}
|
||||
|
||||
if (expected_frame_num == child_fi->frame_or_sample_num ||
|
||||
expected_sample_num == child_fi->frame_or_sample_num)
|
||||
deduction_expected = deduction ? 0 : 1;
|
||||
|
||||
deduction += FLAC_HEADER_CHANGED_PENALTY;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"sample/frame number mismatch in adjacent frames\n");
|
||||
}
|
||||
|
||||
/* If we have suspicious headers, check the CRC between them */
|
||||
if (deduction && !deduction_expected) {
|
||||
FLACHeaderMarker *curr;
|
||||
int read_len;
|
||||
uint8_t *buf;
|
||||
uint32_t crc = 1;
|
||||
int inverted_test = 0;
|
||||
|
||||
/* Since CRC is expensive only do it if we haven't yet.
|
||||
This assumes a CRC penalty is greater than all other check penalties */
|
||||
curr = header->next;
|
||||
for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS && curr != child; i++)
|
||||
curr = curr->next;
|
||||
|
||||
if (header->link_penalty[i] < FLAC_HEADER_CRC_FAIL_PENALTY ||
|
||||
header->link_penalty[i] == FLAC_HEADER_NOT_PENALIZED_YET) {
|
||||
FLACHeaderMarker *start, *end;
|
||||
|
||||
/* Although overlapping chains are scored, the crc should never
|
||||
have to be computed twice for a single byte. */
|
||||
start = header;
|
||||
end = child;
|
||||
if (i > 0 &&
|
||||
header->link_penalty[i - 1] >= FLAC_HEADER_CRC_FAIL_PENALTY) {
|
||||
while (start->next != child)
|
||||
start = start->next;
|
||||
inverted_test = 1;
|
||||
} else if (i > 0 &&
|
||||
header->next->link_penalty[i-1] >=
|
||||
FLAC_HEADER_CRC_FAIL_PENALTY ) {
|
||||
end = header->next;
|
||||
inverted_test = 1;
|
||||
}
|
||||
|
||||
read_len = end->offset - start->offset;
|
||||
buf = flac_fifo_read(fpc, start->offset, &read_len);
|
||||
crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf, read_len);
|
||||
read_len = (end->offset - start->offset) - read_len;
|
||||
|
||||
if (read_len) {
|
||||
buf = flac_fifo_read(fpc, end->offset - read_len, &read_len);
|
||||
crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), crc, buf, read_len);
|
||||
}
|
||||
}
|
||||
|
||||
if (!crc ^ !inverted_test) {
|
||||
deduction += FLAC_HEADER_CRC_FAIL_PENALTY;
|
||||
av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
|
||||
"crc check failed from offset %i (frame %"PRId64") to %i (frame %"PRId64")\n",
|
||||
header->offset, header_fi->frame_or_sample_num,
|
||||
child->offset, child_fi->frame_or_sample_num);
|
||||
}
|
||||
}
|
||||
return deduction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Score a header.
|
||||
*
|
||||
* Give FLAC_HEADER_BASE_SCORE points to a frame for existing.
|
||||
* If it has children, (subsequent frames of which the preceding CRC footer
|
||||
* validates against this one,) then take the maximum score of the children,
|
||||
* with a penalty of FLAC_HEADER_CHANGED_PENALTY applied for each change to
|
||||
* bps, sample rate, channels, but not decorrelation mode, or blocksize,
|
||||
* because it can change often.
|
||||
**/
|
||||
static int score_header(FLACParseContext *fpc, FLACHeaderMarker *header)
|
||||
{
|
||||
FLACHeaderMarker *child;
|
||||
int dist = 0;
|
||||
int child_score;
|
||||
int base_score = FLAC_HEADER_BASE_SCORE;
|
||||
if (header->max_score != FLAC_HEADER_NOT_SCORED_YET)
|
||||
return header->max_score;
|
||||
|
||||
/* Modify the base score with changes from the last output header */
|
||||
if (fpc->last_fi_valid) {
|
||||
/* Silence the log since this will be repeated if selected */
|
||||
base_score -= check_header_fi_mismatch(fpc, &fpc->last_fi, &header->fi,
|
||||
AV_LOG_DEBUG);
|
||||
}
|
||||
|
||||
header->max_score = base_score;
|
||||
|
||||
/* Check and compute the children's scores. */
|
||||
child = header->next;
|
||||
for (dist = 0; dist < FLAC_MAX_SEQUENTIAL_HEADERS && child; dist++) {
|
||||
/* Look at the child's frame header info and penalize suspicious
|
||||
changes between the headers. */
|
||||
if (header->link_penalty[dist] == FLAC_HEADER_NOT_PENALIZED_YET) {
|
||||
header->link_penalty[dist] = check_header_mismatch(fpc, header,
|
||||
child, AV_LOG_DEBUG);
|
||||
}
|
||||
child_score = score_header(fpc, child) - header->link_penalty[dist];
|
||||
|
||||
if (FLAC_HEADER_BASE_SCORE + child_score > header->max_score) {
|
||||
/* Keep the child because the frame scoring is dynamic. */
|
||||
header->best_child = child;
|
||||
header->max_score = base_score + child_score;
|
||||
}
|
||||
child = child->next;
|
||||
}
|
||||
|
||||
return header->max_score;
|
||||
}
|
||||
|
||||
static void score_sequences(FLACParseContext *fpc)
|
||||
{
|
||||
FLACHeaderMarker *curr;
|
||||
int best_score = 0;//FLAC_HEADER_NOT_SCORED_YET;
|
||||
/* First pass to clear all old scores. */
|
||||
for (curr = fpc->headers; curr; curr = curr->next)
|
||||
curr->max_score = FLAC_HEADER_NOT_SCORED_YET;
|
||||
|
||||
/* Do a second pass to score them all. */
|
||||
for (curr = fpc->headers; curr; curr = curr->next) {
|
||||
if (score_header(fpc, curr) > best_score) {
|
||||
fpc->best_header = curr;
|
||||
best_score = curr->max_score;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int get_best_header(FLACParseContext* fpc, const uint8_t **poutbuf,
|
||||
int *poutbuf_size)
|
||||
{
|
||||
FLACHeaderMarker *header = fpc->best_header;
|
||||
FLACHeaderMarker *child = header->best_child;
|
||||
if (!child) {
|
||||
*poutbuf_size = av_fifo_size(fpc->fifo_buf) - header->offset;
|
||||
} else {
|
||||
*poutbuf_size = child->offset - header->offset;
|
||||
|
||||
/* If the child has suspicious changes, log them */
|
||||
check_header_mismatch(fpc, header, child, 0);
|
||||
}
|
||||
|
||||
if (header->fi.channels != fpc->avctx->channels ||
|
||||
!fpc->avctx->channel_layout) {
|
||||
fpc->avctx->channels = header->fi.channels;
|
||||
ff_flac_set_channel_layout(fpc->avctx);
|
||||
}
|
||||
fpc->avctx->sample_rate = header->fi.samplerate;
|
||||
fpc->pc->duration = header->fi.blocksize;
|
||||
*poutbuf = flac_fifo_read_wrap(fpc, header->offset, *poutbuf_size,
|
||||
&fpc->wrap_buf,
|
||||
&fpc->wrap_buf_allocated_size);
|
||||
|
||||
|
||||
if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
|
||||
if (header->fi.is_var_size)
|
||||
fpc->pc->pts = header->fi.frame_or_sample_num;
|
||||
else if (header->best_child)
|
||||
fpc->pc->pts = header->fi.frame_or_sample_num * header->fi.blocksize;
|
||||
}
|
||||
|
||||
fpc->best_header_valid = 0;
|
||||
fpc->last_fi_valid = 1;
|
||||
fpc->last_fi = header->fi;
|
||||
|
||||
/* Return the negative overread index so the client can compute pos.
|
||||
This should be the amount overread to the beginning of the child */
|
||||
if (child)
|
||||
return child->offset - av_fifo_size(fpc->fifo_buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
|
||||
const uint8_t **poutbuf, int *poutbuf_size,
|
||||
const uint8_t *buf, int buf_size)
|
||||
{
|
||||
FLACParseContext *fpc = s->priv_data;
|
||||
FLACHeaderMarker *curr;
|
||||
int nb_headers;
|
||||
const uint8_t *read_end = buf;
|
||||
const uint8_t *read_start = buf;
|
||||
|
||||
if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) {
|
||||
FLACFrameInfo fi;
|
||||
if (frame_header_is_valid(avctx, buf, &fi)) {
|
||||
s->duration = fi.blocksize;
|
||||
if (!avctx->sample_rate)
|
||||
avctx->sample_rate = fi.samplerate;
|
||||
if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
|
||||
fpc->pc->pts = fi.frame_or_sample_num;
|
||||
if (!fi.is_var_size)
|
||||
fpc->pc->pts *= fi.blocksize;
|
||||
}
|
||||
}
|
||||
*poutbuf = buf;
|
||||
*poutbuf_size = buf_size;
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
fpc->avctx = avctx;
|
||||
if (fpc->best_header_valid)
|
||||
return get_best_header(fpc, poutbuf, poutbuf_size);
|
||||
|
||||
/* If a best_header was found last call remove it with the buffer data. */
|
||||
if (fpc->best_header && fpc->best_header->best_child) {
|
||||
FLACHeaderMarker *temp;
|
||||
FLACHeaderMarker *best_child = fpc->best_header->best_child;
|
||||
|
||||
/* Remove headers in list until the end of the best_header. */
|
||||
for (curr = fpc->headers; curr != best_child; curr = temp) {
|
||||
if (curr != fpc->best_header) {
|
||||
av_log(avctx, AV_LOG_DEBUG,
|
||||
"dropping low score %i frame header from offset %i to %i\n",
|
||||
curr->max_score, curr->offset, curr->next->offset);
|
||||
}
|
||||
temp = curr->next;
|
||||
av_freep(&curr->link_penalty);
|
||||
av_free(curr);
|
||||
fpc->nb_headers_buffered--;
|
||||
}
|
||||
/* Release returned data from ring buffer. */
|
||||
av_fifo_drain(fpc->fifo_buf, best_child->offset);
|
||||
|
||||
/* Fix the offset for the headers remaining to match the new buffer. */
|
||||
for (curr = best_child->next; curr; curr = curr->next)
|
||||
curr->offset -= best_child->offset;
|
||||
|
||||
fpc->nb_headers_buffered--;
|
||||
best_child->offset = 0;
|
||||
fpc->headers = best_child;
|
||||
if (fpc->nb_headers_buffered >= FLAC_MIN_HEADERS) {
|
||||
fpc->best_header = best_child;
|
||||
return get_best_header(fpc, poutbuf, poutbuf_size);
|
||||
}
|
||||
fpc->best_header = NULL;
|
||||
} else if (fpc->best_header) {
|
||||
/* No end frame no need to delete the buffer; probably eof */
|
||||
FLACHeaderMarker *temp;
|
||||
|
||||
for (curr = fpc->headers; curr != fpc->best_header; curr = temp) {
|
||||
temp = curr->next;
|
||||
av_freep(&curr->link_penalty);
|
||||
av_free(curr);
|
||||
}
|
||||
fpc->headers = fpc->best_header->next;
|
||||
av_freep(&fpc->best_header->link_penalty);
|
||||
av_freep(&fpc->best_header);
|
||||
}
|
||||
|
||||
/* Find and score new headers. */
|
||||
/* buf_size is to zero when padding, so check for this since we do */
|
||||
/* not want to try to read more input once we have found the end. */
|
||||
/* Note that as (non-modified) parameters, buf can be non-NULL, */
|
||||
/* while buf_size is 0. */
|
||||
while ((buf && buf_size && read_end < buf + buf_size &&
|
||||
fpc->nb_headers_buffered < FLAC_MIN_HEADERS)
|
||||
|| ((!buf || !buf_size) && !fpc->end_padded)) {
|
||||
int start_offset;
|
||||
|
||||
/* Pad the end once if EOF, to check the final region for headers. */
|
||||
if (!buf || !buf_size) {
|
||||
fpc->end_padded = 1;
|
||||
buf_size = MAX_FRAME_HEADER_SIZE;
|
||||
read_end = read_start + MAX_FRAME_HEADER_SIZE;
|
||||
} else {
|
||||
/* The maximum read size is the upper-bound of what the parser
|
||||
needs to have the required number of frames buffered */
|
||||
int nb_desired = FLAC_MIN_HEADERS - fpc->nb_headers_buffered + 1;
|
||||
read_end = read_end + FFMIN(buf + buf_size - read_end,
|
||||
nb_desired * FLAC_AVG_FRAME_SIZE);
|
||||
}
|
||||
|
||||
if (!av_fifo_space(fpc->fifo_buf) &&
|
||||
av_fifo_size(fpc->fifo_buf) / FLAC_AVG_FRAME_SIZE >
|
||||
fpc->nb_headers_buffered * 20) {
|
||||
/* There is less than one valid flac header buffered for 20 headers
|
||||
* buffered. Therefore the fifo is most likely filled with invalid
|
||||
* data and the input is not a flac file. */
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
/* Fill the buffer. */
|
||||
if ( av_fifo_space(fpc->fifo_buf) < read_end - read_start
|
||||
&& av_fifo_realloc2(fpc->fifo_buf, (read_end - read_start) + 2*av_fifo_size(fpc->fifo_buf)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"couldn't reallocate buffer of size %"PTRDIFF_SPECIFIER"\n",
|
||||
(read_end - read_start) + av_fifo_size(fpc->fifo_buf));
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
if (buf && buf_size) {
|
||||
av_fifo_generic_write(fpc->fifo_buf, (void*) read_start,
|
||||
read_end - read_start, NULL);
|
||||
} else {
|
||||
int8_t pad[MAX_FRAME_HEADER_SIZE] = { 0 };
|
||||
av_fifo_generic_write(fpc->fifo_buf, (void*) pad, sizeof(pad), NULL);
|
||||
}
|
||||
|
||||
/* Tag headers and update sequences. */
|
||||
start_offset = av_fifo_size(fpc->fifo_buf) -
|
||||
((read_end - read_start) + (MAX_FRAME_HEADER_SIZE - 1));
|
||||
start_offset = FFMAX(0, start_offset);
|
||||
nb_headers = find_new_headers(fpc, start_offset);
|
||||
|
||||
if (nb_headers < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"find_new_headers couldn't allocate FLAC header\n");
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
fpc->nb_headers_buffered = nb_headers;
|
||||
/* Wait till FLAC_MIN_HEADERS to output a valid frame. */
|
||||
if (!fpc->end_padded && fpc->nb_headers_buffered < FLAC_MIN_HEADERS) {
|
||||
if (buf && read_end < buf + buf_size) {
|
||||
read_start = read_end;
|
||||
continue;
|
||||
} else {
|
||||
goto handle_error;
|
||||
}
|
||||
}
|
||||
|
||||
/* If headers found, update the scores since we have longer chains. */
|
||||
if (fpc->end_padded || fpc->nb_headers_found)
|
||||
score_sequences(fpc);
|
||||
|
||||
/* restore the state pre-padding */
|
||||
if (fpc->end_padded) {
|
||||
int warp = fpc->fifo_buf->wptr - fpc->fifo_buf->buffer < MAX_FRAME_HEADER_SIZE;
|
||||
/* HACK: drain the tail of the fifo */
|
||||
fpc->fifo_buf->wptr -= MAX_FRAME_HEADER_SIZE;
|
||||
fpc->fifo_buf->wndx -= MAX_FRAME_HEADER_SIZE;
|
||||
if (warp) {
|
||||
fpc->fifo_buf->wptr += fpc->fifo_buf->end -
|
||||
fpc->fifo_buf->buffer;
|
||||
}
|
||||
buf_size = 0;
|
||||
read_start = read_end = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
for (curr = fpc->headers; curr; curr = curr->next) {
|
||||
if (curr->max_score > 0 &&
|
||||
(!fpc->best_header || curr->max_score > fpc->best_header->max_score)) {
|
||||
fpc->best_header = curr;
|
||||
}
|
||||
}
|
||||
|
||||
if (fpc->best_header) {
|
||||
fpc->best_header_valid = 1;
|
||||
if (fpc->best_header->offset > 0) {
|
||||
/* Output a junk frame. */
|
||||
av_log(avctx, AV_LOG_DEBUG, "Junk frame till offset %i\n",
|
||||
fpc->best_header->offset);
|
||||
|
||||
/* Set duration to 0. It is unknown or invalid in a junk frame. */
|
||||
s->duration = 0;
|
||||
*poutbuf_size = fpc->best_header->offset;
|
||||
*poutbuf = flac_fifo_read_wrap(fpc, 0, *poutbuf_size,
|
||||
&fpc->wrap_buf,
|
||||
&fpc->wrap_buf_allocated_size);
|
||||
return buf_size ? (read_end - buf) : (fpc->best_header->offset -
|
||||
av_fifo_size(fpc->fifo_buf));
|
||||
}
|
||||
if (!buf_size)
|
||||
return get_best_header(fpc, poutbuf, poutbuf_size);
|
||||
}
|
||||
|
||||
handle_error:
|
||||
*poutbuf = NULL;
|
||||
*poutbuf_size = 0;
|
||||
return buf_size ? read_end - buf : 0;
|
||||
}
|
||||
|
||||
static av_cold int flac_parse_init(AVCodecParserContext *c)
|
||||
{
|
||||
FLACParseContext *fpc = c->priv_data;
|
||||
fpc->pc = c;
|
||||
/* There will generally be FLAC_MIN_HEADERS buffered in the fifo before
|
||||
it drains. This is allocated early to avoid slow reallocation. */
|
||||
fpc->fifo_buf = av_fifo_alloc_array(FLAC_MIN_HEADERS + 3, FLAC_AVG_FRAME_SIZE);
|
||||
if (!fpc->fifo_buf) {
|
||||
av_log(fpc->avctx, AV_LOG_ERROR,
|
||||
"couldn't allocate fifo_buf\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void flac_parse_close(AVCodecParserContext *c)
|
||||
{
|
||||
FLACParseContext *fpc = c->priv_data;
|
||||
FLACHeaderMarker *curr = fpc->headers, *temp;
|
||||
|
||||
while (curr) {
|
||||
temp = curr->next;
|
||||
av_freep(&curr->link_penalty);
|
||||
av_free(curr);
|
||||
curr = temp;
|
||||
}
|
||||
av_fifo_freep(&fpc->fifo_buf);
|
||||
av_freep(&fpc->wrap_buf);
|
||||
}
|
||||
|
||||
AVCodecParser ff_flac_parser = {
|
||||
.codec_ids = { AV_CODEC_ID_FLAC },
|
||||
.priv_data_size = sizeof(FLACParseContext),
|
||||
.parser_init = flac_parse_init,
|
||||
.parser_parse = flac_parse,
|
||||
.parser_close = flac_parse_close,
|
||||
};
|
||||
33
media/ffvpx/libavcodec/flacdata.c
Normal file
33
media/ffvpx/libavcodec/flacdata.c
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* FLAC data
|
||||
* Copyright (c) 2003 Alex Beregszaszi
|
||||
*
|
||||
* 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 "internal.h"
|
||||
|
||||
const int ff_flac_sample_rate_table[16] =
|
||||
{ 0,
|
||||
88200, 176400, 192000,
|
||||
8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
|
||||
0, 0, 0, 0 };
|
||||
|
||||
const int32_t ff_flac_blocksize_table[16] = {
|
||||
0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
|
||||
256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
|
||||
};
|
||||
31
media/ffvpx/libavcodec/flacdata.h
Normal file
31
media/ffvpx/libavcodec/flacdata.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* FLAC data header
|
||||
* Copyright (c) 2003 Alex Beregszaszi
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FLACDATA_H
|
||||
#define AVCODEC_FLACDATA_H
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
extern const int ff_flac_sample_rate_table[16];
|
||||
|
||||
extern const int32_t ff_flac_blocksize_table[16];
|
||||
|
||||
#endif /* AVCODEC_FLACDATA_H */
|
||||
677
media/ffvpx/libavcodec/flacdec.c
Normal file
677
media/ffvpx/libavcodec/flacdec.c
Normal file
|
|
@ -0,0 +1,677 @@
|
|||
/*
|
||||
* FLAC (Free Lossless Audio Codec) decoder
|
||||
* Copyright (c) 2003 Alex Beregszaszi
|
||||
*
|
||||
* 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
|
||||
* FLAC (Free Lossless Audio Codec) decoder
|
||||
* @author Alex Beregszaszi
|
||||
* @see http://flac.sourceforge.net/
|
||||
*
|
||||
* This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
|
||||
* through, starting from the initial 'fLaC' signature; or by passing the
|
||||
* 34-byte streaminfo structure through avctx->extradata[_size] followed
|
||||
* by data starting with the 0xFFF8 marker.
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/crc.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "get_bits.h"
|
||||
#include "bytestream.h"
|
||||
#include "golomb.h"
|
||||
#include "flac.h"
|
||||
#include "flacdata.h"
|
||||
#include "flacdsp.h"
|
||||
#include "thread.h"
|
||||
#include "unary.h"
|
||||
|
||||
|
||||
typedef struct FLACContext {
|
||||
AVClass *class;
|
||||
struct FLACStreaminfo flac_stream_info;
|
||||
|
||||
AVCodecContext *avctx; ///< parent AVCodecContext
|
||||
GetBitContext gb; ///< GetBitContext initialized to start at the current frame
|
||||
|
||||
int blocksize; ///< number of samples in the current frame
|
||||
int sample_shift; ///< shift required to make output samples 16-bit or 32-bit
|
||||
int ch_mode; ///< channel decorrelation type in the current frame
|
||||
int got_streaminfo; ///< indicates if the STREAMINFO has been read
|
||||
|
||||
int32_t *decoded[FLAC_MAX_CHANNELS]; ///< decoded samples
|
||||
uint8_t *decoded_buffer;
|
||||
unsigned int decoded_buffer_size;
|
||||
int buggy_lpc; ///< use workaround for old lavc encoded files
|
||||
|
||||
FLACDSPContext dsp;
|
||||
} FLACContext;
|
||||
|
||||
static int allocate_buffers(FLACContext *s);
|
||||
|
||||
static void flac_set_bps(FLACContext *s)
|
||||
{
|
||||
enum AVSampleFormat req = s->avctx->request_sample_fmt;
|
||||
int need32 = s->flac_stream_info.bps > 16;
|
||||
int want32 = av_get_bytes_per_sample(req) > 2;
|
||||
int planar = av_sample_fmt_is_planar(req);
|
||||
|
||||
if (need32 || want32) {
|
||||
if (planar)
|
||||
s->avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
|
||||
else
|
||||
s->avctx->sample_fmt = AV_SAMPLE_FMT_S32;
|
||||
s->sample_shift = 32 - s->flac_stream_info.bps;
|
||||
} else {
|
||||
if (planar)
|
||||
s->avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
|
||||
else
|
||||
s->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||
s->sample_shift = 16 - s->flac_stream_info.bps;
|
||||
}
|
||||
}
|
||||
|
||||
static av_cold int flac_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
enum FLACExtradataFormat format;
|
||||
uint8_t *streaminfo;
|
||||
int ret;
|
||||
FLACContext *s = avctx->priv_data;
|
||||
s->avctx = avctx;
|
||||
|
||||
/* for now, the raw FLAC header is allowed to be passed to the decoder as
|
||||
frame data instead of extradata. */
|
||||
if (!avctx->extradata)
|
||||
return 0;
|
||||
|
||||
if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo))
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
/* initialize based on the demuxer-supplied streamdata header */
|
||||
ff_flac_parse_streaminfo(avctx, &s->flac_stream_info, streaminfo);
|
||||
ret = allocate_buffers(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
flac_set_bps(s);
|
||||
ff_flacdsp_init(&s->dsp, avctx->sample_fmt,
|
||||
s->flac_stream_info.channels, s->flac_stream_info.bps);
|
||||
s->got_streaminfo = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s)
|
||||
{
|
||||
av_log(avctx, AV_LOG_DEBUG, " Max Blocksize: %d\n", s->max_blocksize);
|
||||
av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize);
|
||||
av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
|
||||
av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
|
||||
av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
|
||||
}
|
||||
|
||||
static int allocate_buffers(FLACContext *s)
|
||||
{
|
||||
int buf_size;
|
||||
int ret;
|
||||
|
||||
av_assert0(s->flac_stream_info.max_blocksize);
|
||||
|
||||
buf_size = av_samples_get_buffer_size(NULL, s->flac_stream_info.channels,
|
||||
s->flac_stream_info.max_blocksize,
|
||||
AV_SAMPLE_FMT_S32P, 0);
|
||||
if (buf_size < 0)
|
||||
return buf_size;
|
||||
|
||||
av_fast_malloc(&s->decoded_buffer, &s->decoded_buffer_size, buf_size);
|
||||
if (!s->decoded_buffer)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
ret = av_samples_fill_arrays((uint8_t **)s->decoded, NULL,
|
||||
s->decoded_buffer,
|
||||
s->flac_stream_info.channels,
|
||||
s->flac_stream_info.max_blocksize,
|
||||
AV_SAMPLE_FMT_S32P, 0);
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the STREAMINFO from an inline header.
|
||||
* @param s the flac decoding context
|
||||
* @param buf input buffer, starting with the "fLaC" marker
|
||||
* @param buf_size buffer size
|
||||
* @return non-zero if metadata is invalid
|
||||
*/
|
||||
static int parse_streaminfo(FLACContext *s, const uint8_t *buf, int buf_size)
|
||||
{
|
||||
int metadata_type, metadata_size, ret;
|
||||
|
||||
if (buf_size < FLAC_STREAMINFO_SIZE+8) {
|
||||
/* need more data */
|
||||
return 0;
|
||||
}
|
||||
flac_parse_block_header(&buf[4], NULL, &metadata_type, &metadata_size);
|
||||
if (metadata_type != FLAC_METADATA_TYPE_STREAMINFO ||
|
||||
metadata_size != FLAC_STREAMINFO_SIZE) {
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
ff_flac_parse_streaminfo(s->avctx, &s->flac_stream_info, &buf[8]);
|
||||
ret = allocate_buffers(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
flac_set_bps(s);
|
||||
ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt,
|
||||
s->flac_stream_info.channels, s->flac_stream_info.bps);
|
||||
s->got_streaminfo = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the size of an inline header.
|
||||
* @param buf input buffer, starting with the "fLaC" marker
|
||||
* @param buf_size buffer size
|
||||
* @return number of bytes in the header, or 0 if more data is needed
|
||||
*/
|
||||
static int get_metadata_size(const uint8_t *buf, int buf_size)
|
||||
{
|
||||
int metadata_last, metadata_size;
|
||||
const uint8_t *buf_end = buf + buf_size;
|
||||
|
||||
buf += 4;
|
||||
do {
|
||||
if (buf_end - buf < 4)
|
||||
return 0;
|
||||
flac_parse_block_header(buf, &metadata_last, NULL, &metadata_size);
|
||||
buf += 4;
|
||||
if (buf_end - buf < metadata_size) {
|
||||
/* need more data in order to read the complete header */
|
||||
return 0;
|
||||
}
|
||||
buf += metadata_size;
|
||||
} while (!metadata_last);
|
||||
|
||||
return buf_size - (buf_end - buf);
|
||||
}
|
||||
|
||||
static int decode_residuals(FLACContext *s, int32_t *decoded, int pred_order)
|
||||
{
|
||||
int i, tmp, partition, method_type, rice_order;
|
||||
int rice_bits, rice_esc;
|
||||
int samples;
|
||||
|
||||
method_type = get_bits(&s->gb, 2);
|
||||
if (method_type > 1) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n",
|
||||
method_type);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
rice_order = get_bits(&s->gb, 4);
|
||||
|
||||
samples= s->blocksize >> rice_order;
|
||||
if (samples << rice_order != s->blocksize) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid rice order: %i blocksize %i\n",
|
||||
rice_order, s->blocksize);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (pred_order > samples) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n",
|
||||
pred_order, samples);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
rice_bits = 4 + method_type;
|
||||
rice_esc = (1 << rice_bits) - 1;
|
||||
|
||||
decoded += pred_order;
|
||||
i= pred_order;
|
||||
for (partition = 0; partition < (1 << rice_order); partition++) {
|
||||
tmp = get_bits(&s->gb, rice_bits);
|
||||
if (tmp == rice_esc) {
|
||||
tmp = get_bits(&s->gb, 5);
|
||||
for (; i < samples; i++)
|
||||
*decoded++ = get_sbits_long(&s->gb, tmp);
|
||||
} else {
|
||||
for (; i < samples; i++) {
|
||||
*decoded++ = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
|
||||
}
|
||||
}
|
||||
i= 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_subframe_fixed(FLACContext *s, int32_t *decoded,
|
||||
int pred_order, int bps)
|
||||
{
|
||||
const int blocksize = s->blocksize;
|
||||
int av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d), i;
|
||||
int ret;
|
||||
|
||||
/* warm up samples */
|
||||
for (i = 0; i < pred_order; i++) {
|
||||
decoded[i] = get_sbits_long(&s->gb, bps);
|
||||
}
|
||||
|
||||
if ((ret = decode_residuals(s, decoded, pred_order)) < 0)
|
||||
return ret;
|
||||
|
||||
if (pred_order > 0)
|
||||
a = decoded[pred_order-1];
|
||||
if (pred_order > 1)
|
||||
b = a - decoded[pred_order-2];
|
||||
if (pred_order > 2)
|
||||
c = b - decoded[pred_order-2] + decoded[pred_order-3];
|
||||
if (pred_order > 3)
|
||||
d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4];
|
||||
|
||||
switch (pred_order) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
for (i = pred_order; i < blocksize; i++)
|
||||
decoded[i] = a += decoded[i];
|
||||
break;
|
||||
case 2:
|
||||
for (i = pred_order; i < blocksize; i++)
|
||||
decoded[i] = a += b += decoded[i];
|
||||
break;
|
||||
case 3:
|
||||
for (i = pred_order; i < blocksize; i++)
|
||||
decoded[i] = a += b += c += decoded[i];
|
||||
break;
|
||||
case 4:
|
||||
for (i = pred_order; i < blocksize; i++)
|
||||
decoded[i] = a += b += c += d += decoded[i];
|
||||
break;
|
||||
default:
|
||||
av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void lpc_analyze_remodulate(int32_t *decoded, const int coeffs[32],
|
||||
int order, int qlevel, int len, int bps)
|
||||
{
|
||||
int i, j;
|
||||
int ebps = 1 << (bps-1);
|
||||
unsigned sigma = 0;
|
||||
|
||||
for (i = order; i < len; i++)
|
||||
sigma |= decoded[i] + ebps;
|
||||
|
||||
if (sigma < 2*ebps)
|
||||
return;
|
||||
|
||||
for (i = len - 1; i >= order; i--) {
|
||||
int64_t p = 0;
|
||||
for (j = 0; j < order; j++)
|
||||
p += coeffs[j] * (int64_t)decoded[i-order+j];
|
||||
decoded[i] -= p >> qlevel;
|
||||
}
|
||||
for (i = order; i < len; i++, decoded++) {
|
||||
int32_t p = 0;
|
||||
for (j = 0; j < order; j++)
|
||||
p += coeffs[j] * (uint32_t)decoded[j];
|
||||
decoded[j] += p >> qlevel;
|
||||
}
|
||||
}
|
||||
|
||||
static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order,
|
||||
int bps)
|
||||
{
|
||||
int i, ret;
|
||||
int coeff_prec, qlevel;
|
||||
int coeffs[32];
|
||||
|
||||
/* warm up samples */
|
||||
for (i = 0; i < pred_order; i++) {
|
||||
decoded[i] = get_sbits_long(&s->gb, bps);
|
||||
}
|
||||
|
||||
coeff_prec = get_bits(&s->gb, 4) + 1;
|
||||
if (coeff_prec == 16) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
qlevel = get_sbits(&s->gb, 5);
|
||||
if (qlevel < 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n",
|
||||
qlevel);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
for (i = 0; i < pred_order; i++) {
|
||||
coeffs[pred_order - i - 1] = get_sbits(&s->gb, coeff_prec);
|
||||
}
|
||||
|
||||
if ((ret = decode_residuals(s, decoded, pred_order)) < 0)
|
||||
return ret;
|
||||
|
||||
if ( ( s->buggy_lpc && s->flac_stream_info.bps <= 16)
|
||||
|| ( !s->buggy_lpc && bps <= 16
|
||||
&& bps + coeff_prec + av_log2(pred_order) <= 32)) {
|
||||
s->dsp.lpc16(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
||||
} else {
|
||||
s->dsp.lpc32(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
||||
if (s->flac_stream_info.bps <= 16)
|
||||
lpc_analyze_remodulate(decoded, coeffs, pred_order, qlevel, s->blocksize, bps);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int decode_subframe(FLACContext *s, int channel)
|
||||
{
|
||||
int32_t *decoded = s->decoded[channel];
|
||||
int type, wasted = 0;
|
||||
int bps = s->flac_stream_info.bps;
|
||||
int i, tmp, ret;
|
||||
|
||||
if (channel == 0) {
|
||||
if (s->ch_mode == FLAC_CHMODE_RIGHT_SIDE)
|
||||
bps++;
|
||||
} else {
|
||||
if (s->ch_mode == FLAC_CHMODE_LEFT_SIDE || s->ch_mode == FLAC_CHMODE_MID_SIDE)
|
||||
bps++;
|
||||
}
|
||||
|
||||
if (get_bits1(&s->gb)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
type = get_bits(&s->gb, 6);
|
||||
|
||||
if (get_bits1(&s->gb)) {
|
||||
int left = get_bits_left(&s->gb);
|
||||
if ( left <= 0 ||
|
||||
(left < bps && !show_bits_long(&s->gb, left)) ||
|
||||
!show_bits_long(&s->gb, bps)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR,
|
||||
"Invalid number of wasted bits > available bits (%d) - left=%d\n",
|
||||
bps, left);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
wasted = 1 + get_unary(&s->gb, 1, get_bits_left(&s->gb));
|
||||
bps -= wasted;
|
||||
}
|
||||
if (bps > 32) {
|
||||
avpriv_report_missing_feature(s->avctx, "Decorrelated bit depth > 32");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
//FIXME use av_log2 for types
|
||||
if (type == 0) {
|
||||
tmp = get_sbits_long(&s->gb, bps);
|
||||
for (i = 0; i < s->blocksize; i++)
|
||||
decoded[i] = tmp;
|
||||
} else if (type == 1) {
|
||||
for (i = 0; i < s->blocksize; i++)
|
||||
decoded[i] = get_sbits_long(&s->gb, bps);
|
||||
} else if ((type >= 8) && (type <= 12)) {
|
||||
if ((ret = decode_subframe_fixed(s, decoded, type & ~0x8, bps)) < 0)
|
||||
return ret;
|
||||
} else if (type >= 32) {
|
||||
if ((ret = decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps)) < 0)
|
||||
return ret;
|
||||
} else {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (wasted) {
|
||||
int i;
|
||||
for (i = 0; i < s->blocksize; i++)
|
||||
decoded[i] <<= wasted;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_frame(FLACContext *s)
|
||||
{
|
||||
int i, ret;
|
||||
GetBitContext *gb = &s->gb;
|
||||
FLACFrameInfo fi;
|
||||
|
||||
if ((ret = ff_flac_decode_frame_header(s->avctx, gb, &fi, 0)) < 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid frame header\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ( s->flac_stream_info.channels
|
||||
&& fi.channels != s->flac_stream_info.channels
|
||||
&& s->got_streaminfo) {
|
||||
s->flac_stream_info.channels = s->avctx->channels = fi.channels;
|
||||
ff_flac_set_channel_layout(s->avctx);
|
||||
ret = allocate_buffers(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
s->flac_stream_info.channels = s->avctx->channels = fi.channels;
|
||||
if (!s->avctx->channel_layout)
|
||||
ff_flac_set_channel_layout(s->avctx);
|
||||
s->ch_mode = fi.ch_mode;
|
||||
|
||||
if (!s->flac_stream_info.bps && !fi.bps) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "bps not found in STREAMINFO or frame header\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (!fi.bps) {
|
||||
fi.bps = s->flac_stream_info.bps;
|
||||
} else if (s->flac_stream_info.bps && fi.bps != s->flac_stream_info.bps) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "switching bps mid-stream is not "
|
||||
"supported\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (!s->flac_stream_info.bps) {
|
||||
s->flac_stream_info.bps = s->avctx->bits_per_raw_sample = fi.bps;
|
||||
flac_set_bps(s);
|
||||
}
|
||||
|
||||
if (!s->flac_stream_info.max_blocksize)
|
||||
s->flac_stream_info.max_blocksize = FLAC_MAX_BLOCKSIZE;
|
||||
if (fi.blocksize > s->flac_stream_info.max_blocksize) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", fi.blocksize,
|
||||
s->flac_stream_info.max_blocksize);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
s->blocksize = fi.blocksize;
|
||||
|
||||
if (!s->flac_stream_info.samplerate && !fi.samplerate) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "sample rate not found in STREAMINFO"
|
||||
" or frame header\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (fi.samplerate == 0)
|
||||
fi.samplerate = s->flac_stream_info.samplerate;
|
||||
s->flac_stream_info.samplerate = s->avctx->sample_rate = fi.samplerate;
|
||||
|
||||
if (!s->got_streaminfo) {
|
||||
ret = allocate_buffers(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
s->got_streaminfo = 1;
|
||||
dump_headers(s->avctx, &s->flac_stream_info);
|
||||
}
|
||||
ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt,
|
||||
s->flac_stream_info.channels, s->flac_stream_info.bps);
|
||||
|
||||
// dump_headers(s->avctx, &s->flac_stream_info);
|
||||
|
||||
/* subframes */
|
||||
for (i = 0; i < s->flac_stream_info.channels; i++) {
|
||||
if ((ret = decode_subframe(s, i)) < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
align_get_bits(gb);
|
||||
|
||||
/* frame footer */
|
||||
skip_bits(gb, 16); /* data crc */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int flac_decode_frame(AVCodecContext *avctx, void *data,
|
||||
int *got_frame_ptr, AVPacket *avpkt)
|
||||
{
|
||||
AVFrame *frame = data;
|
||||
ThreadFrame tframe = { .f = data };
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
FLACContext *s = avctx->priv_data;
|
||||
int bytes_read = 0;
|
||||
int ret;
|
||||
|
||||
*got_frame_ptr = 0;
|
||||
|
||||
if (s->flac_stream_info.max_framesize == 0) {
|
||||
s->flac_stream_info.max_framesize =
|
||||
ff_flac_get_max_frame_size(s->flac_stream_info.max_blocksize ? s->flac_stream_info.max_blocksize : FLAC_MAX_BLOCKSIZE,
|
||||
FLAC_MAX_CHANNELS, 32);
|
||||
}
|
||||
|
||||
if (buf_size > 5 && !memcmp(buf, "\177FLAC", 5)) {
|
||||
av_log(s->avctx, AV_LOG_DEBUG, "skipping flac header packet 1\n");
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
if (buf_size > 0 && (*buf & 0x7F) == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
|
||||
av_log(s->avctx, AV_LOG_DEBUG, "skipping vorbis comment\n");
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
/* check that there is at least the smallest decodable amount of data.
|
||||
this amount corresponds to the smallest valid FLAC frame possible.
|
||||
FF F8 69 02 00 00 9A 00 00 34 46 */
|
||||
if (buf_size < FLAC_MIN_FRAME_SIZE)
|
||||
return buf_size;
|
||||
|
||||
/* check for inline header */
|
||||
if (AV_RB32(buf) == MKBETAG('f','L','a','C')) {
|
||||
if (!s->got_streaminfo && (ret = parse_streaminfo(s, buf, buf_size))) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid header\n");
|
||||
return ret;
|
||||
}
|
||||
return get_metadata_size(buf, buf_size);
|
||||
}
|
||||
|
||||
/* decode frame */
|
||||
if ((ret = init_get_bits8(&s->gb, buf, buf_size)) < 0)
|
||||
return ret;
|
||||
if ((ret = decode_frame(s)) < 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n");
|
||||
return ret;
|
||||
}
|
||||
bytes_read = get_bits_count(&s->gb)/8;
|
||||
|
||||
if ((s->avctx->err_recognition & (AV_EF_CRCCHECK|AV_EF_COMPLIANT)) &&
|
||||
av_crc(av_crc_get_table(AV_CRC_16_ANSI),
|
||||
0, buf, bytes_read)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "CRC error at PTS %"PRId64"\n", avpkt->pts);
|
||||
if (s->avctx->err_recognition & AV_EF_EXPLODE)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* get output buffer */
|
||||
frame->nb_samples = s->blocksize;
|
||||
if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded,
|
||||
s->flac_stream_info.channels,
|
||||
s->blocksize, s->sample_shift);
|
||||
|
||||
if (bytes_read > buf_size) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", bytes_read - buf_size);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (bytes_read < buf_size) {
|
||||
av_log(s->avctx, AV_LOG_DEBUG, "underread: %d orig size: %d\n",
|
||||
buf_size - bytes_read, buf_size);
|
||||
}
|
||||
|
||||
*got_frame_ptr = 1;
|
||||
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
#if HAVE_THREADS
|
||||
static int init_thread_copy(AVCodecContext *avctx)
|
||||
{
|
||||
FLACContext *s = avctx->priv_data;
|
||||
s->decoded_buffer = NULL;
|
||||
s->decoded_buffer_size = 0;
|
||||
s->avctx = avctx;
|
||||
if (s->flac_stream_info.max_blocksize)
|
||||
return allocate_buffers(s);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static av_cold int flac_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
FLACContext *s = avctx->priv_data;
|
||||
|
||||
av_freep(&s->decoded_buffer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const AVOption options[] = {
|
||||
{ "use_buggy_lpc", "emulate old buggy lavc behavior", offsetof(FLACContext, buggy_lpc), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
static const AVClass flac_decoder_class = {
|
||||
"FLAC decoder",
|
||||
av_default_item_name,
|
||||
options,
|
||||
LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
AVCodec ff_flac_decoder = {
|
||||
.name = "flac",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
|
||||
.type = AVMEDIA_TYPE_AUDIO,
|
||||
.id = AV_CODEC_ID_FLAC,
|
||||
.priv_data_size = sizeof(FLACContext),
|
||||
.init = flac_decode_init,
|
||||
.close = flac_decode_close,
|
||||
.decode = flac_decode_frame,
|
||||
.init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
|
||||
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
|
||||
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
|
||||
AV_SAMPLE_FMT_S16P,
|
||||
AV_SAMPLE_FMT_S32,
|
||||
AV_SAMPLE_FMT_S32P,
|
||||
AV_SAMPLE_FMT_NONE },
|
||||
.priv_class = &flac_decoder_class,
|
||||
};
|
||||
130
media/ffvpx/libavcodec/flacdsp.c
Normal file
130
media/ffvpx/libavcodec/flacdsp.c
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
|
||||
*
|
||||
* 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 "libavutil/attributes.h"
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "flacdsp.h"
|
||||
#include "config.h"
|
||||
|
||||
#define SAMPLE_SIZE 16
|
||||
#define PLANAR 0
|
||||
#include "flacdsp_template.c"
|
||||
#include "flacdsp_lpc_template.c"
|
||||
|
||||
#undef PLANAR
|
||||
#define PLANAR 1
|
||||
#include "flacdsp_template.c"
|
||||
|
||||
#undef SAMPLE_SIZE
|
||||
#undef PLANAR
|
||||
#define SAMPLE_SIZE 32
|
||||
#define PLANAR 0
|
||||
#include "flacdsp_template.c"
|
||||
#include "flacdsp_lpc_template.c"
|
||||
|
||||
#undef PLANAR
|
||||
#define PLANAR 1
|
||||
#include "flacdsp_template.c"
|
||||
|
||||
static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32],
|
||||
int pred_order, int qlevel, int len)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = pred_order; i < len - 1; i += 2, decoded += 2) {
|
||||
int c = coeffs[0];
|
||||
int d = decoded[0];
|
||||
int s0 = 0, s1 = 0;
|
||||
for (j = 1; j < pred_order; j++) {
|
||||
s0 += c*d;
|
||||
d = decoded[j];
|
||||
s1 += c*d;
|
||||
c = coeffs[j];
|
||||
}
|
||||
s0 += c*d;
|
||||
d = decoded[j] += s0 >> qlevel;
|
||||
s1 += c*d;
|
||||
decoded[j + 1] += s1 >> qlevel;
|
||||
}
|
||||
if (i < len) {
|
||||
int sum = 0;
|
||||
for (j = 0; j < pred_order; j++)
|
||||
sum += coeffs[j] * decoded[j];
|
||||
decoded[j] += sum >> qlevel;
|
||||
}
|
||||
}
|
||||
|
||||
static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32],
|
||||
int pred_order, int qlevel, int len)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = pred_order; i < len; i++, decoded++) {
|
||||
int64_t sum = 0;
|
||||
for (j = 0; j < pred_order; j++)
|
||||
sum += (int64_t)coeffs[j] * decoded[j];
|
||||
decoded[j] += sum >> qlevel;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int channels,
|
||||
int bps)
|
||||
{
|
||||
c->lpc16 = flac_lpc_16_c;
|
||||
c->lpc32 = flac_lpc_32_c;
|
||||
c->lpc16_encode = flac_lpc_encode_c_16;
|
||||
c->lpc32_encode = flac_lpc_encode_c_32;
|
||||
|
||||
switch (fmt) {
|
||||
case AV_SAMPLE_FMT_S32:
|
||||
c->decorrelate[0] = flac_decorrelate_indep_c_32;
|
||||
c->decorrelate[1] = flac_decorrelate_ls_c_32;
|
||||
c->decorrelate[2] = flac_decorrelate_rs_c_32;
|
||||
c->decorrelate[3] = flac_decorrelate_ms_c_32;
|
||||
break;
|
||||
|
||||
case AV_SAMPLE_FMT_S32P:
|
||||
c->decorrelate[0] = flac_decorrelate_indep_c_32p;
|
||||
c->decorrelate[1] = flac_decorrelate_ls_c_32p;
|
||||
c->decorrelate[2] = flac_decorrelate_rs_c_32p;
|
||||
c->decorrelate[3] = flac_decorrelate_ms_c_32p;
|
||||
break;
|
||||
|
||||
case AV_SAMPLE_FMT_S16:
|
||||
c->decorrelate[0] = flac_decorrelate_indep_c_16;
|
||||
c->decorrelate[1] = flac_decorrelate_ls_c_16;
|
||||
c->decorrelate[2] = flac_decorrelate_rs_c_16;
|
||||
c->decorrelate[3] = flac_decorrelate_ms_c_16;
|
||||
break;
|
||||
|
||||
case AV_SAMPLE_FMT_S16P:
|
||||
c->decorrelate[0] = flac_decorrelate_indep_c_16p;
|
||||
c->decorrelate[1] = flac_decorrelate_ls_c_16p;
|
||||
c->decorrelate[2] = flac_decorrelate_rs_c_16p;
|
||||
c->decorrelate[3] = flac_decorrelate_ms_c_16p;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ARCH_ARM)
|
||||
ff_flacdsp_init_arm(c, fmt, channels, bps);
|
||||
if (ARCH_X86)
|
||||
ff_flacdsp_init_x86(c, fmt, channels, bps);
|
||||
}
|
||||
42
media/ffvpx/libavcodec/flacdsp.h
Normal file
42
media/ffvpx/libavcodec/flacdsp.h
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FLACDSP_H
|
||||
#define AVCODEC_FLACDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "libavutil/samplefmt.h"
|
||||
|
||||
typedef struct FLACDSPContext {
|
||||
void (*decorrelate[4])(uint8_t **out, int32_t **in, int channels,
|
||||
int len, int shift);
|
||||
void (*lpc16)(int32_t *samples, const int coeffs[32], int order,
|
||||
int qlevel, int len);
|
||||
void (*lpc32)(int32_t *samples, const int coeffs[32], int order,
|
||||
int qlevel, int len);
|
||||
void (*lpc16_encode)(int32_t *res, const int32_t *smp, int len, int order,
|
||||
const int32_t coefs[32], int shift);
|
||||
void (*lpc32_encode)(int32_t *res, const int32_t *smp, int len, int order,
|
||||
const int32_t coefs[32], int shift);
|
||||
} FLACDSPContext;
|
||||
|
||||
void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int channels, int bps);
|
||||
void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt, int channels, int bps);
|
||||
void ff_flacdsp_init_x86(FLACDSPContext *c, enum AVSampleFormat fmt, int channels, int bps);
|
||||
|
||||
#endif /* AVCODEC_FLACDSP_H */
|
||||
159
media/ffvpx/libavcodec/flacdsp_lpc_template.c
Normal file
159
media/ffvpx/libavcodec/flacdsp_lpc_template.c
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
* 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 <stdint.h>
|
||||
#include "libavutil/avutil.h"
|
||||
#include "mathops.h"
|
||||
|
||||
#undef FUNC
|
||||
#undef sum_type
|
||||
#undef MUL
|
||||
#undef CLIP
|
||||
#undef FSUF
|
||||
|
||||
#define FUNC(n) AV_JOIN(n ## _, SAMPLE_SIZE)
|
||||
|
||||
#if SAMPLE_SIZE == 32
|
||||
# define sum_type int64_t
|
||||
# define MUL(a, b) MUL64(a, b)
|
||||
# define CLIP(x) av_clipl_int32(x)
|
||||
#else
|
||||
# define sum_type int32_t
|
||||
# define MUL(a, b) ((a) * (b))
|
||||
# define CLIP(x) (x)
|
||||
#endif
|
||||
|
||||
#define LPC1(x) { \
|
||||
int c = coefs[(x)-1]; \
|
||||
p0 += MUL(c, s); \
|
||||
s = smp[i-(x)+1]; \
|
||||
p1 += MUL(c, s); \
|
||||
}
|
||||
|
||||
static av_always_inline void FUNC(lpc_encode_unrolled)(int32_t *res,
|
||||
const int32_t *smp, int len, int order,
|
||||
const int32_t *coefs, int shift, int big)
|
||||
{
|
||||
int i;
|
||||
for (i = order; i < len; i += 2) {
|
||||
int s = smp[i-order];
|
||||
sum_type p0 = 0, p1 = 0;
|
||||
if (big) {
|
||||
switch (order) {
|
||||
case 32: LPC1(32)
|
||||
case 31: LPC1(31)
|
||||
case 30: LPC1(30)
|
||||
case 29: LPC1(29)
|
||||
case 28: LPC1(28)
|
||||
case 27: LPC1(27)
|
||||
case 26: LPC1(26)
|
||||
case 25: LPC1(25)
|
||||
case 24: LPC1(24)
|
||||
case 23: LPC1(23)
|
||||
case 22: LPC1(22)
|
||||
case 21: LPC1(21)
|
||||
case 20: LPC1(20)
|
||||
case 19: LPC1(19)
|
||||
case 18: LPC1(18)
|
||||
case 17: LPC1(17)
|
||||
case 16: LPC1(16)
|
||||
case 15: LPC1(15)
|
||||
case 14: LPC1(14)
|
||||
case 13: LPC1(13)
|
||||
case 12: LPC1(12)
|
||||
case 11: LPC1(11)
|
||||
case 10: LPC1(10)
|
||||
case 9: LPC1( 9)
|
||||
LPC1( 8)
|
||||
LPC1( 7)
|
||||
LPC1( 6)
|
||||
LPC1( 5)
|
||||
LPC1( 4)
|
||||
LPC1( 3)
|
||||
LPC1( 2)
|
||||
LPC1( 1)
|
||||
}
|
||||
} else {
|
||||
switch (order) {
|
||||
case 8: LPC1( 8)
|
||||
case 7: LPC1( 7)
|
||||
case 6: LPC1( 6)
|
||||
case 5: LPC1( 5)
|
||||
case 4: LPC1( 4)
|
||||
case 3: LPC1( 3)
|
||||
case 2: LPC1( 2)
|
||||
case 1: LPC1( 1)
|
||||
}
|
||||
}
|
||||
res[i ] = smp[i ] - CLIP(p0 >> shift);
|
||||
res[i+1] = smp[i+1] - CLIP(p1 >> shift);
|
||||
}
|
||||
}
|
||||
|
||||
static void FUNC(flac_lpc_encode_c)(int32_t *res, const int32_t *smp, int len,
|
||||
int order, const int32_t *coefs, int shift)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < order; i++)
|
||||
res[i] = smp[i];
|
||||
#if CONFIG_SMALL
|
||||
for (i = order; i < len; i += 2) {
|
||||
int j;
|
||||
int s = smp[i];
|
||||
sum_type p0 = 0, p1 = 0;
|
||||
for (j = 0; j < order; j++) {
|
||||
int c = coefs[j];
|
||||
p1 += MUL(c, s);
|
||||
s = smp[i-j-1];
|
||||
p0 += MUL(c, s);
|
||||
}
|
||||
res[i ] = smp[i ] - CLIP(p0 >> shift);
|
||||
res[i+1] = smp[i+1] - CLIP(p1 >> shift);
|
||||
}
|
||||
#else
|
||||
switch (order) {
|
||||
case 1: FUNC(lpc_encode_unrolled)(res, smp, len, 1, coefs, shift, 0); break;
|
||||
case 2: FUNC(lpc_encode_unrolled)(res, smp, len, 2, coefs, shift, 0); break;
|
||||
case 3: FUNC(lpc_encode_unrolled)(res, smp, len, 3, coefs, shift, 0); break;
|
||||
case 4: FUNC(lpc_encode_unrolled)(res, smp, len, 4, coefs, shift, 0); break;
|
||||
case 5: FUNC(lpc_encode_unrolled)(res, smp, len, 5, coefs, shift, 0); break;
|
||||
case 6: FUNC(lpc_encode_unrolled)(res, smp, len, 6, coefs, shift, 0); break;
|
||||
case 7: FUNC(lpc_encode_unrolled)(res, smp, len, 7, coefs, shift, 0); break;
|
||||
case 8: FUNC(lpc_encode_unrolled)(res, smp, len, 8, coefs, shift, 0); break;
|
||||
default: FUNC(lpc_encode_unrolled)(res, smp, len, order, coefs, shift, 1); break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Comment for clarity/de-obfuscation.
|
||||
*
|
||||
* for (int i = order; i < len; i++) {
|
||||
* int32_t p = 0;
|
||||
* for (int j = 0; j < order; j++) {
|
||||
* int c = coefs[j];
|
||||
* int s = smp[(i-1)-j];
|
||||
* p += c*s;
|
||||
* }
|
||||
* res[i] = smp[i] - (p >> shift);
|
||||
* }
|
||||
*
|
||||
* The CONFIG_SMALL code above simplifies to this, in the case of SAMPLE_SIZE
|
||||
* not being equal to 32 (at the present time that means for 16-bit audio). The
|
||||
* code above does 2 samples per iteration. Commit bfdd5bc (made all the way
|
||||
* back in 2007) says that way is faster.
|
||||
*/
|
||||
103
media/ffvpx/libavcodec/flacdsp_template.c
Normal file
103
media/ffvpx/libavcodec/flacdsp_template.c
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
|
||||
*
|
||||
* 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 <stdint.h>
|
||||
#include "libavutil/avutil.h"
|
||||
|
||||
#undef FUNC
|
||||
#undef FSUF
|
||||
#undef sample
|
||||
#undef sample_type
|
||||
#undef OUT
|
||||
#undef S
|
||||
|
||||
#if SAMPLE_SIZE == 32
|
||||
# define sample_type int32_t
|
||||
#else
|
||||
# define sample_type int16_t
|
||||
#endif
|
||||
|
||||
#if PLANAR
|
||||
# define FSUF AV_JOIN(SAMPLE_SIZE, p)
|
||||
# define sample sample_type *
|
||||
# define OUT(n) n
|
||||
# define S(s, c, i) (s[c][i])
|
||||
#else
|
||||
# define FSUF SAMPLE_SIZE
|
||||
# define sample sample_type
|
||||
# define OUT(n) n[0]
|
||||
# define S(s, c, i) (*s++)
|
||||
#endif
|
||||
|
||||
#define FUNC(n) AV_JOIN(n ## _, FSUF)
|
||||
|
||||
static void FUNC(flac_decorrelate_indep_c)(uint8_t **out, int32_t **in,
|
||||
int channels, int len, int shift)
|
||||
{
|
||||
sample *samples = (sample *) OUT(out);
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < len; j++)
|
||||
for (i = 0; i < channels; i++)
|
||||
S(samples, i, j) = in[i][j] << shift;
|
||||
}
|
||||
|
||||
static void FUNC(flac_decorrelate_ls_c)(uint8_t **out, int32_t **in,
|
||||
int channels, int len, int shift)
|
||||
{
|
||||
sample *samples = (sample *) OUT(out);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
int a = in[0][i];
|
||||
int b = in[1][i];
|
||||
S(samples, 0, i) = a << shift;
|
||||
S(samples, 1, i) = (a - b) << shift;
|
||||
}
|
||||
}
|
||||
|
||||
static void FUNC(flac_decorrelate_rs_c)(uint8_t **out, int32_t **in,
|
||||
int channels, int len, int shift)
|
||||
{
|
||||
sample *samples = (sample *) OUT(out);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
int a = in[0][i];
|
||||
int b = in[1][i];
|
||||
S(samples, 0, i) = (a + b) << shift;
|
||||
S(samples, 1, i) = b << shift;
|
||||
}
|
||||
}
|
||||
|
||||
static void FUNC(flac_decorrelate_ms_c)(uint8_t **out, int32_t **in,
|
||||
int channels, int len, int shift)
|
||||
{
|
||||
sample *samples = (sample *) OUT(out);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
int a = in[0][i];
|
||||
int b = in[1][i];
|
||||
a -= b >> 1;
|
||||
S(samples, 0, i) = (a + b) << shift;
|
||||
S(samples, 1, i) = a << shift;
|
||||
}
|
||||
}
|
||||
30
media/ffvpx/libavcodec/frame_thread_encoder.h
Normal file
30
media/ffvpx/libavcodec/frame_thread_encoder.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FRAME_THREAD_ENCODER_H
|
||||
#define AVCODEC_FRAME_THREAD_ENCODER_H
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options);
|
||||
void ff_frame_thread_encoder_free(AVCodecContext *avctx);
|
||||
int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr);
|
||||
|
||||
#endif /* AVCODEC_FRAME_THREAD_ENCODER_H */
|
||||
587
media/ffvpx/libavcodec/get_bits.h
Normal file
587
media/ffvpx/libavcodec/get_bits.h
Normal file
|
|
@ -0,0 +1,587 @@
|
|||
/*
|
||||
* copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* bitstream reader API header.
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_GET_BITS_H
|
||||
#define AVCODEC_GET_BITS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "mathops.h"
|
||||
#include "vlc.h"
|
||||
|
||||
/*
|
||||
* Safe bitstream reading:
|
||||
* optionally, the get_bits API can check to ensure that we
|
||||
* don't read past input buffer boundaries. This is protected
|
||||
* with CONFIG_SAFE_BITSTREAM_READER at the global level, and
|
||||
* then below that with UNCHECKED_BITSTREAM_READER at the per-
|
||||
* decoder level. This means that decoders that check internally
|
||||
* can "#define UNCHECKED_BITSTREAM_READER 1" to disable
|
||||
* overread checks.
|
||||
* Boundary checking causes a minor performance penalty so for
|
||||
* applications that won't want/need this, it can be disabled
|
||||
* globally using "#define CONFIG_SAFE_BITSTREAM_READER 0".
|
||||
*/
|
||||
#ifndef UNCHECKED_BITSTREAM_READER
|
||||
#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
|
||||
#endif
|
||||
|
||||
typedef struct GetBitContext {
|
||||
const uint8_t *buffer, *buffer_end;
|
||||
int index;
|
||||
int size_in_bits;
|
||||
int size_in_bits_plus8;
|
||||
} GetBitContext;
|
||||
|
||||
/* Bitstream reader API docs:
|
||||
* name
|
||||
* arbitrary name which is used as prefix for the internal variables
|
||||
*
|
||||
* gb
|
||||
* getbitcontext
|
||||
*
|
||||
* OPEN_READER(name, gb)
|
||||
* load gb into local variables
|
||||
*
|
||||
* CLOSE_READER(name, gb)
|
||||
* store local vars in gb
|
||||
*
|
||||
* UPDATE_CACHE(name, gb)
|
||||
* Refill the internal cache from the bitstream.
|
||||
* After this call at least MIN_CACHE_BITS will be available.
|
||||
*
|
||||
* GET_CACHE(name, gb)
|
||||
* Will output the contents of the internal cache,
|
||||
* next bit is MSB of 32 or 64 bits (FIXME 64 bits).
|
||||
*
|
||||
* SHOW_UBITS(name, gb, num)
|
||||
* Will return the next num bits.
|
||||
*
|
||||
* SHOW_SBITS(name, gb, num)
|
||||
* Will return the next num bits and do sign extension.
|
||||
*
|
||||
* SKIP_BITS(name, gb, num)
|
||||
* Will skip over the next num bits.
|
||||
* Note, this is equivalent to SKIP_CACHE; SKIP_COUNTER.
|
||||
*
|
||||
* SKIP_CACHE(name, gb, num)
|
||||
* Will remove the next num bits from the cache (note SKIP_COUNTER
|
||||
* MUST be called before UPDATE_CACHE / CLOSE_READER).
|
||||
*
|
||||
* SKIP_COUNTER(name, gb, num)
|
||||
* Will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS).
|
||||
*
|
||||
* LAST_SKIP_BITS(name, gb, num)
|
||||
* Like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER.
|
||||
*
|
||||
* BITS_LEFT(name, gb)
|
||||
* Return the number of bits left
|
||||
*
|
||||
* For examples see get_bits, show_bits, skip_bits, get_vlc.
|
||||
*/
|
||||
|
||||
#ifdef LONG_BITSTREAM_READER
|
||||
# define MIN_CACHE_BITS 32
|
||||
#else
|
||||
# define MIN_CACHE_BITS 25
|
||||
#endif
|
||||
|
||||
#define OPEN_READER_NOSIZE(name, gb) \
|
||||
unsigned int name ## _index = (gb)->index; \
|
||||
unsigned int av_unused name ## _cache
|
||||
|
||||
#if UNCHECKED_BITSTREAM_READER
|
||||
#define OPEN_READER(name, gb) OPEN_READER_NOSIZE(name, gb)
|
||||
|
||||
#define BITS_AVAILABLE(name, gb) 1
|
||||
#else
|
||||
#define OPEN_READER(name, gb) \
|
||||
OPEN_READER_NOSIZE(name, gb); \
|
||||
unsigned int name ## _size_plus8 = (gb)->size_in_bits_plus8
|
||||
|
||||
#define BITS_AVAILABLE(name, gb) name ## _index < name ## _size_plus8
|
||||
#endif
|
||||
|
||||
#define CLOSE_READER(name, gb) (gb)->index = name ## _index
|
||||
|
||||
# ifdef LONG_BITSTREAM_READER
|
||||
|
||||
# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
|
||||
AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
|
||||
|
||||
# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
|
||||
AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7))
|
||||
|
||||
#else
|
||||
|
||||
# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
|
||||
AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
|
||||
|
||||
# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
|
||||
AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
|
||||
# define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb)
|
||||
|
||||
# define SKIP_CACHE(name, gb, num) name ## _cache >>= (num)
|
||||
|
||||
#else
|
||||
|
||||
# define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb)
|
||||
|
||||
# define SKIP_CACHE(name, gb, num) name ## _cache <<= (num)
|
||||
|
||||
#endif
|
||||
|
||||
#if UNCHECKED_BITSTREAM_READER
|
||||
# define SKIP_COUNTER(name, gb, num) name ## _index += (num)
|
||||
#else
|
||||
# define SKIP_COUNTER(name, gb, num) \
|
||||
name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num))
|
||||
#endif
|
||||
|
||||
#define BITS_LEFT(name, gb) ((int)((gb)->size_in_bits - name ## _index))
|
||||
|
||||
#define SKIP_BITS(name, gb, num) \
|
||||
do { \
|
||||
SKIP_CACHE(name, gb, num); \
|
||||
SKIP_COUNTER(name, gb, num); \
|
||||
} while (0)
|
||||
|
||||
#define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
|
||||
|
||||
#define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num)
|
||||
#define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num)
|
||||
|
||||
#define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num)
|
||||
#define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num)
|
||||
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
# define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num)
|
||||
# define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num)
|
||||
#else
|
||||
# define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num)
|
||||
# define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num)
|
||||
#endif
|
||||
|
||||
#define GET_CACHE(name, gb) ((uint32_t) name ## _cache)
|
||||
|
||||
static inline int get_bits_count(const GetBitContext *s)
|
||||
{
|
||||
return s->index;
|
||||
}
|
||||
|
||||
static inline void skip_bits_long(GetBitContext *s, int n)
|
||||
{
|
||||
#if UNCHECKED_BITSTREAM_READER
|
||||
s->index += n;
|
||||
#else
|
||||
s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
|
||||
* if MSB not set it is negative
|
||||
* @param n length in bits
|
||||
*/
|
||||
static inline int get_xbits(GetBitContext *s, int n)
|
||||
{
|
||||
register int sign;
|
||||
register int32_t cache;
|
||||
OPEN_READER(re, s);
|
||||
av_assert2(n>0 && n<=25);
|
||||
UPDATE_CACHE(re, s);
|
||||
cache = GET_CACHE(re, s);
|
||||
sign = ~cache >> 31;
|
||||
LAST_SKIP_BITS(re, s, n);
|
||||
CLOSE_READER(re, s);
|
||||
return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
|
||||
}
|
||||
|
||||
static inline int get_sbits(GetBitContext *s, int n)
|
||||
{
|
||||
register int tmp;
|
||||
OPEN_READER(re, s);
|
||||
av_assert2(n>0 && n<=25);
|
||||
UPDATE_CACHE(re, s);
|
||||
tmp = SHOW_SBITS(re, s, n);
|
||||
LAST_SKIP_BITS(re, s, n);
|
||||
CLOSE_READER(re, s);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read 1-25 bits.
|
||||
*/
|
||||
static inline unsigned int get_bits(GetBitContext *s, int n)
|
||||
{
|
||||
register int tmp;
|
||||
OPEN_READER(re, s);
|
||||
av_assert2(n>0 && n<=25);
|
||||
UPDATE_CACHE(re, s);
|
||||
tmp = SHOW_UBITS(re, s, n);
|
||||
LAST_SKIP_BITS(re, s, n);
|
||||
CLOSE_READER(re, s);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read 0-25 bits.
|
||||
*/
|
||||
static av_always_inline int get_bitsz(GetBitContext *s, int n)
|
||||
{
|
||||
return n ? get_bits(s, n) : 0;
|
||||
}
|
||||
|
||||
static inline unsigned int get_bits_le(GetBitContext *s, int n)
|
||||
{
|
||||
register int tmp;
|
||||
OPEN_READER(re, s);
|
||||
av_assert2(n>0 && n<=25);
|
||||
UPDATE_CACHE_LE(re, s);
|
||||
tmp = SHOW_UBITS_LE(re, s, n);
|
||||
LAST_SKIP_BITS(re, s, n);
|
||||
CLOSE_READER(re, s);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show 1-25 bits.
|
||||
*/
|
||||
static inline unsigned int show_bits(GetBitContext *s, int n)
|
||||
{
|
||||
register int tmp;
|
||||
OPEN_READER_NOSIZE(re, s);
|
||||
av_assert2(n>0 && n<=25);
|
||||
UPDATE_CACHE(re, s);
|
||||
tmp = SHOW_UBITS(re, s, n);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
static inline void skip_bits(GetBitContext *s, int n)
|
||||
{
|
||||
OPEN_READER(re, s);
|
||||
LAST_SKIP_BITS(re, s, n);
|
||||
CLOSE_READER(re, s);
|
||||
}
|
||||
|
||||
static inline unsigned int get_bits1(GetBitContext *s)
|
||||
{
|
||||
unsigned int index = s->index;
|
||||
uint8_t result = s->buffer[index >> 3];
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
result >>= index & 7;
|
||||
result &= 1;
|
||||
#else
|
||||
result <<= index & 7;
|
||||
result >>= 8 - 1;
|
||||
#endif
|
||||
#if !UNCHECKED_BITSTREAM_READER
|
||||
if (s->index < s->size_in_bits_plus8)
|
||||
#endif
|
||||
index++;
|
||||
s->index = index;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline unsigned int show_bits1(GetBitContext *s)
|
||||
{
|
||||
return show_bits(s, 1);
|
||||
}
|
||||
|
||||
static inline void skip_bits1(GetBitContext *s)
|
||||
{
|
||||
skip_bits(s, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read 0-32 bits.
|
||||
*/
|
||||
static inline unsigned int get_bits_long(GetBitContext *s, int n)
|
||||
{
|
||||
if (!n) {
|
||||
return 0;
|
||||
} else if (n <= MIN_CACHE_BITS) {
|
||||
return get_bits(s, n);
|
||||
} else {
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
unsigned ret = get_bits(s, 16);
|
||||
return ret | (get_bits(s, n - 16) << 16);
|
||||
#else
|
||||
unsigned ret = get_bits(s, 16) << (n - 16);
|
||||
return ret | get_bits(s, n - 16);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read 0-64 bits.
|
||||
*/
|
||||
static inline uint64_t get_bits64(GetBitContext *s, int n)
|
||||
{
|
||||
if (n <= 32) {
|
||||
return get_bits_long(s, n);
|
||||
} else {
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
uint64_t ret = get_bits_long(s, 32);
|
||||
return ret | (uint64_t) get_bits_long(s, n - 32) << 32;
|
||||
#else
|
||||
uint64_t ret = (uint64_t) get_bits_long(s, n - 32) << 32;
|
||||
return ret | get_bits_long(s, 32);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read 0-32 bits as a signed integer.
|
||||
*/
|
||||
static inline int get_sbits_long(GetBitContext *s, int n)
|
||||
{
|
||||
return sign_extend(get_bits_long(s, n), n);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show 0-32 bits.
|
||||
*/
|
||||
static inline unsigned int show_bits_long(GetBitContext *s, int n)
|
||||
{
|
||||
if (n <= MIN_CACHE_BITS) {
|
||||
return show_bits(s, n);
|
||||
} else {
|
||||
GetBitContext gb = *s;
|
||||
return get_bits_long(&gb, n);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int check_marker(void *logctx, GetBitContext *s, const char *msg)
|
||||
{
|
||||
int bit = get_bits1(s);
|
||||
if (!bit)
|
||||
av_log(logctx, AV_LOG_INFO, "Marker bit missing at %d of %d %s\n",
|
||||
get_bits_count(s) - 1, s->size_in_bits, msg);
|
||||
|
||||
return bit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize GetBitContext.
|
||||
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
|
||||
* larger than the actual read bits because some optimized bitstream
|
||||
* readers read 32 or 64 bit at once and could read over the end
|
||||
* @param bit_size the size of the buffer in bits
|
||||
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
|
||||
*/
|
||||
static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
|
||||
int bit_size)
|
||||
{
|
||||
int buffer_size;
|
||||
int ret = 0;
|
||||
|
||||
if (bit_size >= INT_MAX - 7 || bit_size < 0 || !buffer) {
|
||||
bit_size = 0;
|
||||
buffer = NULL;
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
buffer_size = (bit_size + 7) >> 3;
|
||||
|
||||
s->buffer = buffer;
|
||||
s->size_in_bits = bit_size;
|
||||
s->size_in_bits_plus8 = bit_size + 8;
|
||||
s->buffer_end = buffer + buffer_size;
|
||||
s->index = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize GetBitContext.
|
||||
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
|
||||
* larger than the actual read bits because some optimized bitstream
|
||||
* readers read 32 or 64 bit at once and could read over the end
|
||||
* @param byte_size the size of the buffer in bytes
|
||||
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
|
||||
*/
|
||||
static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
|
||||
int byte_size)
|
||||
{
|
||||
if (byte_size > INT_MAX / 8 || byte_size < 0)
|
||||
byte_size = -1;
|
||||
return init_get_bits(s, buffer, byte_size * 8);
|
||||
}
|
||||
|
||||
static inline const uint8_t *align_get_bits(GetBitContext *s)
|
||||
{
|
||||
int n = -get_bits_count(s) & 7;
|
||||
if (n)
|
||||
skip_bits(s, n);
|
||||
return s->buffer + (s->index >> 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the vlc code is invalid and max_depth=1, then no bits will be removed.
|
||||
* If the vlc code is invalid and max_depth>1, then the number of bits removed
|
||||
* is undefined.
|
||||
*/
|
||||
#define GET_VLC(code, name, gb, table, bits, max_depth) \
|
||||
do { \
|
||||
int n, nb_bits; \
|
||||
unsigned int index; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, bits); \
|
||||
code = table[index][0]; \
|
||||
n = table[index][1]; \
|
||||
\
|
||||
if (max_depth > 1 && n < 0) { \
|
||||
LAST_SKIP_BITS(name, gb, bits); \
|
||||
UPDATE_CACHE(name, gb); \
|
||||
\
|
||||
nb_bits = -n; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, nb_bits) + code; \
|
||||
code = table[index][0]; \
|
||||
n = table[index][1]; \
|
||||
if (max_depth > 2 && n < 0) { \
|
||||
LAST_SKIP_BITS(name, gb, nb_bits); \
|
||||
UPDATE_CACHE(name, gb); \
|
||||
\
|
||||
nb_bits = -n; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, nb_bits) + code; \
|
||||
code = table[index][0]; \
|
||||
n = table[index][1]; \
|
||||
} \
|
||||
} \
|
||||
SKIP_BITS(name, gb, n); \
|
||||
} while (0)
|
||||
|
||||
#define GET_RL_VLC(level, run, name, gb, table, bits, \
|
||||
max_depth, need_update) \
|
||||
do { \
|
||||
int n, nb_bits; \
|
||||
unsigned int index; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, bits); \
|
||||
level = table[index].level; \
|
||||
n = table[index].len; \
|
||||
\
|
||||
if (max_depth > 1 && n < 0) { \
|
||||
SKIP_BITS(name, gb, bits); \
|
||||
if (need_update) { \
|
||||
UPDATE_CACHE(name, gb); \
|
||||
} \
|
||||
\
|
||||
nb_bits = -n; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, nb_bits) + level; \
|
||||
level = table[index].level; \
|
||||
n = table[index].len; \
|
||||
if (max_depth > 2 && n < 0) { \
|
||||
LAST_SKIP_BITS(name, gb, nb_bits); \
|
||||
if (need_update) { \
|
||||
UPDATE_CACHE(name, gb); \
|
||||
} \
|
||||
nb_bits = -n; \
|
||||
\
|
||||
index = SHOW_UBITS(name, gb, nb_bits) + level; \
|
||||
level = table[index].level; \
|
||||
n = table[index].len; \
|
||||
} \
|
||||
} \
|
||||
run = table[index].run; \
|
||||
SKIP_BITS(name, gb, n); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Parse a vlc code.
|
||||
* @param bits is the number of bits which will be read at once, must be
|
||||
* identical to nb_bits in init_vlc()
|
||||
* @param max_depth is the number of times bits bits must be read to completely
|
||||
* read the longest vlc code
|
||||
* = (max_vlc_length + bits - 1) / bits
|
||||
*/
|
||||
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
|
||||
int bits, int max_depth)
|
||||
{
|
||||
int code;
|
||||
|
||||
OPEN_READER(re, s);
|
||||
UPDATE_CACHE(re, s);
|
||||
|
||||
GET_VLC(code, re, s, table, bits, max_depth);
|
||||
|
||||
CLOSE_READER(re, s);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
static inline int decode012(GetBitContext *gb)
|
||||
{
|
||||
int n;
|
||||
n = get_bits1(gb);
|
||||
if (n == 0)
|
||||
return 0;
|
||||
else
|
||||
return get_bits1(gb) + 1;
|
||||
}
|
||||
|
||||
static inline int decode210(GetBitContext *gb)
|
||||
{
|
||||
if (get_bits1(gb))
|
||||
return 0;
|
||||
else
|
||||
return 2 - get_bits1(gb);
|
||||
}
|
||||
|
||||
static inline int get_bits_left(GetBitContext *gb)
|
||||
{
|
||||
return gb->size_in_bits - get_bits_count(gb);
|
||||
}
|
||||
|
||||
static inline int skip_1stop_8data_bits(GetBitContext *gb)
|
||||
{
|
||||
if (get_bits_left(gb) <= 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
while (get_bits1(gb)) {
|
||||
skip_bits(gb, 8);
|
||||
if (get_bits_left(gb) <= 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_GET_BITS_H */
|
||||
173
media/ffvpx/libavcodec/golomb.c
Normal file
173
media/ffvpx/libavcodec/golomb.c
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* exp golomb vlc stuff
|
||||
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* @brief
|
||||
* exp golomb vlc stuff
|
||||
* @author Michael Niedermayer <michaelni@gmx.at>
|
||||
*/
|
||||
|
||||
#include "libavutil/common.h"
|
||||
|
||||
const uint8_t ff_golomb_vlc_len[512]={
|
||||
19,17,15,15,13,13,13,13,11,11,11,11,11,11,11,11,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
};
|
||||
|
||||
const uint8_t ff_ue_golomb_vlc_code[512]={
|
||||
32,32,32,32,32,32,32,32,31,32,32,32,32,32,32,32,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
|
||||
7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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
|
||||
};
|
||||
|
||||
const int8_t ff_se_golomb_vlc_code[512]={
|
||||
17, 17, 17, 17, 17, 17, 17, 17, 16, 17, 17, 17, 17, 17, 17, 17, 8, -8, 9, -9, 10,-10, 11,-11, 12,-12, 13,-13, 14,-14, 15,-15,
|
||||
4, 4, 4, 4, -4, -4, -4, -4, 5, 5, 5, 5, -5, -5, -5, -5, 6, 6, 6, 6, -6, -6, -6, -6, 7, 7, 7, 7, -7, -7, -7, -7,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
};
|
||||
|
||||
|
||||
const uint8_t ff_ue_golomb_len[256]={
|
||||
1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,
|
||||
11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,
|
||||
13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
|
||||
13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,
|
||||
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
|
||||
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
|
||||
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
|
||||
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,
|
||||
};
|
||||
|
||||
const uint8_t ff_interleaved_golomb_vlc_len[256]={
|
||||
9,9,7,7,9,9,7,7,5,5,5,5,5,5,5,5,
|
||||
9,9,7,7,9,9,7,7,5,5,5,5,5,5,5,5,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
9,9,7,7,9,9,7,7,5,5,5,5,5,5,5,5,
|
||||
9,9,7,7,9,9,7,7,5,5,5,5,5,5,5,5,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
};
|
||||
|
||||
const uint8_t ff_interleaved_ue_golomb_vlc_code[256]={
|
||||
15,16,7, 7, 17,18,8, 8, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
19,20,9, 9, 21,22,10,10,4, 4, 4, 4, 4, 4, 4, 4,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
23,24,11,11,25,26,12,12,5, 5, 5, 5, 5, 5, 5, 5,
|
||||
27,28,13,13,29,30,14,14,6, 6, 6, 6, 6, 6, 6, 6,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
};
|
||||
|
||||
const int8_t ff_interleaved_se_golomb_vlc_code[256]={
|
||||
8, -8, 4, 4, 9, -9, -4, -4, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
10,-10, 5, 5, 11,-11, -5, -5, -2, -2, -2, -2, -2, -2, -2, -2,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
12,-12, 6, 6, 13,-13, -6, -6, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
14,-14, 7, 7, 15,-15, -7, -7, -3, -3, -3, -3, -3, -3, -3, -3,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
};
|
||||
|
||||
const uint8_t ff_interleaved_dirac_golomb_vlc_code[256]={
|
||||
0, 1, 0, 0, 2, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
4, 5, 2, 2, 6, 7, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
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,
|
||||
8, 9, 4, 4, 10,11,5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
12,13,6, 6, 14,15,7, 7, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,};
|
||||
579
media/ffvpx/libavcodec/golomb.h
Normal file
579
media/ffvpx/libavcodec/golomb.h
Normal file
|
|
@ -0,0 +1,579 @@
|
|||
/*
|
||||
* exp golomb vlc stuff
|
||||
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
|
||||
* Copyright (c) 2004 Alex Beregszaszi
|
||||
*
|
||||
* 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
|
||||
* @brief
|
||||
* exp golomb vlc stuff
|
||||
* @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_GOLOMB_H
|
||||
#define AVCODEC_GOLOMB_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "get_bits.h"
|
||||
#include "put_bits.h"
|
||||
|
||||
#define INVALID_VLC 0x80000000
|
||||
|
||||
extern const uint8_t ff_golomb_vlc_len[512];
|
||||
extern const uint8_t ff_ue_golomb_vlc_code[512];
|
||||
extern const int8_t ff_se_golomb_vlc_code[512];
|
||||
extern const uint8_t ff_ue_golomb_len[256];
|
||||
|
||||
extern const uint8_t ff_interleaved_golomb_vlc_len[256];
|
||||
extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
|
||||
extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
|
||||
extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
|
||||
|
||||
/**
|
||||
* Read an unsigned Exp-Golomb code in the range 0 to 8190.
|
||||
*/
|
||||
static inline int get_ue_golomb(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
if (buf >= (1 << 27)) {
|
||||
buf >>= 32 - 9;
|
||||
LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ff_ue_golomb_vlc_code[buf];
|
||||
} else {
|
||||
int log = 2 * av_log2(buf) - 31;
|
||||
LAST_SKIP_BITS(re, gb, 32 - log);
|
||||
CLOSE_READER(re, gb);
|
||||
if (log < 7) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Invalid UE golomb code\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
buf >>= log;
|
||||
buf--;
|
||||
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
|
||||
*/
|
||||
static inline unsigned get_ue_golomb_long(GetBitContext *gb)
|
||||
{
|
||||
unsigned buf, log;
|
||||
|
||||
buf = show_bits_long(gb, 32);
|
||||
log = 31 - av_log2(buf);
|
||||
skip_bits_long(gb, log);
|
||||
|
||||
return get_bits_long(gb, log + 1) - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned exp golomb code, constraint to a max of 31.
|
||||
* the return value is undefined if the stored value exceeds 31.
|
||||
*/
|
||||
static inline int get_ue_golomb_31(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
buf >>= 32 - 9;
|
||||
LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ff_ue_golomb_vlc_code[buf];
|
||||
}
|
||||
|
||||
static inline unsigned get_interleaved_ue_golomb(GetBitContext *gb)
|
||||
{
|
||||
uint32_t buf;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
if (buf & 0xAA800000) {
|
||||
buf >>= 32 - 8;
|
||||
LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ff_interleaved_ue_golomb_vlc_code[buf];
|
||||
} else {
|
||||
unsigned ret = 1;
|
||||
|
||||
do {
|
||||
buf >>= 32 - 8;
|
||||
LAST_SKIP_BITS(re, gb,
|
||||
FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
|
||||
|
||||
if (ff_interleaved_golomb_vlc_len[buf] != 9) {
|
||||
ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
|
||||
ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
|
||||
break;
|
||||
}
|
||||
ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
} while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
|
||||
|
||||
CLOSE_READER(re, gb);
|
||||
return ret - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned truncated exp golomb code.
|
||||
*/
|
||||
static inline int get_te0_golomb(GetBitContext *gb, int range)
|
||||
{
|
||||
av_assert2(range >= 1);
|
||||
|
||||
if (range == 1)
|
||||
return 0;
|
||||
else if (range == 2)
|
||||
return get_bits1(gb) ^ 1;
|
||||
else
|
||||
return get_ue_golomb(gb);
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned truncated exp golomb code.
|
||||
*/
|
||||
static inline int get_te_golomb(GetBitContext *gb, int range)
|
||||
{
|
||||
av_assert2(range >= 1);
|
||||
|
||||
if (range == 2)
|
||||
return get_bits1(gb) ^ 1;
|
||||
else
|
||||
return get_ue_golomb(gb);
|
||||
}
|
||||
|
||||
/**
|
||||
* read signed exp golomb code.
|
||||
*/
|
||||
static inline int get_se_golomb(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
if (buf >= (1 << 27)) {
|
||||
buf >>= 32 - 9;
|
||||
LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ff_se_golomb_vlc_code[buf];
|
||||
} else {
|
||||
int log = av_log2(buf), sign;
|
||||
LAST_SKIP_BITS(re, gb, 31 - log);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
buf >>= log;
|
||||
|
||||
LAST_SKIP_BITS(re, gb, 32 - log);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
sign = -(buf & 1);
|
||||
buf = ((buf >> 1) ^ sign) - sign;
|
||||
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int get_se_golomb_long(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf = get_ue_golomb_long(gb);
|
||||
int sign = (buf & 1) - 1;
|
||||
return ((buf >> 1) ^ sign) + 1;
|
||||
}
|
||||
|
||||
static inline int get_interleaved_se_golomb(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
if (buf & 0xAA800000) {
|
||||
buf >>= 32 - 8;
|
||||
LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ff_interleaved_se_golomb_vlc_code[buf];
|
||||
} else {
|
||||
int log;
|
||||
LAST_SKIP_BITS(re, gb, 8);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf |= 1 | (GET_CACHE(re, gb) >> 8);
|
||||
|
||||
if ((buf & 0xAAAAAAAA) == 0)
|
||||
return INVALID_VLC;
|
||||
|
||||
for (log = 31; (buf & 0x80000000) == 0; log--)
|
||||
buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
|
||||
|
||||
LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int dirac_get_se_golomb(GetBitContext *gb)
|
||||
{
|
||||
uint32_t ret = get_interleaved_ue_golomb(gb);
|
||||
|
||||
if (ret) {
|
||||
int sign = -get_bits1(gb);
|
||||
ret = (ret ^ sign) - sign;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned golomb rice code (ffv1).
|
||||
*/
|
||||
static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
unsigned int buf;
|
||||
int log;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
log = av_log2(buf);
|
||||
|
||||
if (log > 31 - limit) {
|
||||
buf >>= log - k;
|
||||
buf += (30U - log) << k;
|
||||
LAST_SKIP_BITS(re, gb, 32 + k - log);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return buf;
|
||||
} else {
|
||||
LAST_SKIP_BITS(re, gb, limit);
|
||||
UPDATE_CACHE(re, gb);
|
||||
|
||||
buf = SHOW_UBITS(re, gb, esc_len);
|
||||
|
||||
LAST_SKIP_BITS(re, gb, esc_len);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return buf + limit - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned golomb rice code (jpegls).
|
||||
*/
|
||||
static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
unsigned int buf;
|
||||
int log;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
|
||||
log = av_log2(buf);
|
||||
|
||||
if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
|
||||
32 - log < limit) {
|
||||
buf >>= log - k;
|
||||
buf += (30U - log) << k;
|
||||
LAST_SKIP_BITS(re, gb, 32 + k - log);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return buf;
|
||||
} else {
|
||||
int i;
|
||||
for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
|
||||
if (gb->size_in_bits <= re_index)
|
||||
return -1;
|
||||
LAST_SKIP_BITS(re, gb, 1);
|
||||
UPDATE_CACHE(re, gb);
|
||||
}
|
||||
SKIP_BITS(re, gb, 1);
|
||||
|
||||
if (i < limit - 1) {
|
||||
if (k) {
|
||||
if (k > MIN_CACHE_BITS - 1) {
|
||||
buf = SHOW_UBITS(re, gb, 16) << (k-16);
|
||||
LAST_SKIP_BITS(re, gb, 16);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf |= SHOW_UBITS(re, gb, k-16);
|
||||
LAST_SKIP_BITS(re, gb, k-16);
|
||||
} else {
|
||||
buf = SHOW_UBITS(re, gb, k);
|
||||
LAST_SKIP_BITS(re, gb, k);
|
||||
}
|
||||
} else {
|
||||
buf = 0;
|
||||
}
|
||||
|
||||
CLOSE_READER(re, gb);
|
||||
return buf + (i << k);
|
||||
} else if (i == limit - 1) {
|
||||
buf = SHOW_UBITS(re, gb, esc_len);
|
||||
LAST_SKIP_BITS(re, gb, esc_len);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return buf + 1;
|
||||
} else
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* read signed golomb rice code (ffv1).
|
||||
*/
|
||||
static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
unsigned v = get_ur_golomb(gb, k, limit, esc_len);
|
||||
return (v >> 1) ^ -(v & 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* read signed golomb rice code (flac).
|
||||
*/
|
||||
static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
unsigned v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
|
||||
return (v >> 1) ^ -(v & 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned golomb rice code (shorten).
|
||||
*/
|
||||
static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
|
||||
{
|
||||
return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* read signed golomb rice code (shorten).
|
||||
*/
|
||||
static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
|
||||
{
|
||||
int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
|
||||
return (uvar >> 1) ^ -(uvar & 1);
|
||||
}
|
||||
|
||||
#ifdef TRACE
|
||||
|
||||
static inline int get_ue(GetBitContext *s, const char *file, const char *func,
|
||||
int line)
|
||||
{
|
||||
int show = show_bits(s, 24);
|
||||
int pos = get_bits_count(s);
|
||||
int i = get_ue_golomb(s);
|
||||
int len = get_bits_count(s) - pos;
|
||||
int bits = show >> (24 - len);
|
||||
|
||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n",
|
||||
bits, len, i, pos, file, func, line);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline int get_se(GetBitContext *s, const char *file, const char *func,
|
||||
int line)
|
||||
{
|
||||
int show = show_bits(s, 24);
|
||||
int pos = get_bits_count(s);
|
||||
int i = get_se_golomb(s);
|
||||
int len = get_bits_count(s) - pos;
|
||||
int bits = show >> (24 - len);
|
||||
|
||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n",
|
||||
bits, len, i, pos, file, func, line);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
|
||||
int line)
|
||||
{
|
||||
int show = show_bits(s, 24);
|
||||
int pos = get_bits_count(s);
|
||||
int i = get_te0_golomb(s, r);
|
||||
int len = get_bits_count(s) - pos;
|
||||
int bits = show >> (24 - len);
|
||||
|
||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n",
|
||||
bits, len, i, pos, file, func, line);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
#define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
||||
#define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
||||
#define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
||||
#define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
||||
|
||||
#endif /* TRACE */
|
||||
|
||||
/**
|
||||
* write unsigned exp golomb code.
|
||||
*/
|
||||
static inline void set_ue_golomb(PutBitContext *pb, int i)
|
||||
{
|
||||
av_assert2(i >= 0);
|
||||
|
||||
if (i < 256)
|
||||
put_bits(pb, ff_ue_golomb_len[i], i + 1);
|
||||
else {
|
||||
int e = av_log2(i + 1);
|
||||
put_bits(pb, 2 * e + 1, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* write truncated unsigned exp golomb code.
|
||||
*/
|
||||
static inline void set_te_golomb(PutBitContext *pb, int i, int range)
|
||||
{
|
||||
av_assert2(range >= 1);
|
||||
av_assert2(i <= range);
|
||||
|
||||
if (range == 2)
|
||||
put_bits(pb, 1, i ^ 1);
|
||||
else
|
||||
set_ue_golomb(pb, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* write signed exp golomb code. 16 bits at most.
|
||||
*/
|
||||
static inline void set_se_golomb(PutBitContext *pb, int i)
|
||||
{
|
||||
#if 0
|
||||
if (i <= 0)
|
||||
i = -2 * i;
|
||||
else
|
||||
i = 2 * i - 1;
|
||||
#elif 1
|
||||
i = 2 * i - 1;
|
||||
if (i < 0)
|
||||
i ^= -1; //FIXME check if gcc does the right thing
|
||||
#else
|
||||
i = 2 * i - 1;
|
||||
i ^= (i >> 31);
|
||||
#endif
|
||||
set_ue_golomb(pb, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* write unsigned golomb rice code (ffv1).
|
||||
*/
|
||||
static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
int e;
|
||||
|
||||
av_assert2(i >= 0);
|
||||
|
||||
e = i >> k;
|
||||
if (e < limit)
|
||||
put_bits(pb, e + k + 1, (1 << k) + av_mod_uintp2(i, k));
|
||||
else
|
||||
put_bits(pb, limit + esc_len, i - limit + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* write unsigned golomb rice code (jpegls).
|
||||
*/
|
||||
static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
|
||||
int limit, int esc_len)
|
||||
{
|
||||
int e;
|
||||
|
||||
av_assert2(i >= 0);
|
||||
|
||||
e = (i >> k) + 1;
|
||||
if (e < limit) {
|
||||
while (e > 31) {
|
||||
put_bits(pb, 31, 0);
|
||||
e -= 31;
|
||||
}
|
||||
put_bits(pb, e, 1);
|
||||
if (k)
|
||||
put_sbits(pb, k, i);
|
||||
} else {
|
||||
while (limit > 31) {
|
||||
put_bits(pb, 31, 0);
|
||||
limit -= 31;
|
||||
}
|
||||
put_bits(pb, limit, 1);
|
||||
put_bits(pb, esc_len, i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* write signed golomb rice code (ffv1).
|
||||
*/
|
||||
static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
|
||||
int esc_len)
|
||||
{
|
||||
int v;
|
||||
|
||||
v = -2 * i - 1;
|
||||
v ^= (v >> 31);
|
||||
|
||||
set_ur_golomb(pb, v, k, limit, esc_len);
|
||||
}
|
||||
|
||||
/**
|
||||
* write signed golomb rice code (flac).
|
||||
*/
|
||||
static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
|
||||
int limit, int esc_len)
|
||||
{
|
||||
int v;
|
||||
|
||||
v = -2 * i - 1;
|
||||
v ^= (v >> 31);
|
||||
|
||||
set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_GOLOMB_H */
|
||||
35
media/ffvpx/libavcodec/h263dsp.h
Normal file
35
media/ffvpx/libavcodec/h263dsp.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_H263DSP_H
|
||||
#define AVCODEC_H263DSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern const uint8_t ff_h263_loop_filter_strength[32];
|
||||
|
||||
typedef struct H263DSPContext {
|
||||
void (*h263_h_loop_filter)(uint8_t *src, int stride, int qscale);
|
||||
void (*h263_v_loop_filter)(uint8_t *src, int stride, int qscale);
|
||||
} H263DSPContext;
|
||||
|
||||
void ff_h263dsp_init(H263DSPContext *ctx);
|
||||
void ff_h263dsp_init_x86(H263DSPContext *ctx);
|
||||
void ff_h263dsp_init_mips(H263DSPContext *ctx);
|
||||
|
||||
#endif /* AVCODEC_H263DSP_H */
|
||||
39
media/ffvpx/libavcodec/h264chroma.h
Normal file
39
media/ffvpx/libavcodec/h264chroma.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_H264CHROMA_H
|
||||
#define AVCODEC_H264CHROMA_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef void (*h264_chroma_mc_func)(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x, int y);
|
||||
|
||||
typedef struct H264ChromaContext {
|
||||
h264_chroma_mc_func put_h264_chroma_pixels_tab[4];
|
||||
h264_chroma_mc_func avg_h264_chroma_pixels_tab[4];
|
||||
} H264ChromaContext;
|
||||
|
||||
void ff_h264chroma_init(H264ChromaContext *c, int bit_depth);
|
||||
|
||||
void ff_h264chroma_init_aarch64(H264ChromaContext *c, int bit_depth);
|
||||
void ff_h264chroma_init_arm(H264ChromaContext *c, int bit_depth);
|
||||
void ff_h264chroma_init_ppc(H264ChromaContext *c, int bit_depth);
|
||||
void ff_h264chroma_init_x86(H264ChromaContext *c, int bit_depth);
|
||||
void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth);
|
||||
|
||||
#endif /* AVCODEC_H264CHROMA_H */
|
||||
132
media/ffvpx/libavcodec/h264dsp.h
Normal file
132
media/ffvpx/libavcodec/h264dsp.h
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* Copyright (c) 2003-2010 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* H.264 DSP functions.
|
||||
* @author Michael Niedermayer <michaelni@gmx.at>
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_H264DSP_H
|
||||
#define AVCODEC_H264DSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef void (*h264_weight_func)(uint8_t *block, int stride, int height,
|
||||
int log2_denom, int weight, int offset);
|
||||
typedef void (*h264_biweight_func)(uint8_t *dst, uint8_t *src,
|
||||
int stride, int height, int log2_denom,
|
||||
int weightd, int weights, int offset);
|
||||
|
||||
/**
|
||||
* Context for storing H.264 DSP functions
|
||||
*/
|
||||
typedef struct H264DSPContext {
|
||||
/* weighted MC */
|
||||
h264_weight_func weight_h264_pixels_tab[4];
|
||||
h264_biweight_func biweight_h264_pixels_tab[4];
|
||||
|
||||
/* loop filter */
|
||||
void (*h264_v_loop_filter_luma)(uint8_t *pix /*align 16*/, int stride,
|
||||
int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_luma)(uint8_t *pix /*align 4 */, int stride,
|
||||
int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_luma_mbaff)(uint8_t *pix /*align 16*/, int stride,
|
||||
int alpha, int beta, int8_t *tc0);
|
||||
/* v/h_loop_filter_luma_intra: align 16 */
|
||||
void (*h264_v_loop_filter_luma_intra)(uint8_t *pix, int stride,
|
||||
int alpha, int beta);
|
||||
void (*h264_h_loop_filter_luma_intra)(uint8_t *pix, int stride,
|
||||
int alpha, int beta);
|
||||
void (*h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix /*align 16*/,
|
||||
int stride, int alpha, int beta);
|
||||
void (*h264_v_loop_filter_chroma)(uint8_t *pix /*align 8*/, int stride,
|
||||
int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_chroma)(uint8_t *pix /*align 4*/, int stride,
|
||||
int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_chroma_mbaff)(uint8_t *pix /*align 8*/,
|
||||
int stride, int alpha, int beta,
|
||||
int8_t *tc0);
|
||||
void (*h264_v_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
|
||||
int stride, int alpha, int beta);
|
||||
void (*h264_h_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
|
||||
int stride, int alpha, int beta);
|
||||
void (*h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix /*align 8*/,
|
||||
int stride, int alpha, int beta);
|
||||
// h264_loop_filter_strength: simd only. the C version is inlined in h264_loopfilter.c
|
||||
void (*h264_loop_filter_strength)(int16_t bS[2][4][4], uint8_t nnz[40],
|
||||
int8_t ref[2][40], int16_t mv[2][40][2],
|
||||
int bidir, int edges, int step,
|
||||
int mask_mv0, int mask_mv1, int field);
|
||||
|
||||
/* IDCT */
|
||||
void (*h264_idct_add)(uint8_t *dst /*align 4*/,
|
||||
int16_t *block /*align 16*/, int stride);
|
||||
void (*h264_idct8_add)(uint8_t *dst /*align 8*/,
|
||||
int16_t *block /*align 16*/, int stride);
|
||||
void (*h264_idct_dc_add)(uint8_t *dst /*align 4*/,
|
||||
int16_t *block /*align 16*/, int stride);
|
||||
void (*h264_idct8_dc_add)(uint8_t *dst /*align 8*/,
|
||||
int16_t *block /*align 16*/, int stride);
|
||||
|
||||
void (*h264_idct_add16)(uint8_t *dst /*align 16*/, const int *blockoffset,
|
||||
int16_t *block /*align 16*/, int stride,
|
||||
const uint8_t nnzc[15 * 8]);
|
||||
void (*h264_idct8_add4)(uint8_t *dst /*align 16*/, const int *blockoffset,
|
||||
int16_t *block /*align 16*/, int stride,
|
||||
const uint8_t nnzc[15 * 8]);
|
||||
void (*h264_idct_add8)(uint8_t **dst /*align 16*/, const int *blockoffset,
|
||||
int16_t *block /*align 16*/, int stride,
|
||||
const uint8_t nnzc[15 * 8]);
|
||||
void (*h264_idct_add16intra)(uint8_t *dst /*align 16*/, const int *blockoffset,
|
||||
int16_t *block /*align 16*/,
|
||||
int stride, const uint8_t nnzc[15 * 8]);
|
||||
void (*h264_luma_dc_dequant_idct)(int16_t *output,
|
||||
int16_t *input /*align 16*/, int qmul);
|
||||
void (*h264_chroma_dc_dequant_idct)(int16_t *block, int qmul);
|
||||
|
||||
/* bypass-transform */
|
||||
void (*h264_add_pixels8_clear)(uint8_t *dst, int16_t *block, int stride);
|
||||
void (*h264_add_pixels4_clear)(uint8_t *dst, int16_t *block, int stride);
|
||||
|
||||
/**
|
||||
* Search buf from the start for up to size bytes. Return the index
|
||||
* of a zero byte, or >= size if not found. Ideally, use lookahead
|
||||
* to filter out any zero bytes that are known to not be followed by
|
||||
* one or more further zero bytes and a one byte. Better still, filter
|
||||
* out any bytes that form the trailing_zero_8bits syntax element too.
|
||||
*/
|
||||
int (*startcode_find_candidate)(const uint8_t *buf, int size);
|
||||
} H264DSPContext;
|
||||
|
||||
void ff_h264dsp_init(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264dsp_init_arm(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264dsp_init_ppc(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264dsp_init_mips(H264DSPContext *c, const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
|
||||
#endif /* AVCODEC_H264DSP_H */
|
||||
603
media/ffvpx/libavcodec/h264pred.c
Normal file
603
media/ffvpx/libavcodec/h264pred.c
Normal file
|
|
@ -0,0 +1,603 @@
|
|||
/*
|
||||
* H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
|
||||
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* H.264 / AVC / MPEG-4 part10 prediction functions.
|
||||
* @author Michael Niedermayer <michaelni@gmx.at>
|
||||
*/
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "avcodec.h"
|
||||
#include "h264pred.h"
|
||||
|
||||
#define BIT_DEPTH 8
|
||||
#include "h264pred_template.c"
|
||||
#undef BIT_DEPTH
|
||||
|
||||
#define BIT_DEPTH 9
|
||||
#include "h264pred_template.c"
|
||||
#undef BIT_DEPTH
|
||||
|
||||
#define BIT_DEPTH 10
|
||||
#include "h264pred_template.c"
|
||||
#undef BIT_DEPTH
|
||||
|
||||
#define BIT_DEPTH 12
|
||||
#include "h264pred_template.c"
|
||||
#undef BIT_DEPTH
|
||||
|
||||
#define BIT_DEPTH 14
|
||||
#include "h264pred_template.c"
|
||||
#undef BIT_DEPTH
|
||||
|
||||
static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
const unsigned lt = src[-1-1*stride];
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
uint32_t v = PACK_4U8((lt + 2*t0 + t1 + 2) >> 2,
|
||||
(t0 + 2*t1 + t2 + 2) >> 2,
|
||||
(t1 + 2*t2 + t3 + 2) >> 2,
|
||||
(t2 + 2*t3 + t4 + 2) >> 2);
|
||||
|
||||
AV_WN32A(src+0*stride, v);
|
||||
AV_WN32A(src+1*stride, v);
|
||||
AV_WN32A(src+2*stride, v);
|
||||
AV_WN32A(src+3*stride, v);
|
||||
}
|
||||
|
||||
static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
const unsigned lt = src[-1-1*stride];
|
||||
LOAD_LEFT_EDGE
|
||||
|
||||
AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101);
|
||||
AV_WN32A(src+1*stride, ((l0 + 2*l1 + l2 + 2) >> 2)*0x01010101);
|
||||
AV_WN32A(src+2*stride, ((l1 + 2*l2 + l3 + 2) >> 2)*0x01010101);
|
||||
AV_WN32A(src+3*stride, ((l2 + 2*l3 + l3 + 2) >> 2)*0x01010101);
|
||||
}
|
||||
|
||||
static void pred4x4_down_left_svq3_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_LEFT_EDGE
|
||||
|
||||
src[0+0*stride]=(l1 + t1)>>1;
|
||||
src[1+0*stride]=
|
||||
src[0+1*stride]=(l2 + t2)>>1;
|
||||
src[2+0*stride]=
|
||||
src[1+1*stride]=
|
||||
src[0+2*stride]=
|
||||
src[3+0*stride]=
|
||||
src[2+1*stride]=
|
||||
src[1+2*stride]=
|
||||
src[0+3*stride]=
|
||||
src[3+1*stride]=
|
||||
src[2+2*stride]=
|
||||
src[1+3*stride]=
|
||||
src[3+2*stride]=
|
||||
src[2+3*stride]=
|
||||
src[3+3*stride]=(l3 + t3)>>1;
|
||||
}
|
||||
|
||||
static void pred4x4_down_left_rv40_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
LOAD_LEFT_EDGE
|
||||
LOAD_DOWN_LEFT_EDGE
|
||||
|
||||
src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
|
||||
src[1+0*stride]=
|
||||
src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
|
||||
src[2+0*stride]=
|
||||
src[1+1*stride]=
|
||||
src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + l4 + 2*l3 + 2)>>3;
|
||||
src[3+0*stride]=
|
||||
src[2+1*stride]=
|
||||
src[1+2*stride]=
|
||||
src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3 + l5 + 2*l4 + 2)>>3;
|
||||
src[3+1*stride]=
|
||||
src[2+2*stride]=
|
||||
src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l4 + l6 + 2*l5 + 2)>>3;
|
||||
src[3+2*stride]=
|
||||
src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3;
|
||||
src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2;
|
||||
}
|
||||
|
||||
static void pred4x4_down_left_rv40_nodown_c(uint8_t *src,
|
||||
const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
LOAD_LEFT_EDGE
|
||||
|
||||
src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
|
||||
src[1+0*stride]=
|
||||
src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
|
||||
src[2+0*stride]=
|
||||
src[1+1*stride]=
|
||||
src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + 3*l3 + 2)>>3;
|
||||
src[3+0*stride]=
|
||||
src[2+1*stride]=
|
||||
src[1+2*stride]=
|
||||
src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3*4 + 2)>>3;
|
||||
src[3+1*stride]=
|
||||
src[2+2*stride]=
|
||||
src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l3*4 + 2)>>3;
|
||||
src[3+2*stride]=
|
||||
src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3;
|
||||
src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2;
|
||||
}
|
||||
|
||||
static void pred4x4_vertical_left_rv40(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride,
|
||||
const int l0, const int l1, const int l2,
|
||||
const int l3, const int l4)
|
||||
{
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
|
||||
src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
|
||||
src[1+0*stride]=
|
||||
src[0+2*stride]=(t1 + t2 + 1)>>1;
|
||||
src[2+0*stride]=
|
||||
src[1+2*stride]=(t2 + t3 + 1)>>1;
|
||||
src[3+0*stride]=
|
||||
src[2+2*stride]=(t3 + t4+ 1)>>1;
|
||||
src[3+2*stride]=(t4 + t5+ 1)>>1;
|
||||
src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l4 + 4)>>3;
|
||||
src[1+1*stride]=
|
||||
src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
|
||||
src[2+1*stride]=
|
||||
src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
|
||||
src[3+1*stride]=
|
||||
src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
|
||||
src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
|
||||
}
|
||||
|
||||
static void pred4x4_vertical_left_rv40_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_LEFT_EDGE
|
||||
LOAD_DOWN_LEFT_EDGE
|
||||
|
||||
pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4);
|
||||
}
|
||||
|
||||
static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src,
|
||||
const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_LEFT_EDGE
|
||||
|
||||
pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3);
|
||||
}
|
||||
|
||||
static void pred4x4_vertical_left_vp8_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
|
||||
src[0+0*stride]=(t0 + t1 + 1)>>1;
|
||||
src[1+0*stride]=
|
||||
src[0+2*stride]=(t1 + t2 + 1)>>1;
|
||||
src[2+0*stride]=
|
||||
src[1+2*stride]=(t2 + t3 + 1)>>1;
|
||||
src[3+0*stride]=
|
||||
src[2+2*stride]=(t3 + t4 + 1)>>1;
|
||||
src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
|
||||
src[1+1*stride]=
|
||||
src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
|
||||
src[2+1*stride]=
|
||||
src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
|
||||
src[3+1*stride]=
|
||||
src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
|
||||
src[3+2*stride]=(t4 + 2*t5 + t6 + 2)>>2;
|
||||
src[3+3*stride]=(t5 + 2*t6 + t7 + 2)>>2;
|
||||
}
|
||||
|
||||
static void pred4x4_horizontal_up_rv40_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_LEFT_EDGE
|
||||
LOAD_DOWN_LEFT_EDGE
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
|
||||
src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
|
||||
src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
|
||||
src[2+0*stride]=
|
||||
src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
|
||||
src[3+0*stride]=
|
||||
src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
|
||||
src[2+1*stride]=
|
||||
src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
|
||||
src[3+1*stride]=
|
||||
src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
|
||||
src[3+2*stride]=
|
||||
src[1+3*stride]=(l3 + 2*l4 + l5 + 2)>>2;
|
||||
src[0+3*stride]=
|
||||
src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2;
|
||||
src[2+3*stride]=(l4 + l5 + 1)>>1;
|
||||
src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2;
|
||||
}
|
||||
|
||||
static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src,
|
||||
const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
LOAD_LEFT_EDGE
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
|
||||
src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
|
||||
src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
|
||||
src[2+0*stride]=
|
||||
src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
|
||||
src[3+0*stride]=
|
||||
src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
|
||||
src[2+1*stride]=
|
||||
src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
|
||||
src[3+1*stride]=
|
||||
src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
|
||||
src[3+2*stride]=
|
||||
src[1+3*stride]=l3;
|
||||
src[0+3*stride]=
|
||||
src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2;
|
||||
src[2+3*stride]=
|
||||
src[3+3*stride]=l3;
|
||||
}
|
||||
|
||||
static void pred4x4_tm_vp8_c(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride)
|
||||
{
|
||||
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
|
||||
uint8_t *top = src-stride;
|
||||
int y;
|
||||
|
||||
for (y = 0; y < 4; y++) {
|
||||
const uint8_t *cm_in = cm + src[-1];
|
||||
src[0] = cm_in[top[0]];
|
||||
src[1] = cm_in[top[1]];
|
||||
src[2] = cm_in[top[2]];
|
||||
src[3] = cm_in[top[3]];
|
||||
src += stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void pred16x16_plane_svq3_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
pred16x16_plane_compat_8_c(src, stride, 1, 0);
|
||||
}
|
||||
|
||||
static void pred16x16_plane_rv40_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
pred16x16_plane_compat_8_c(src, stride, 0, 1);
|
||||
}
|
||||
|
||||
static void pred16x16_tm_vp8_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
|
||||
uint8_t *top = src-stride;
|
||||
int y;
|
||||
|
||||
for (y = 0; y < 16; y++) {
|
||||
const uint8_t *cm_in = cm + src[-1];
|
||||
src[0] = cm_in[top[0]];
|
||||
src[1] = cm_in[top[1]];
|
||||
src[2] = cm_in[top[2]];
|
||||
src[3] = cm_in[top[3]];
|
||||
src[4] = cm_in[top[4]];
|
||||
src[5] = cm_in[top[5]];
|
||||
src[6] = cm_in[top[6]];
|
||||
src[7] = cm_in[top[7]];
|
||||
src[8] = cm_in[top[8]];
|
||||
src[9] = cm_in[top[9]];
|
||||
src[10] = cm_in[top[10]];
|
||||
src[11] = cm_in[top[11]];
|
||||
src[12] = cm_in[top[12]];
|
||||
src[13] = cm_in[top[13]];
|
||||
src[14] = cm_in[top[14]];
|
||||
src[15] = cm_in[top[15]];
|
||||
src += stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void pred8x8_left_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
int i;
|
||||
unsigned dc0;
|
||||
|
||||
dc0=0;
|
||||
for(i=0;i<8; i++)
|
||||
dc0+= src[-1+i*stride];
|
||||
dc0= 0x01010101*((dc0 + 4)>>3);
|
||||
|
||||
for(i=0; i<8; i++){
|
||||
((uint32_t*)(src+i*stride))[0]=
|
||||
((uint32_t*)(src+i*stride))[1]= dc0;
|
||||
}
|
||||
}
|
||||
|
||||
static void pred8x8_top_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
int i;
|
||||
unsigned dc0;
|
||||
|
||||
dc0=0;
|
||||
for(i=0;i<8; i++)
|
||||
dc0+= src[i-stride];
|
||||
dc0= 0x01010101*((dc0 + 4)>>3);
|
||||
|
||||
for(i=0; i<8; i++){
|
||||
((uint32_t*)(src+i*stride))[0]=
|
||||
((uint32_t*)(src+i*stride))[1]= dc0;
|
||||
}
|
||||
}
|
||||
|
||||
static void pred8x8_dc_rv40_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
int i;
|
||||
unsigned dc0 = 0;
|
||||
|
||||
for(i=0;i<4; i++){
|
||||
dc0+= src[-1+i*stride] + src[i-stride];
|
||||
dc0+= src[4+i-stride];
|
||||
dc0+= src[-1+(i+4)*stride];
|
||||
}
|
||||
dc0= 0x01010101*((dc0 + 8)>>4);
|
||||
|
||||
for(i=0; i<4; i++){
|
||||
((uint32_t*)(src+i*stride))[0]= dc0;
|
||||
((uint32_t*)(src+i*stride))[1]= dc0;
|
||||
}
|
||||
for(i=4; i<8; i++){
|
||||
((uint32_t*)(src+i*stride))[0]= dc0;
|
||||
((uint32_t*)(src+i*stride))[1]= dc0;
|
||||
}
|
||||
}
|
||||
|
||||
static void pred8x8_tm_vp8_c(uint8_t *src, ptrdiff_t stride)
|
||||
{
|
||||
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP - src[-1-stride];
|
||||
uint8_t *top = src-stride;
|
||||
int y;
|
||||
|
||||
for (y = 0; y < 8; y++) {
|
||||
const uint8_t *cm_in = cm + src[-1];
|
||||
src[0] = cm_in[top[0]];
|
||||
src[1] = cm_in[top[1]];
|
||||
src[2] = cm_in[top[2]];
|
||||
src[3] = cm_in[top[3]];
|
||||
src[4] = cm_in[top[4]];
|
||||
src[5] = cm_in[top[5]];
|
||||
src[6] = cm_in[top[6]];
|
||||
src[7] = cm_in[top[7]];
|
||||
src += stride;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the intra prediction function pointers.
|
||||
*/
|
||||
av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id,
|
||||
const int bit_depth,
|
||||
int chroma_format_idc)
|
||||
{
|
||||
#undef FUNC
|
||||
#undef FUNCC
|
||||
#define FUNC(a, depth) a ## _ ## depth
|
||||
#define FUNCC(a, depth) a ## _ ## depth ## _c
|
||||
#define FUNCD(a) a ## _c
|
||||
|
||||
#define H264_PRED(depth) \
|
||||
if(codec_id != AV_CODEC_ID_RV40){\
|
||||
if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {\
|
||||
h->pred4x4[VERT_PRED ]= FUNCD(pred4x4_vertical_vp8);\
|
||||
h->pred4x4[HOR_PRED ]= FUNCD(pred4x4_horizontal_vp8);\
|
||||
} else {\
|
||||
h->pred4x4[VERT_PRED ]= FUNCC(pred4x4_vertical , depth);\
|
||||
h->pred4x4[HOR_PRED ]= FUNCC(pred4x4_horizontal , depth);\
|
||||
}\
|
||||
h->pred4x4[DC_PRED ]= FUNCC(pred4x4_dc , depth);\
|
||||
if(codec_id == AV_CODEC_ID_SVQ3)\
|
||||
h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCD(pred4x4_down_left_svq3);\
|
||||
else\
|
||||
h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCC(pred4x4_down_left , depth);\
|
||||
h->pred4x4[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred4x4_down_right , depth);\
|
||||
h->pred4x4[VERT_RIGHT_PRED ]= FUNCC(pred4x4_vertical_right , depth);\
|
||||
h->pred4x4[HOR_DOWN_PRED ]= FUNCC(pred4x4_horizontal_down , depth);\
|
||||
if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {\
|
||||
h->pred4x4[VERT_LEFT_PRED ]= FUNCD(pred4x4_vertical_left_vp8);\
|
||||
} else\
|
||||
h->pred4x4[VERT_LEFT_PRED ]= FUNCC(pred4x4_vertical_left , depth);\
|
||||
h->pred4x4[HOR_UP_PRED ]= FUNCC(pred4x4_horizontal_up , depth);\
|
||||
if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {\
|
||||
h->pred4x4[LEFT_DC_PRED ]= FUNCC(pred4x4_left_dc , depth);\
|
||||
h->pred4x4[TOP_DC_PRED ]= FUNCC(pred4x4_top_dc , depth);\
|
||||
} else {\
|
||||
h->pred4x4[TM_VP8_PRED ]= FUNCD(pred4x4_tm_vp8);\
|
||||
h->pred4x4[DC_127_PRED ]= FUNCC(pred4x4_127_dc , depth);\
|
||||
h->pred4x4[DC_129_PRED ]= FUNCC(pred4x4_129_dc , depth);\
|
||||
h->pred4x4[VERT_VP8_PRED ]= FUNCC(pred4x4_vertical , depth);\
|
||||
h->pred4x4[HOR_VP8_PRED ]= FUNCC(pred4x4_horizontal , depth);\
|
||||
}\
|
||||
if (codec_id != AV_CODEC_ID_VP8)\
|
||||
h->pred4x4[DC_128_PRED ]= FUNCC(pred4x4_128_dc , depth);\
|
||||
}else{\
|
||||
h->pred4x4[VERT_PRED ]= FUNCC(pred4x4_vertical , depth);\
|
||||
h->pred4x4[HOR_PRED ]= FUNCC(pred4x4_horizontal , depth);\
|
||||
h->pred4x4[DC_PRED ]= FUNCC(pred4x4_dc , depth);\
|
||||
h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCD(pred4x4_down_left_rv40);\
|
||||
h->pred4x4[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred4x4_down_right , depth);\
|
||||
h->pred4x4[VERT_RIGHT_PRED ]= FUNCC(pred4x4_vertical_right , depth);\
|
||||
h->pred4x4[HOR_DOWN_PRED ]= FUNCC(pred4x4_horizontal_down , depth);\
|
||||
h->pred4x4[VERT_LEFT_PRED ]= FUNCD(pred4x4_vertical_left_rv40);\
|
||||
h->pred4x4[HOR_UP_PRED ]= FUNCD(pred4x4_horizontal_up_rv40);\
|
||||
h->pred4x4[LEFT_DC_PRED ]= FUNCC(pred4x4_left_dc , depth);\
|
||||
h->pred4x4[TOP_DC_PRED ]= FUNCC(pred4x4_top_dc , depth);\
|
||||
h->pred4x4[DC_128_PRED ]= FUNCC(pred4x4_128_dc , depth);\
|
||||
h->pred4x4[DIAG_DOWN_LEFT_PRED_RV40_NODOWN]= FUNCD(pred4x4_down_left_rv40_nodown);\
|
||||
h->pred4x4[HOR_UP_PRED_RV40_NODOWN]= FUNCD(pred4x4_horizontal_up_rv40_nodown);\
|
||||
h->pred4x4[VERT_LEFT_PRED_RV40_NODOWN]= FUNCD(pred4x4_vertical_left_rv40_nodown);\
|
||||
}\
|
||||
\
|
||||
h->pred8x8l[VERT_PRED ]= FUNCC(pred8x8l_vertical , depth);\
|
||||
h->pred8x8l[HOR_PRED ]= FUNCC(pred8x8l_horizontal , depth);\
|
||||
h->pred8x8l[DC_PRED ]= FUNCC(pred8x8l_dc , depth);\
|
||||
h->pred8x8l[DIAG_DOWN_LEFT_PRED ]= FUNCC(pred8x8l_down_left , depth);\
|
||||
h->pred8x8l[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred8x8l_down_right , depth);\
|
||||
h->pred8x8l[VERT_RIGHT_PRED ]= FUNCC(pred8x8l_vertical_right , depth);\
|
||||
h->pred8x8l[HOR_DOWN_PRED ]= FUNCC(pred8x8l_horizontal_down , depth);\
|
||||
h->pred8x8l[VERT_LEFT_PRED ]= FUNCC(pred8x8l_vertical_left , depth);\
|
||||
h->pred8x8l[HOR_UP_PRED ]= FUNCC(pred8x8l_horizontal_up , depth);\
|
||||
h->pred8x8l[LEFT_DC_PRED ]= FUNCC(pred8x8l_left_dc , depth);\
|
||||
h->pred8x8l[TOP_DC_PRED ]= FUNCC(pred8x8l_top_dc , depth);\
|
||||
h->pred8x8l[DC_128_PRED ]= FUNCC(pred8x8l_128_dc , depth);\
|
||||
\
|
||||
if (chroma_format_idc <= 1) {\
|
||||
h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x8_vertical , depth);\
|
||||
h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x8_horizontal , depth);\
|
||||
} else {\
|
||||
h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x16_vertical , depth);\
|
||||
h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x16_horizontal , depth);\
|
||||
}\
|
||||
if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {\
|
||||
if (chroma_format_idc <= 1) {\
|
||||
h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x8_plane , depth);\
|
||||
} else {\
|
||||
h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x16_plane , depth);\
|
||||
}\
|
||||
} else\
|
||||
h->pred8x8[PLANE_PRED8x8]= FUNCD(pred8x8_tm_vp8);\
|
||||
if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && \
|
||||
codec_id != AV_CODEC_ID_VP8) {\
|
||||
if (chroma_format_idc <= 1) {\
|
||||
h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x8_dc , depth);\
|
||||
h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc , depth);\
|
||||
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x8_top_dc , depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
|
||||
} else {\
|
||||
h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x16_dc , depth);\
|
||||
h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x16_left_dc , depth);\
|
||||
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x16_top_dc , depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l0t, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0lt, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l00, depth);\
|
||||
h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0l0, depth);\
|
||||
}\
|
||||
}else{\
|
||||
h->pred8x8[DC_PRED8x8 ]= FUNCD(pred8x8_dc_rv40);\
|
||||
h->pred8x8[LEFT_DC_PRED8x8]= FUNCD(pred8x8_left_dc_rv40);\
|
||||
h->pred8x8[TOP_DC_PRED8x8 ]= FUNCD(pred8x8_top_dc_rv40);\
|
||||
if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {\
|
||||
h->pred8x8[DC_127_PRED8x8]= FUNCC(pred8x8_127_dc , depth);\
|
||||
h->pred8x8[DC_129_PRED8x8]= FUNCC(pred8x8_129_dc , depth);\
|
||||
}\
|
||||
}\
|
||||
if (chroma_format_idc <= 1) {\
|
||||
h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x8_128_dc , depth);\
|
||||
} else {\
|
||||
h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x16_128_dc , depth);\
|
||||
}\
|
||||
\
|
||||
h->pred16x16[DC_PRED8x8 ]= FUNCC(pred16x16_dc , depth);\
|
||||
h->pred16x16[VERT_PRED8x8 ]= FUNCC(pred16x16_vertical , depth);\
|
||||
h->pred16x16[HOR_PRED8x8 ]= FUNCC(pred16x16_horizontal , depth);\
|
||||
switch(codec_id){\
|
||||
case AV_CODEC_ID_SVQ3:\
|
||||
h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_plane_svq3);\
|
||||
break;\
|
||||
case AV_CODEC_ID_RV40:\
|
||||
h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_plane_rv40);\
|
||||
break;\
|
||||
case AV_CODEC_ID_VP7:\
|
||||
case AV_CODEC_ID_VP8:\
|
||||
h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_tm_vp8);\
|
||||
h->pred16x16[DC_127_PRED8x8]= FUNCC(pred16x16_127_dc , depth);\
|
||||
h->pred16x16[DC_129_PRED8x8]= FUNCC(pred16x16_129_dc , depth);\
|
||||
break;\
|
||||
default:\
|
||||
h->pred16x16[PLANE_PRED8x8 ]= FUNCC(pred16x16_plane , depth);\
|
||||
break;\
|
||||
}\
|
||||
h->pred16x16[LEFT_DC_PRED8x8]= FUNCC(pred16x16_left_dc , depth);\
|
||||
h->pred16x16[TOP_DC_PRED8x8 ]= FUNCC(pred16x16_top_dc , depth);\
|
||||
h->pred16x16[DC_128_PRED8x8 ]= FUNCC(pred16x16_128_dc , depth);\
|
||||
\
|
||||
/* special lossless h/v prediction for H.264 */ \
|
||||
h->pred4x4_add [VERT_PRED ]= FUNCC(pred4x4_vertical_add , depth);\
|
||||
h->pred4x4_add [ HOR_PRED ]= FUNCC(pred4x4_horizontal_add , depth);\
|
||||
h->pred8x8l_add [VERT_PRED ]= FUNCC(pred8x8l_vertical_add , depth);\
|
||||
h->pred8x8l_add [ HOR_PRED ]= FUNCC(pred8x8l_horizontal_add , depth);\
|
||||
h->pred8x8l_filter_add [VERT_PRED ]= FUNCC(pred8x8l_vertical_filter_add , depth);\
|
||||
h->pred8x8l_filter_add [ HOR_PRED ]= FUNCC(pred8x8l_horizontal_filter_add , depth);\
|
||||
if (chroma_format_idc <= 1) {\
|
||||
h->pred8x8_add [VERT_PRED8x8]= FUNCC(pred8x8_vertical_add , depth);\
|
||||
h->pred8x8_add [ HOR_PRED8x8]= FUNCC(pred8x8_horizontal_add , depth);\
|
||||
} else {\
|
||||
h->pred8x8_add [VERT_PRED8x8]= FUNCC(pred8x16_vertical_add , depth);\
|
||||
h->pred8x8_add [ HOR_PRED8x8]= FUNCC(pred8x16_horizontal_add , depth);\
|
||||
}\
|
||||
h->pred16x16_add[VERT_PRED8x8]= FUNCC(pred16x16_vertical_add , depth);\
|
||||
h->pred16x16_add[ HOR_PRED8x8]= FUNCC(pred16x16_horizontal_add , depth);\
|
||||
|
||||
switch (bit_depth) {
|
||||
case 9:
|
||||
H264_PRED(9)
|
||||
break;
|
||||
case 10:
|
||||
H264_PRED(10)
|
||||
break;
|
||||
case 12:
|
||||
H264_PRED(12)
|
||||
break;
|
||||
case 14:
|
||||
H264_PRED(14)
|
||||
break;
|
||||
default:
|
||||
av_assert0(bit_depth<=8);
|
||||
H264_PRED(8)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ARCH_AARCH64)
|
||||
ff_h264_pred_init_aarch64(h, codec_id, bit_depth, chroma_format_idc);
|
||||
if (ARCH_ARM)
|
||||
ff_h264_pred_init_arm(h, codec_id, bit_depth, chroma_format_idc);
|
||||
if (ARCH_X86)
|
||||
ff_h264_pred_init_x86(h, codec_id, bit_depth, chroma_format_idc);
|
||||
if (ARCH_MIPS)
|
||||
ff_h264_pred_init_mips(h, codec_id, bit_depth, chroma_format_idc);
|
||||
}
|
||||
126
media/ffvpx/libavcodec/h264pred.h
Normal file
126
media/ffvpx/libavcodec/h264pred.h
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
|
||||
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* H.264 / AVC / MPEG-4 prediction functions.
|
||||
* @author Michael Niedermayer <michaelni@gmx.at>
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_H264PRED_H
|
||||
#define AVCODEC_H264PRED_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Prediction types
|
||||
*/
|
||||
//@{
|
||||
#define VERT_PRED 0
|
||||
#define HOR_PRED 1
|
||||
#define DC_PRED 2
|
||||
#define DIAG_DOWN_LEFT_PRED 3
|
||||
#define DIAG_DOWN_RIGHT_PRED 4
|
||||
#define VERT_RIGHT_PRED 5
|
||||
#define HOR_DOWN_PRED 6
|
||||
#define VERT_LEFT_PRED 7
|
||||
#define HOR_UP_PRED 8
|
||||
|
||||
// DC edge (not for VP8)
|
||||
#define LEFT_DC_PRED 9
|
||||
#define TOP_DC_PRED 10
|
||||
#define DC_128_PRED 11
|
||||
|
||||
// RV40 specific
|
||||
#define DIAG_DOWN_LEFT_PRED_RV40_NODOWN 12
|
||||
#define HOR_UP_PRED_RV40_NODOWN 13
|
||||
#define VERT_LEFT_PRED_RV40_NODOWN 14
|
||||
|
||||
// VP8 specific
|
||||
#define TM_VP8_PRED 9 ///< "True Motion", used instead of plane
|
||||
#define VERT_VP8_PRED 10 ///< for VP8, #VERT_PRED is the average of
|
||||
///< (left col+cur col x2+right col) / 4;
|
||||
///< this is the "unaveraged" one
|
||||
#define HOR_VP8_PRED 14 ///< unaveraged version of #HOR_PRED, see
|
||||
///< #VERT_VP8_PRED for details
|
||||
#define DC_127_PRED 12
|
||||
#define DC_129_PRED 13
|
||||
|
||||
#define DC_PRED8x8 0
|
||||
#define HOR_PRED8x8 1
|
||||
#define VERT_PRED8x8 2
|
||||
#define PLANE_PRED8x8 3
|
||||
|
||||
// DC edge
|
||||
#define LEFT_DC_PRED8x8 4
|
||||
#define TOP_DC_PRED8x8 5
|
||||
#define DC_128_PRED8x8 6
|
||||
|
||||
// H.264/SVQ3 (8x8) specific
|
||||
#define ALZHEIMER_DC_L0T_PRED8x8 7
|
||||
#define ALZHEIMER_DC_0LT_PRED8x8 8
|
||||
#define ALZHEIMER_DC_L00_PRED8x8 9
|
||||
#define ALZHEIMER_DC_0L0_PRED8x8 10
|
||||
|
||||
// VP8 specific
|
||||
#define DC_127_PRED8x8 7
|
||||
#define DC_129_PRED8x8 8
|
||||
//@}
|
||||
|
||||
/**
|
||||
* Context for storing H.264 prediction functions
|
||||
*/
|
||||
typedef struct H264PredContext {
|
||||
void(*pred4x4[9 + 3 + 3])(uint8_t *src, const uint8_t *topright,
|
||||
ptrdiff_t stride);
|
||||
void(*pred8x8l[9 + 3])(uint8_t *src, int topleft, int topright,
|
||||
ptrdiff_t stride);
|
||||
void(*pred8x8[4 + 3 + 4])(uint8_t *src, ptrdiff_t stride);
|
||||
void(*pred16x16[4 + 3 + 2])(uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
void(*pred4x4_add[2])(uint8_t *pix /*align 4*/,
|
||||
int16_t *block /*align 16*/, ptrdiff_t stride);
|
||||
void(*pred8x8l_add[2])(uint8_t *pix /*align 8*/,
|
||||
int16_t *block /*align 16*/, ptrdiff_t stride);
|
||||
void(*pred8x8l_filter_add[2])(uint8_t *pix /*align 8*/,
|
||||
int16_t *block /*align 16*/, int topleft, int topright, ptrdiff_t stride);
|
||||
void(*pred8x8_add[3])(uint8_t *pix /*align 8*/,
|
||||
const int *block_offset,
|
||||
int16_t *block /*align 16*/, ptrdiff_t stride);
|
||||
void(*pred16x16_add[3])(uint8_t *pix /*align 16*/,
|
||||
const int *block_offset,
|
||||
int16_t *block /*align 16*/, ptrdiff_t stride);
|
||||
} H264PredContext;
|
||||
|
||||
void ff_h264_pred_init(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc);
|
||||
void ff_h264_pred_init_aarch64(H264PredContext *h, int codec_id,
|
||||
const int bit_depth,
|
||||
const int chroma_format_idc);
|
||||
void ff_h264_pred_init_arm(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc);
|
||||
void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc);
|
||||
void ff_h264_pred_init_mips(H264PredContext *h, int codec_id,
|
||||
const int bit_depth, const int chroma_format_idc);
|
||||
|
||||
#endif /* AVCODEC_H264PRED_H */
|
||||
1355
media/ffvpx/libavcodec/h264pred_template.c
Normal file
1355
media/ffvpx/libavcodec/h264pred_template.c
Normal file
File diff suppressed because it is too large
Load diff
104
media/ffvpx/libavcodec/hpeldsp.h
Normal file
104
media/ffvpx/libavcodec/hpeldsp.h
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Half-pel DSP functions.
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* Half-pel DSP functions.
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_HPELDSP_H
|
||||
#define AVCODEC_HPELDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* add and put pixel (decoding) */
|
||||
// blocksizes for hpel_pixels_func are 8x4,8x8 16x8 16x16
|
||||
// h for hpel_pixels_func is limited to {width/2, width} but never larger
|
||||
// than 16 and never smaller than 4
|
||||
typedef void (*op_pixels_func)(uint8_t *block /*align width (8 or 16)*/,
|
||||
const uint8_t *pixels /*align 1*/,
|
||||
ptrdiff_t line_size, int h);
|
||||
|
||||
/**
|
||||
* Half-pel DSP context.
|
||||
*/
|
||||
typedef struct HpelDSPContext {
|
||||
/**
|
||||
* Halfpel motion compensation with rounding (a+b+1)>>1.
|
||||
* this is an array[4][4] of motion compensation functions for 4
|
||||
* horizontal blocksizes (8,16) and the 4 halfpel positions<br>
|
||||
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
|
||||
* @param block destination where the result is stored
|
||||
* @param pixels source
|
||||
* @param line_size number of bytes in a horizontal line of block
|
||||
* @param h height
|
||||
*/
|
||||
op_pixels_func put_pixels_tab[4][4];
|
||||
|
||||
/**
|
||||
* Halfpel motion compensation with rounding (a+b+1)>>1.
|
||||
* This is an array[4][4] of motion compensation functions for 4
|
||||
* horizontal blocksizes (8,16) and the 4 halfpel positions<br>
|
||||
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
|
||||
* @param block destination into which the result is averaged (a+b+1)>>1
|
||||
* @param pixels source
|
||||
* @param line_size number of bytes in a horizontal line of block
|
||||
* @param h height
|
||||
*/
|
||||
op_pixels_func avg_pixels_tab[4][4];
|
||||
|
||||
/**
|
||||
* Halfpel motion compensation with no rounding (a+b)>>1.
|
||||
* this is an array[4][4] of motion compensation functions for 2
|
||||
* horizontal blocksizes (8,16) and the 4 halfpel positions<br>
|
||||
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
|
||||
* @param block destination where the result is stored
|
||||
* @param pixels source
|
||||
* @param line_size number of bytes in a horizontal line of block
|
||||
* @param h height
|
||||
*/
|
||||
op_pixels_func put_no_rnd_pixels_tab[4][4];
|
||||
|
||||
/**
|
||||
* Halfpel motion compensation with no rounding (a+b)>>1.
|
||||
* this is an array[4] of motion compensation functions for 1
|
||||
* horizontal blocksize (16) and the 4 halfpel positions<br>
|
||||
* *pixels_tab[0][ xhalfpel + 2*yhalfpel ]
|
||||
* @param block destination into which the result is averaged (a+b)>>1
|
||||
* @param pixels source
|
||||
* @param line_size number of bytes in a horizontal line of block
|
||||
* @param h height
|
||||
*/
|
||||
op_pixels_func avg_no_rnd_pixels_tab[4];
|
||||
} HpelDSPContext;
|
||||
|
||||
void ff_hpeldsp_init(HpelDSPContext *c, int flags);
|
||||
|
||||
void ff_hpeldsp_init_aarch64(HpelDSPContext *c, int flags);
|
||||
void ff_hpeldsp_init_alpha(HpelDSPContext *c, int flags);
|
||||
void ff_hpeldsp_init_arm(HpelDSPContext *c, int flags);
|
||||
void ff_hpeldsp_init_ppc(HpelDSPContext *c, int flags);
|
||||
void ff_hpeldsp_init_x86(HpelDSPContext *c, int flags);
|
||||
void ff_hpeldsp_init_mips(HpelDSPContext *c, int flags);
|
||||
|
||||
#endif /* AVCODEC_HPELDSP_H */
|
||||
114
media/ffvpx/libavcodec/idctdsp.h
Normal file
114
media/ffvpx/libavcodec/idctdsp.h
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_IDCTDSP_H
|
||||
#define AVCODEC_IDCTDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
/**
|
||||
* Scantable.
|
||||
*/
|
||||
typedef struct ScanTable {
|
||||
const uint8_t *scantable;
|
||||
uint8_t permutated[64];
|
||||
uint8_t raster_end[64];
|
||||
} ScanTable;
|
||||
|
||||
enum idct_permutation_type {
|
||||
FF_IDCT_PERM_NONE,
|
||||
FF_IDCT_PERM_LIBMPEG2,
|
||||
FF_IDCT_PERM_SIMPLE,
|
||||
FF_IDCT_PERM_TRANSPOSE,
|
||||
FF_IDCT_PERM_PARTTRANS,
|
||||
FF_IDCT_PERM_SSE2,
|
||||
};
|
||||
|
||||
void ff_init_scantable(uint8_t *permutation, ScanTable *st,
|
||||
const uint8_t *src_scantable);
|
||||
void ff_init_scantable_permutation(uint8_t *idct_permutation,
|
||||
enum idct_permutation_type perm_type);
|
||||
int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
|
||||
enum idct_permutation_type perm_type);
|
||||
|
||||
typedef struct IDCTDSPContext {
|
||||
/* pixel ops : interface with DCT */
|
||||
void (*put_pixels_clamped)(const int16_t *block /* align 16 */,
|
||||
uint8_t *pixels /* align 8 */,
|
||||
ptrdiff_t line_size);
|
||||
void (*put_signed_pixels_clamped)(const int16_t *block /* align 16 */,
|
||||
uint8_t *pixels /* align 8 */,
|
||||
ptrdiff_t line_size);
|
||||
void (*add_pixels_clamped)(const int16_t *block /* align 16 */,
|
||||
uint8_t *pixels /* align 8 */,
|
||||
ptrdiff_t line_size);
|
||||
|
||||
void (*idct)(int16_t *block /* align 16 */);
|
||||
|
||||
/**
|
||||
* block -> idct -> clip to unsigned 8 bit -> dest.
|
||||
* (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
|
||||
* @param line_size size in bytes of a horizontal line of dest
|
||||
*/
|
||||
void (*idct_put)(uint8_t *dest /* align 8 */,
|
||||
int line_size, int16_t *block /* align 16 */);
|
||||
|
||||
/**
|
||||
* block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
|
||||
* @param line_size size in bytes of a horizontal line of dest
|
||||
*/
|
||||
void (*idct_add)(uint8_t *dest /* align 8 */,
|
||||
int line_size, int16_t *block /* align 16 */);
|
||||
|
||||
/**
|
||||
* IDCT input permutation.
|
||||
* Several optimized IDCTs need a permutated input (relative to the
|
||||
* normal order of the reference IDCT).
|
||||
* This permutation must be performed before the idct_put/add.
|
||||
* Note, normally this can be merged with the zigzag/alternate scan<br>
|
||||
* An example to avoid confusion:
|
||||
* - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
|
||||
* - (x -> reference DCT -> reference IDCT -> x)
|
||||
* - (x -> reference DCT -> simple_mmx_perm = idct_permutation
|
||||
* -> simple_idct_mmx -> x)
|
||||
* - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
|
||||
* -> simple_idct_mmx -> ...)
|
||||
*/
|
||||
uint8_t idct_permutation[64];
|
||||
enum idct_permutation_type perm_type;
|
||||
} IDCTDSPContext;
|
||||
|
||||
extern void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size);
|
||||
extern void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size);
|
||||
|
||||
void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx);
|
||||
|
||||
void ff_idctdsp_init_alpha(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_idctdsp_init_ppc(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_idctdsp_init_x86(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_idctdsp_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
|
||||
#endif /* AVCODEC_IDCTDSP_H */
|
||||
235
media/ffvpx/libavcodec/imgconvert.c
Normal file
235
media/ffvpx/libavcodec/imgconvert.c
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* Misc image conversion routines
|
||||
* Copyright (c) 2001, 2002, 2003 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
* misc image conversion routines
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "mathops.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/colorspace.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
|
||||
#if FF_API_GETCHROMA
|
||||
void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
|
||||
av_assert0(desc);
|
||||
*h_shift = desc->log2_chroma_w;
|
||||
*v_shift = desc->log2_chroma_h;
|
||||
}
|
||||
#endif
|
||||
|
||||
int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
|
||||
enum AVPixelFormat src_pix_fmt,
|
||||
int has_alpha)
|
||||
{
|
||||
return av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
|
||||
}
|
||||
|
||||
enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
|
||||
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
|
||||
{
|
||||
return av_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, has_alpha, loss_ptr);
|
||||
}
|
||||
|
||||
#if AV_HAVE_INCOMPATIBLE_LIBAV_ABI
|
||||
enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list,
|
||||
enum AVPixelFormat src_pix_fmt,
|
||||
int has_alpha, int *loss_ptr){
|
||||
return avcodec_find_best_pix_fmt_of_list(pix_fmt_list, src_pix_fmt, has_alpha, loss_ptr);
|
||||
}
|
||||
#else
|
||||
enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
|
||||
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
|
||||
{
|
||||
return avcodec_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, has_alpha, loss_ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list,
|
||||
enum AVPixelFormat src_pix_fmt,
|
||||
int has_alpha, int *loss_ptr){
|
||||
int i;
|
||||
|
||||
enum AVPixelFormat best = AV_PIX_FMT_NONE;
|
||||
|
||||
for(i=0; pix_fmt_list[i] != AV_PIX_FMT_NONE; i++)
|
||||
best = avcodec_find_best_pix_fmt_of_2(best, pix_fmt_list[i], src_pix_fmt, has_alpha, loss_ptr);
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
#if FF_API_AVPICTURE
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
/* return true if yuv planar */
|
||||
static inline int is_yuv_planar(const AVPixFmtDescriptor *desc)
|
||||
{
|
||||
int i;
|
||||
int planes[4] = { 0 };
|
||||
|
||||
if ( desc->flags & AV_PIX_FMT_FLAG_RGB
|
||||
|| !(desc->flags & AV_PIX_FMT_FLAG_PLANAR))
|
||||
return 0;
|
||||
|
||||
/* set the used planes */
|
||||
for (i = 0; i < desc->nb_components; i++)
|
||||
planes[desc->comp[i].plane] = 1;
|
||||
|
||||
/* if there is an unused plane, the format is not planar */
|
||||
for (i = 0; i < desc->nb_components; i++)
|
||||
if (!planes[i])
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int av_picture_crop(AVPicture *dst, const AVPicture *src,
|
||||
enum AVPixelFormat pix_fmt, int top_band, int left_band)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
|
||||
int y_shift;
|
||||
int x_shift;
|
||||
int max_step[4];
|
||||
|
||||
if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
|
||||
return -1;
|
||||
|
||||
y_shift = desc->log2_chroma_h;
|
||||
x_shift = desc->log2_chroma_w;
|
||||
av_image_fill_max_pixsteps(max_step, NULL, desc);
|
||||
|
||||
if (is_yuv_planar(desc)) {
|
||||
dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + left_band;
|
||||
dst->data[1] = src->data[1] + ((top_band >> y_shift) * src->linesize[1]) + (left_band >> x_shift);
|
||||
dst->data[2] = src->data[2] + ((top_band >> y_shift) * src->linesize[2]) + (left_band >> x_shift);
|
||||
} else{
|
||||
if(top_band % (1<<y_shift) || left_band % (1<<x_shift))
|
||||
return -1;
|
||||
dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + (left_band * max_step[0]);
|
||||
}
|
||||
|
||||
dst->linesize[0] = src->linesize[0];
|
||||
dst->linesize[1] = src->linesize[1];
|
||||
dst->linesize[2] = src->linesize[2];
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
|
||||
enum AVPixelFormat pix_fmt, int padtop, int padbottom, int padleft, int padright,
|
||||
int *color)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
|
||||
uint8_t *optr;
|
||||
int y_shift;
|
||||
int x_shift;
|
||||
int yheight;
|
||||
int i, y;
|
||||
int max_step[4];
|
||||
|
||||
if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
|
||||
return -1;
|
||||
|
||||
if (!is_yuv_planar(desc)) {
|
||||
if (src)
|
||||
return -1; //TODO: Not yet implemented
|
||||
|
||||
av_image_fill_max_pixsteps(max_step, NULL, desc);
|
||||
|
||||
if (padtop || padleft) {
|
||||
memset(dst->data[0], color[0],
|
||||
dst->linesize[0] * padtop + (padleft * max_step[0]));
|
||||
}
|
||||
|
||||
if (padleft || padright) {
|
||||
optr = dst->data[0] + dst->linesize[0] * padtop +
|
||||
(dst->linesize[0] - (padright * max_step[0]));
|
||||
yheight = height - 1 - (padtop + padbottom);
|
||||
for (y = 0; y < yheight; y++) {
|
||||
memset(optr, color[0], (padleft + padright) * max_step[0]);
|
||||
optr += dst->linesize[0];
|
||||
}
|
||||
}
|
||||
|
||||
if (padbottom || padright) {
|
||||
optr = dst->data[0] + dst->linesize[0] * (height - padbottom) -
|
||||
(padright * max_step[0]);
|
||||
memset(optr, color[0], dst->linesize[0] * padbottom +
|
||||
(padright * max_step[0]));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
x_shift = i ? desc->log2_chroma_w : 0;
|
||||
y_shift = i ? desc->log2_chroma_h : 0;
|
||||
|
||||
if (padtop || padleft) {
|
||||
memset(dst->data[i], color[i],
|
||||
dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
|
||||
}
|
||||
|
||||
if (padleft || padright) {
|
||||
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
|
||||
(dst->linesize[i] - (padright >> x_shift));
|
||||
yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
|
||||
for (y = 0; y < yheight; y++) {
|
||||
memset(optr, color[i], (padleft + padright) >> x_shift);
|
||||
optr += dst->linesize[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (src) { /* first line */
|
||||
uint8_t *iptr = src->data[i];
|
||||
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
|
||||
(padleft >> x_shift);
|
||||
memcpy(optr, iptr, (width - padleft - padright) >> x_shift);
|
||||
iptr += src->linesize[i];
|
||||
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
|
||||
(dst->linesize[i] - (padright >> x_shift));
|
||||
yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
|
||||
for (y = 0; y < yheight; y++) {
|
||||
memset(optr, color[i], (padleft + padright) >> x_shift);
|
||||
memcpy(optr + ((padleft + padright) >> x_shift), iptr,
|
||||
(width - padleft - padright) >> x_shift);
|
||||
iptr += src->linesize[i];
|
||||
optr += dst->linesize[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (padbottom || padright) {
|
||||
optr = dst->data[i] + dst->linesize[i] *
|
||||
((height - padbottom) >> y_shift) - (padright >> x_shift);
|
||||
memset(optr, color[i],dst->linesize[i] *
|
||||
(padbottom >> y_shift) + (padright >> x_shift));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif /* FF_API_AVPICTURE */
|
||||
363
media/ffvpx/libavcodec/internal.h
Normal file
363
media/ffvpx/libavcodec/internal.h
Normal file
|
|
@ -0,0 +1,363 @@
|
|||
/*
|
||||
* 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
|
||||
* common internal api header.
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_INTERNAL_H
|
||||
#define AVCODEC_INTERNAL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libavutil/buffer.h"
|
||||
#include "libavutil/channel_layout.h"
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "libavutil/pixfmt.h"
|
||||
#include "avcodec.h"
|
||||
#include "config.h"
|
||||
|
||||
/**
|
||||
* The codec does not modify any global variables in the init function,
|
||||
* allowing to call the init function without locking any global mutexes.
|
||||
*/
|
||||
#define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0)
|
||||
/**
|
||||
* The codec allows calling the close function for deallocation even if
|
||||
* the init function returned a failure. Without this capability flag, a
|
||||
* codec does such cleanup internally when returning failures from the
|
||||
* init function and does not expect the close function to be called at
|
||||
* all.
|
||||
*/
|
||||
#define FF_CODEC_CAP_INIT_CLEANUP (1 << 1)
|
||||
/**
|
||||
* Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set
|
||||
* AVFrame.pkt_dts manually. If the flag is set, utils.c won't overwrite
|
||||
* this field. If it's unset, utils.c tries to guess the pkt_dts field
|
||||
* from the input AVPacket.
|
||||
*/
|
||||
#define FF_CODEC_CAP_SETS_PKT_DTS (1 << 2)
|
||||
/**
|
||||
* The decoder extracts and fills its parameters even if the frame is
|
||||
* skipped due to the skip_frame setting.
|
||||
*/
|
||||
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM (1 << 3)
|
||||
|
||||
#ifdef TRACE
|
||||
# define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__)
|
||||
#else
|
||||
# define ff_tlog(ctx, ...) do { } while(0)
|
||||
#endif
|
||||
|
||||
|
||||
#if !FF_API_QUANT_BIAS
|
||||
#define FF_DEFAULT_QUANT_BIAS 999999
|
||||
#endif
|
||||
|
||||
#define FF_SANE_NB_CHANNELS 64U
|
||||
|
||||
#define FF_SIGNBIT(x) ((x) >> CHAR_BIT * sizeof(x) - 1)
|
||||
|
||||
#if HAVE_AVX
|
||||
# define STRIDE_ALIGN 32
|
||||
#elif HAVE_SIMD_ALIGN_16
|
||||
# define STRIDE_ALIGN 16
|
||||
#else
|
||||
# define STRIDE_ALIGN 8
|
||||
#endif
|
||||
|
||||
typedef struct FramePool {
|
||||
/**
|
||||
* Pools for each data plane. For audio all the planes have the same size,
|
||||
* so only pools[0] is used.
|
||||
*/
|
||||
AVBufferPool *pools[4];
|
||||
|
||||
/*
|
||||
* Pool parameters
|
||||
*/
|
||||
int format;
|
||||
int width, height;
|
||||
int stride_align[AV_NUM_DATA_POINTERS];
|
||||
int linesize[4];
|
||||
int planes;
|
||||
int channels;
|
||||
int samples;
|
||||
} FramePool;
|
||||
|
||||
typedef struct AVCodecInternal {
|
||||
/**
|
||||
* Whether the parent AVCodecContext is a copy of the context which had
|
||||
* init() called on it.
|
||||
* This is used by multithreading - shared tables and picture pointers
|
||||
* should be freed from the original context only.
|
||||
*/
|
||||
int is_copy;
|
||||
|
||||
/**
|
||||
* Whether to allocate progress for frame threading.
|
||||
*
|
||||
* The codec must set it to 1 if it uses ff_thread_await/report_progress(),
|
||||
* then progress will be allocated in ff_thread_get_buffer(). The frames
|
||||
* then MUST be freed with ff_thread_release_buffer().
|
||||
*
|
||||
* If the codec does not need to call the progress functions (there are no
|
||||
* dependencies between the frames), it should leave this at 0. Then it can
|
||||
* decode straight to the user-provided frames (which the user will then
|
||||
* free with av_frame_unref()), there is no need to call
|
||||
* ff_thread_release_buffer().
|
||||
*/
|
||||
int allocate_progress;
|
||||
|
||||
/**
|
||||
* An audio frame with less than required samples has been submitted and
|
||||
* padded with silence. Reject all subsequent frames.
|
||||
*/
|
||||
int last_audio_frame;
|
||||
|
||||
AVFrame *to_free;
|
||||
|
||||
FramePool *pool;
|
||||
|
||||
void *thread_ctx;
|
||||
|
||||
/**
|
||||
* Current packet as passed into the decoder, to avoid having to pass the
|
||||
* packet into every function.
|
||||
*/
|
||||
AVPacket *pkt;
|
||||
|
||||
/**
|
||||
* temporary buffer used for encoders to store their bitstream
|
||||
*/
|
||||
uint8_t *byte_buffer;
|
||||
unsigned int byte_buffer_size;
|
||||
|
||||
void *frame_thread_encoder;
|
||||
|
||||
/**
|
||||
* Number of audio samples to skip at the start of the next decoded frame
|
||||
*/
|
||||
int skip_samples;
|
||||
|
||||
/**
|
||||
* hwaccel-specific private data
|
||||
*/
|
||||
void *hwaccel_priv_data;
|
||||
|
||||
/**
|
||||
* checks API usage: after codec draining, flush is required to resume operation
|
||||
*/
|
||||
int draining;
|
||||
|
||||
/**
|
||||
* buffers for using new encode/decode API through legacy API
|
||||
*/
|
||||
AVPacket *buffer_pkt;
|
||||
int buffer_pkt_valid; // encoding: packet without data can be valid
|
||||
AVFrame *buffer_frame;
|
||||
int draining_done;
|
||||
} AVCodecInternal;
|
||||
|
||||
struct AVCodecDefault {
|
||||
const uint8_t *key;
|
||||
const uint8_t *value;
|
||||
};
|
||||
|
||||
extern const uint8_t ff_log2_run[41];
|
||||
|
||||
/**
|
||||
* Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
|
||||
* If there is no such matching pair then size is returned.
|
||||
*/
|
||||
int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
|
||||
|
||||
unsigned int avpriv_toupper4(unsigned int x);
|
||||
|
||||
/**
|
||||
* does needed setup of pkt_pts/pos and such for (re)get_buffer();
|
||||
*/
|
||||
int ff_init_buffer_info(AVCodecContext *s, AVFrame *frame);
|
||||
|
||||
|
||||
void ff_color_frame(AVFrame *frame, const int color[4]);
|
||||
|
||||
extern volatile int ff_avcodec_locked;
|
||||
int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec);
|
||||
int ff_unlock_avcodec(const AVCodec *codec);
|
||||
|
||||
int avpriv_lock_avformat(void);
|
||||
int avpriv_unlock_avformat(void);
|
||||
|
||||
/**
|
||||
* Maximum size in bytes of extradata.
|
||||
* This value was chosen such that every bit of the buffer is
|
||||
* addressable by a 32-bit signed integer as used by get_bits.
|
||||
*/
|
||||
#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE)
|
||||
|
||||
/**
|
||||
* Check AVPacket size and/or allocate data.
|
||||
*
|
||||
* Encoders supporting AVCodec.encode2() can use this as a convenience to
|
||||
* ensure the output packet data is large enough, whether provided by the user
|
||||
* or allocated in this function.
|
||||
*
|
||||
* @param avctx the AVCodecContext of the encoder
|
||||
* @param avpkt the AVPacket
|
||||
* If avpkt->data is already set, avpkt->size is checked
|
||||
* to ensure it is large enough.
|
||||
* If avpkt->data is NULL, a new buffer is allocated.
|
||||
* avpkt->size is set to the specified size.
|
||||
* All other AVPacket fields will be reset with av_init_packet().
|
||||
* @param size the minimum required packet size
|
||||
* @param min_size This is a hint to the allocation algorithm, which indicates
|
||||
* to what minimal size the caller might later shrink the packet
|
||||
* to. Encoders often allocate packets which are larger than the
|
||||
* amount of data that is written into them as the exact amount is
|
||||
* not known at the time of allocation. min_size represents the
|
||||
* size a packet might be shrunk to by the caller. Can be set to
|
||||
* 0. setting this roughly correctly allows the allocation code
|
||||
* to choose between several allocation strategies to improve
|
||||
* speed slightly.
|
||||
* @return non negative on success, negative error code on failure
|
||||
*/
|
||||
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size);
|
||||
|
||||
attribute_deprecated int ff_alloc_packet(AVPacket *avpkt, int size);
|
||||
|
||||
/**
|
||||
* Rescale from sample rate to AVCodecContext.time_base.
|
||||
*/
|
||||
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx,
|
||||
int64_t samples)
|
||||
{
|
||||
if(samples == AV_NOPTS_VALUE)
|
||||
return AV_NOPTS_VALUE;
|
||||
return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate },
|
||||
avctx->time_base);
|
||||
}
|
||||
|
||||
/**
|
||||
* 2^(x) for integer x
|
||||
* @return correctly rounded float
|
||||
*/
|
||||
static av_always_inline float ff_exp2fi(int x) {
|
||||
/* Normal range */
|
||||
if (-126 <= x && x <= 128)
|
||||
return av_int2float(x+127 << 23);
|
||||
/* Too large */
|
||||
else if (x > 128)
|
||||
return INFINITY;
|
||||
/* Subnormal numbers */
|
||||
else if (x > -150)
|
||||
return av_int2float(1 << (x+149));
|
||||
/* Negligibly small */
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a buffer for a frame. This is a wrapper around
|
||||
* AVCodecContext.get_buffer() and should be used instead calling get_buffer()
|
||||
* directly.
|
||||
*/
|
||||
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
|
||||
|
||||
/**
|
||||
* Identical in function to av_frame_make_writable(), except it uses
|
||||
* ff_get_buffer() to allocate the buffer when needed.
|
||||
*/
|
||||
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame);
|
||||
|
||||
int ff_thread_can_start_frame(AVCodecContext *avctx);
|
||||
|
||||
int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
|
||||
|
||||
/**
|
||||
* Call avcodec_open2 recursively by decrementing counter, unlocking mutex,
|
||||
* calling the function and then restoring again. Assumes the mutex is
|
||||
* already locked
|
||||
*/
|
||||
int ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
|
||||
|
||||
/**
|
||||
* Finalize buf into extradata and set its size appropriately.
|
||||
*/
|
||||
int avpriv_bprint_to_extradata(AVCodecContext *avctx, struct AVBPrint *buf);
|
||||
|
||||
const uint8_t *avpriv_find_start_code(const uint8_t *p,
|
||||
const uint8_t *end,
|
||||
uint32_t *state);
|
||||
|
||||
int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec);
|
||||
|
||||
/**
|
||||
* Check that the provided frame dimensions are valid and set them on the codec
|
||||
* context.
|
||||
*/
|
||||
int ff_set_dimensions(AVCodecContext *s, int width, int height);
|
||||
|
||||
/**
|
||||
* Check that the provided sample aspect ratio is valid and set it on the codec
|
||||
* context.
|
||||
*/
|
||||
int ff_set_sar(AVCodecContext *avctx, AVRational sar);
|
||||
|
||||
/**
|
||||
* Add or update AV_FRAME_DATA_MATRIXENCODING side data.
|
||||
*/
|
||||
int ff_side_data_update_matrix_encoding(AVFrame *frame,
|
||||
enum AVMatrixEncoding matrix_encoding);
|
||||
|
||||
/**
|
||||
* Select the (possibly hardware accelerated) pixel format.
|
||||
* This is a wrapper around AVCodecContext.get_format() and should be used
|
||||
* instead of calling get_format() directly.
|
||||
*/
|
||||
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
|
||||
|
||||
/**
|
||||
* Set various frame properties from the codec context / packet data.
|
||||
*/
|
||||
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame);
|
||||
|
||||
/**
|
||||
* Add a CPB properties side data to an encoding context.
|
||||
*/
|
||||
AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx);
|
||||
|
||||
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type);
|
||||
|
||||
/**
|
||||
* Check AVFrame for A53 side data and allocate and fill SEI message with A53 info
|
||||
*
|
||||
* @param frame Raw frame to get A53 side data from
|
||||
* @param prefix_len Number of bytes to allocate before SEI message
|
||||
* @param data Pointer to a variable to store allocated memory
|
||||
* Upon return the variable will hold NULL on error or if frame has no A53 info.
|
||||
* Otherwise it will point to prefix_len uninitialized bytes followed by
|
||||
* *sei_size SEI message
|
||||
* @param sei_size Pointer to a variable to store generated SEI message length
|
||||
* @return Zero on success, negative error code on failure
|
||||
*/
|
||||
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len,
|
||||
void **data, size_t *sei_size);
|
||||
|
||||
#endif /* AVCODEC_INTERNAL_H */
|
||||
1
media/ffvpx/libavcodec/log2_tab.c
Normal file
1
media/ffvpx/libavcodec/log2_tab.c
Normal file
|
|
@ -0,0 +1 @@
|
|||
#include "libavutil/log2_tab.c"
|
||||
252
media/ffvpx/libavcodec/mathops.h
Normal file
252
media/ffvpx/libavcodec/mathops.h
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
/*
|
||||
* simple math operations
|
||||
* Copyright (c) 2001, 2002 Fabrice Bellard
|
||||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
#ifndef AVCODEC_MATHOPS_H
|
||||
#define AVCODEC_MATHOPS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "config.h"
|
||||
|
||||
#define MAX_NEG_CROP 1024
|
||||
|
||||
extern const uint32_t ff_inverse[257];
|
||||
extern const uint8_t ff_sqrt_tab[256];
|
||||
extern const uint8_t ff_crop_tab[256 + 2 * MAX_NEG_CROP];
|
||||
extern const uint8_t ff_zigzag_direct[64];
|
||||
extern const uint8_t ff_zigzag_scan[16+1];
|
||||
|
||||
#if ARCH_ARM
|
||||
# include "arm/mathops.h"
|
||||
#elif ARCH_AVR32
|
||||
# include "avr32/mathops.h"
|
||||
#elif ARCH_MIPS
|
||||
# include "mips/mathops.h"
|
||||
#elif ARCH_PPC
|
||||
# include "ppc/mathops.h"
|
||||
#elif ARCH_X86
|
||||
# include "x86/mathops.h"
|
||||
#endif
|
||||
|
||||
/* generic implementation */
|
||||
|
||||
#ifndef MUL64
|
||||
# define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
|
||||
#endif
|
||||
|
||||
#ifndef MULL
|
||||
# define MULL(a,b,s) (MUL64(a, b) >> (s))
|
||||
#endif
|
||||
|
||||
#ifndef MULH
|
||||
static av_always_inline int MULH(int a, int b){
|
||||
return MUL64(a, b) >> 32;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef UMULH
|
||||
static av_always_inline unsigned UMULH(unsigned a, unsigned b){
|
||||
return ((uint64_t)(a) * (uint64_t)(b))>>32;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MAC64
|
||||
# define MAC64(d, a, b) ((d) += MUL64(a, b))
|
||||
#endif
|
||||
|
||||
#ifndef MLS64
|
||||
# define MLS64(d, a, b) ((d) -= MUL64(a, b))
|
||||
#endif
|
||||
|
||||
/* signed 16x16 -> 32 multiply add accumulate */
|
||||
#ifndef MAC16
|
||||
# define MAC16(rt, ra, rb) rt += (ra) * (rb)
|
||||
#endif
|
||||
|
||||
/* signed 16x16 -> 32 multiply */
|
||||
#ifndef MUL16
|
||||
# define MUL16(ra, rb) ((ra) * (rb))
|
||||
#endif
|
||||
|
||||
#ifndef MLS16
|
||||
# define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
|
||||
#endif
|
||||
|
||||
/* median of 3 */
|
||||
#ifndef mid_pred
|
||||
#define mid_pred mid_pred
|
||||
static inline av_const int mid_pred(int a, int b, int c)
|
||||
{
|
||||
#if 0
|
||||
int t= (a-b)&((a-b)>>31);
|
||||
a-=t;
|
||||
b+=t;
|
||||
b-= (b-c)&((b-c)>>31);
|
||||
b+= (a-b)&((a-b)>>31);
|
||||
|
||||
return b;
|
||||
#else
|
||||
if(a>b){
|
||||
if(c>b){
|
||||
if(c>a) b=a;
|
||||
else b=c;
|
||||
}
|
||||
}else{
|
||||
if(b>c){
|
||||
if(c>a) b=c;
|
||||
else b=a;
|
||||
}
|
||||
}
|
||||
return b;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef median4
|
||||
#define median4 median4
|
||||
static inline av_const int median4(int a, int b, int c, int d)
|
||||
{
|
||||
if (a < b) {
|
||||
if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
|
||||
else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
|
||||
} else {
|
||||
if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
|
||||
else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef sign_extend
|
||||
static inline av_const int sign_extend(int val, unsigned bits)
|
||||
{
|
||||
unsigned shift = 8 * sizeof(int) - bits;
|
||||
union { unsigned u; int s; } v = { (unsigned) val << shift };
|
||||
return v.s >> shift;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef zero_extend
|
||||
static inline av_const unsigned zero_extend(unsigned val, unsigned bits)
|
||||
{
|
||||
return (val << ((8 * sizeof(int)) - bits)) >> ((8 * sizeof(int)) - bits);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef COPY3_IF_LT
|
||||
#define COPY3_IF_LT(x, y, a, b, c, d)\
|
||||
if ((y) < (x)) {\
|
||||
(x) = (y);\
|
||||
(a) = (b);\
|
||||
(c) = (d);\
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MASK_ABS
|
||||
#define MASK_ABS(mask, level) do { \
|
||||
mask = level >> 31; \
|
||||
level = (level ^ mask) - mask; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef NEG_SSR32
|
||||
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
|
||||
#endif
|
||||
|
||||
#ifndef NEG_USR32
|
||||
# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
|
||||
#endif
|
||||
|
||||
#if HAVE_BIGENDIAN
|
||||
# ifndef PACK_2U8
|
||||
# define PACK_2U8(a,b) (((a) << 8) | (b))
|
||||
# endif
|
||||
# ifndef PACK_4U8
|
||||
# define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
||||
# endif
|
||||
# ifndef PACK_2U16
|
||||
# define PACK_2U16(a,b) (((a) << 16) | (b))
|
||||
# endif
|
||||
#else
|
||||
# ifndef PACK_2U8
|
||||
# define PACK_2U8(a,b) (((b) << 8) | (a))
|
||||
# endif
|
||||
# ifndef PACK_4U2
|
||||
# define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
|
||||
# endif
|
||||
# ifndef PACK_2U16
|
||||
# define PACK_2U16(a,b) (((b) << 16) | (a))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef PACK_2S8
|
||||
# define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
|
||||
#endif
|
||||
#ifndef PACK_4S8
|
||||
# define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
|
||||
#endif
|
||||
#ifndef PACK_2S16
|
||||
# define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
|
||||
#endif
|
||||
|
||||
#ifndef FASTDIV
|
||||
# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
|
||||
#endif /* FASTDIV */
|
||||
|
||||
#ifndef ff_sqrt
|
||||
#define ff_sqrt ff_sqrt
|
||||
static inline av_const unsigned int ff_sqrt(unsigned int a)
|
||||
{
|
||||
unsigned int b;
|
||||
|
||||
if (a < 255) return (ff_sqrt_tab[a + 1] - 1) >> 4;
|
||||
else if (a < (1 << 12)) b = ff_sqrt_tab[a >> 4] >> 2;
|
||||
#if !CONFIG_SMALL
|
||||
else if (a < (1 << 14)) b = ff_sqrt_tab[a >> 6] >> 1;
|
||||
else if (a < (1 << 16)) b = ff_sqrt_tab[a >> 8] ;
|
||||
#endif
|
||||
else {
|
||||
int s = av_log2_16bit(a >> 16) >> 1;
|
||||
unsigned int c = a >> (s + 2);
|
||||
b = ff_sqrt_tab[c >> (s + 8)];
|
||||
b = FASTDIV(c,b) + (b << s);
|
||||
}
|
||||
|
||||
return b - (a < b * b);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline av_const float ff_sqrf(float a)
|
||||
{
|
||||
return a*a;
|
||||
}
|
||||
|
||||
static inline int8_t ff_u8_to_s8(uint8_t a)
|
||||
{
|
||||
union {
|
||||
uint8_t u8;
|
||||
int8_t s8;
|
||||
} b;
|
||||
b.u8 = a;
|
||||
return b.s8;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_MATHOPS_H */
|
||||
114
media/ffvpx/libavcodec/mathtables.c
Normal file
114
media/ffvpx/libavcodec/mathtables.c
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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 <stdint.h>
|
||||
|
||||
#include "mathops.h"
|
||||
|
||||
/* a*inverse[b]>>32 == a/b for all 0<=a<=16909558 && 2<=b<=256
|
||||
* for a>16909558, is an overestimate by less than 1 part in 1<<24 */
|
||||
const uint32_t ff_inverse[257]={
|
||||
0, 4294967295U,2147483648U,1431655766, 1073741824, 858993460, 715827883, 613566757,
|
||||
536870912, 477218589, 429496730, 390451573, 357913942, 330382100, 306783379, 286331154,
|
||||
268435456, 252645136, 238609295, 226050911, 214748365, 204522253, 195225787, 186737709,
|
||||
178956971, 171798692, 165191050, 159072863, 153391690, 148102321, 143165577, 138547333,
|
||||
134217728, 130150525, 126322568, 122713352, 119304648, 116080198, 113025456, 110127367,
|
||||
107374183, 104755300, 102261127, 99882961, 97612894, 95443718, 93368855, 91382283,
|
||||
89478486, 87652394, 85899346, 84215046, 82595525, 81037119, 79536432, 78090315,
|
||||
76695845, 75350304, 74051161, 72796056, 71582789, 70409300, 69273667, 68174085,
|
||||
67108864, 66076420, 65075263, 64103990, 63161284, 62245903, 61356676, 60492498,
|
||||
59652324, 58835169, 58040099, 57266231, 56512728, 55778797, 55063684, 54366675,
|
||||
53687092, 53024288, 52377650, 51746594, 51130564, 50529028, 49941481, 49367441,
|
||||
48806447, 48258060, 47721859, 47197443, 46684428, 46182445, 45691142, 45210183,
|
||||
44739243, 44278014, 43826197, 43383509, 42949673, 42524429, 42107523, 41698712,
|
||||
41297763, 40904451, 40518560, 40139882, 39768216, 39403370, 39045158, 38693400,
|
||||
38347923, 38008561, 37675152, 37347542, 37025581, 36709123, 36398028, 36092163,
|
||||
35791395, 35495598, 35204650, 34918434, 34636834, 34359739, 34087043, 33818641,
|
||||
33554432, 33294321, 33038210, 32786010, 32537632, 32292988, 32051995, 31814573,
|
||||
31580642, 31350127, 31122952, 30899046, 30678338, 30460761, 30246249, 30034737,
|
||||
29826162, 29620465, 29417585, 29217465, 29020050, 28825284, 28633116, 28443493,
|
||||
28256364, 28071682, 27889399, 27709467, 27531842, 27356480, 27183338, 27012373,
|
||||
26843546, 26676816, 26512144, 26349493, 26188825, 26030105, 25873297, 25718368,
|
||||
25565282, 25414008, 25264514, 25116768, 24970741, 24826401, 24683721, 24542671,
|
||||
24403224, 24265352, 24129030, 23994231, 23860930, 23729102, 23598722, 23469767,
|
||||
23342214, 23216040, 23091223, 22967740, 22845571, 22724695, 22605092, 22486740,
|
||||
22369622, 22253717, 22139007, 22025474, 21913099, 21801865, 21691755, 21582751,
|
||||
21474837, 21367997, 21262215, 21157475, 21053762, 20951060, 20849356, 20748635,
|
||||
20648882, 20550083, 20452226, 20355296, 20259280, 20164166, 20069941, 19976593,
|
||||
19884108, 19792477, 19701685, 19611723, 19522579, 19434242, 19346700, 19259944,
|
||||
19173962, 19088744, 19004281, 18920561, 18837576, 18755316, 18673771, 18592933,
|
||||
18512791, 18433337, 18354562, 18276457, 18199014, 18122225, 18046082, 17970575,
|
||||
17895698, 17821442, 17747799, 17674763, 17602325, 17530479, 17459217, 17388532,
|
||||
17318417, 17248865, 17179870, 17111424, 17043522, 16976156, 16909321, 16843010,
|
||||
16777216
|
||||
};
|
||||
|
||||
const uint8_t ff_sqrt_tab[256]={
|
||||
0, 16, 23, 28, 32, 36, 40, 43, 46, 48, 51, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90,
|
||||
91, 92, 94, 95, 96, 98, 99,100,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,151,152,153,154,155,156,156,
|
||||
157,158,159,160,160,161,162,163,164,164,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181,
|
||||
182,182,183,184,184,185,186,186,187,188,188,189,190,190,191,192,192,193,194,194,195,196,196,197,198,198,199,200,200,201,202,202,
|
||||
203,204,204,205,205,206,207,207,208,208,209,210,210,211,212,212,213,213,214,215,215,216,216,217,218,218,219,219,220,220,221,222,
|
||||
222,223,223,224,224,225,226,226,227,227,228,228,229,230,230,231,231,232,232,233,233,234,235,235,236,236,237,237,238,238,239,239,
|
||||
240,240,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,255
|
||||
};
|
||||
|
||||
#define times4(x) x, x, x, x
|
||||
#define times256(x) times4(times4(times4(times4(times4(x)))))
|
||||
|
||||
const uint8_t ff_crop_tab[256 + 2 * MAX_NEG_CROP] = {
|
||||
times256(0x00),
|
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
|
||||
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
|
||||
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
|
||||
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
|
||||
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
|
||||
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
|
||||
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
|
||||
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
|
||||
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
|
||||
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
|
||||
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
|
||||
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
|
||||
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
|
||||
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
|
||||
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
|
||||
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
|
||||
times256(0xFF)
|
||||
};
|
||||
|
||||
const uint8_t ff_zigzag_direct[64] = {
|
||||
0, 1, 8, 16, 9, 2, 3, 10,
|
||||
17, 24, 32, 25, 18, 11, 4, 5,
|
||||
12, 19, 26, 33, 40, 48, 41, 34,
|
||||
27, 20, 13, 6, 7, 14, 21, 28,
|
||||
35, 42, 49, 56, 57, 50, 43, 36,
|
||||
29, 22, 15, 23, 30, 37, 44, 51,
|
||||
58, 59, 52, 45, 38, 31, 39, 46,
|
||||
53, 60, 61, 54, 47, 55, 62, 63
|
||||
};
|
||||
|
||||
const uint8_t ff_zigzag_scan[16+1] = {
|
||||
0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4,
|
||||
1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4,
|
||||
1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4,
|
||||
3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4,
|
||||
};
|
||||
96
media/ffvpx/libavcodec/me_cmp.h
Normal file
96
media/ffvpx/libavcodec/me_cmp.h
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_ME_CMP_H
|
||||
#define AVCODEC_ME_CMP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
extern uint32_t ff_square_tab[512];
|
||||
|
||||
|
||||
/* minimum alignment rules ;)
|
||||
* If you notice errors in the align stuff, need more alignment for some ASM code
|
||||
* for some CPU or need to use a function with less aligned data then send a mail
|
||||
* to the ffmpeg-devel mailing list, ...
|
||||
*
|
||||
* !warning These alignments might not match reality, (missing attribute((align))
|
||||
* stuff somewhere possible).
|
||||
* I (Michael) did not check them, these are just the alignments which I think
|
||||
* could be reached easily ...
|
||||
*
|
||||
* !future video codecs might need functions with less strict alignment
|
||||
*/
|
||||
|
||||
struct MpegEncContext;
|
||||
/* Motion estimation:
|
||||
* h is limited to { width / 2, width, 2 * width },
|
||||
* but never larger than 16 and never smaller than 2.
|
||||
* Although currently h < 4 is not used as functions with
|
||||
* width < 8 are neither used nor implemented. */
|
||||
typedef int (*me_cmp_func)(struct MpegEncContext *c,
|
||||
uint8_t *blk1 /* align width (8 or 16) */,
|
||||
uint8_t *blk2 /* align 1 */, ptrdiff_t stride,
|
||||
int h);
|
||||
|
||||
typedef struct MECmpContext {
|
||||
int (*sum_abs_dctelem)(int16_t *block /* align 16 */);
|
||||
|
||||
me_cmp_func sad[6]; /* identical to pix_absAxA except additional void * */
|
||||
me_cmp_func sse[6];
|
||||
me_cmp_func hadamard8_diff[6];
|
||||
me_cmp_func dct_sad[6];
|
||||
me_cmp_func quant_psnr[6];
|
||||
me_cmp_func bit[6];
|
||||
me_cmp_func rd[6];
|
||||
me_cmp_func vsad[6];
|
||||
me_cmp_func vsse[6];
|
||||
me_cmp_func nsse[6];
|
||||
me_cmp_func w53[6];
|
||||
me_cmp_func w97[6];
|
||||
me_cmp_func dct_max[6];
|
||||
me_cmp_func dct264_sad[6];
|
||||
|
||||
me_cmp_func me_pre_cmp[6];
|
||||
me_cmp_func me_cmp[6];
|
||||
me_cmp_func me_sub_cmp[6];
|
||||
me_cmp_func mb_cmp[6];
|
||||
me_cmp_func ildct_cmp[6]; // only width 16 used
|
||||
me_cmp_func frame_skip_cmp[6]; // only width 8 used
|
||||
|
||||
me_cmp_func pix_abs[2][4];
|
||||
} MECmpContext;
|
||||
|
||||
void ff_me_cmp_init_static(void);
|
||||
|
||||
int ff_check_alignment(void);
|
||||
|
||||
void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx);
|
||||
void ff_me_cmp_init_alpha(MECmpContext *c, AVCodecContext *avctx);
|
||||
void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx);
|
||||
void ff_me_cmp_init_ppc(MECmpContext *c, AVCodecContext *avctx);
|
||||
void ff_me_cmp_init_x86(MECmpContext *c, AVCodecContext *avctx);
|
||||
void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx);
|
||||
|
||||
void ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type);
|
||||
|
||||
void ff_dsputil_init_dwt(MECmpContext *c);
|
||||
|
||||
#endif /* AVCODEC_ME_CMP_H */
|
||||
135
media/ffvpx/libavcodec/motion_est.h
Normal file
135
media/ffvpx/libavcodec/motion_est.h
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* Motion estimation
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MOTION_EST_H
|
||||
#define AVCODEC_MOTION_EST_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "hpeldsp.h"
|
||||
#include "qpeldsp.h"
|
||||
|
||||
struct MpegEncContext;
|
||||
|
||||
#if ARCH_IA64 // Limit static arrays to avoid gcc failing "short data segment overflowed"
|
||||
#define MAX_MV 1024
|
||||
#else
|
||||
#define MAX_MV 4096
|
||||
#endif
|
||||
#define MAX_DMV (2*MAX_MV)
|
||||
#define ME_MAP_SIZE 64
|
||||
|
||||
#define FF_ME_ZERO 0
|
||||
#define FF_ME_EPZS 1
|
||||
#define FF_ME_XONE 2
|
||||
|
||||
/**
|
||||
* Motion estimation context.
|
||||
*/
|
||||
typedef struct MotionEstContext {
|
||||
AVCodecContext *avctx;
|
||||
int skip; ///< set if ME is skipped for the current MB
|
||||
int co_located_mv[4][2]; ///< mv from last P-frame for direct mode ME
|
||||
int direct_basis_mv[4][2];
|
||||
uint8_t *scratchpad; /**< data area for the ME algo, so that
|
||||
* the ME does not need to malloc/free. */
|
||||
uint8_t *best_mb;
|
||||
uint8_t *temp_mb[2];
|
||||
uint8_t *temp;
|
||||
int best_bits;
|
||||
uint32_t *map; ///< map to avoid duplicate evaluations
|
||||
uint32_t *score_map; ///< map to store the scores
|
||||
unsigned map_generation;
|
||||
int pre_penalty_factor;
|
||||
int penalty_factor; /**< an estimate of the bits required to
|
||||
* code a given mv value, e.g. (1,0) takes
|
||||
* more bits than (0,0). We have to
|
||||
* estimate whether any reduction in
|
||||
* residual is worth the extra bits. */
|
||||
int sub_penalty_factor;
|
||||
int mb_penalty_factor;
|
||||
int flags;
|
||||
int sub_flags;
|
||||
int mb_flags;
|
||||
int pre_pass; ///< = 1 for the pre pass
|
||||
int dia_size;
|
||||
int xmin;
|
||||
int xmax;
|
||||
int ymin;
|
||||
int ymax;
|
||||
int pred_x;
|
||||
int pred_y;
|
||||
uint8_t *src[4][4];
|
||||
uint8_t *ref[4][4];
|
||||
int stride;
|
||||
int uvstride;
|
||||
/* temp variables for picture complexity calculation */
|
||||
int64_t mc_mb_var_sum_temp;
|
||||
int64_t mb_var_sum_temp;
|
||||
int scene_change_score;
|
||||
|
||||
op_pixels_func(*hpel_put)[4];
|
||||
op_pixels_func(*hpel_avg)[4];
|
||||
qpel_mc_func(*qpel_put)[16];
|
||||
qpel_mc_func(*qpel_avg)[16];
|
||||
uint8_t (*mv_penalty)[MAX_DMV * 2 + 1]; ///< bit amount needed to encode a MV
|
||||
uint8_t *current_mv_penalty;
|
||||
int (*sub_motion_search)(struct MpegEncContext *s,
|
||||
int *mx_ptr, int *my_ptr, int dmin,
|
||||
int src_index, int ref_index,
|
||||
int size, int h);
|
||||
} MotionEstContext;
|
||||
|
||||
static inline int ff_h263_round_chroma(int x)
|
||||
{
|
||||
//FIXME static or not?
|
||||
static const uint8_t h263_chroma_roundtab[16] = {
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
|
||||
};
|
||||
return h263_chroma_roundtab[x & 0xf] + (x >> 3);
|
||||
}
|
||||
|
||||
int ff_init_me(struct MpegEncContext *s);
|
||||
|
||||
void ff_estimate_p_frame_motion(struct MpegEncContext *s, int mb_x, int mb_y);
|
||||
void ff_estimate_b_frame_motion(struct MpegEncContext *s, int mb_x, int mb_y);
|
||||
|
||||
int ff_pre_estimate_p_frame_motion(struct MpegEncContext *s,
|
||||
int mb_x, int mb_y);
|
||||
|
||||
int ff_epzs_motion_search(struct MpegEncContext *s, int *mx_ptr, int *my_ptr,
|
||||
int P[10][2], int src_index, int ref_index,
|
||||
int16_t (*last_mv)[2], int ref_mv_scale, int size,
|
||||
int h);
|
||||
|
||||
int ff_get_mb_score(struct MpegEncContext *s, int mx, int my, int src_index,
|
||||
int ref_index, int size, int h, int add_rate);
|
||||
|
||||
int ff_get_best_fcode(struct MpegEncContext *s,
|
||||
int16_t (*mv_table)[2], int type);
|
||||
|
||||
void ff_fix_long_p_mvs(struct MpegEncContext *s);
|
||||
void ff_fix_long_mvs(struct MpegEncContext *s, uint8_t *field_select_table,
|
||||
int field_select, int16_t (*mv_table)[2], int f_code,
|
||||
int type, int truncate);
|
||||
|
||||
#endif /* AVCODEC_MOTION_EST_H */
|
||||
65
media/ffvpx/libavcodec/moz.build
Normal file
65
media/ffvpx/libavcodec/moz.build
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# Due to duplicate file names, we compile libavutil/x86 in its own
|
||||
# moz.build file.
|
||||
if CONFIG['FFVPX_ASFLAGS']:
|
||||
DIRS += ['x86']
|
||||
|
||||
SharedLibrary('mozavcodec')
|
||||
SOURCES += [
|
||||
'allcodecs.c',
|
||||
'audioconvert.c',
|
||||
'avpacket.c',
|
||||
'avpicture.c',
|
||||
'bitstream.c',
|
||||
'codec_desc.c',
|
||||
'dummy_funcs.c',
|
||||
'flac.c',
|
||||
'flac_parser.c',
|
||||
'flacdata.c',
|
||||
'flacdec.c',
|
||||
'flacdsp.c',
|
||||
'golomb.c',
|
||||
'h264pred.c',
|
||||
'imgconvert.c',
|
||||
'log2_tab.c',
|
||||
'mathtables.c',
|
||||
'options.c',
|
||||
'parser.c',
|
||||
'profiles.c',
|
||||
'pthread.c',
|
||||
'pthread_frame.c',
|
||||
'pthread_slice.c',
|
||||
'qsv_api.c',
|
||||
'raw.c',
|
||||
'resample.c',
|
||||
'resample2.c',
|
||||
'reverse.c',
|
||||
'utils.c',
|
||||
'videodsp.c',
|
||||
'vorbis_parser.c',
|
||||
'vp56rac.c',
|
||||
'vp8.c',
|
||||
'vp8_parser.c',
|
||||
'vp8dsp.c',
|
||||
'vp9.c',
|
||||
'vp9_parser.c',
|
||||
'vp9dsp.c',
|
||||
'vp9dsp_10bpp.c',
|
||||
'vp9dsp_12bpp.c',
|
||||
'vp9dsp_8bpp.c',
|
||||
'xiph.c'
|
||||
]
|
||||
|
||||
SYMBOLS_FILE = 'avcodec.symbols'
|
||||
NO_VISIBILITY_FLAGS = True
|
||||
|
||||
USE_LIBS += [
|
||||
'mozavutil'
|
||||
]
|
||||
|
||||
include("../ffvpxcommon.mozbuild")
|
||||
57
media/ffvpx/libavcodec/mpeg12data.h
Normal file
57
media/ffvpx/libavcodec/mpeg12data.h
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* MPEG-1/2 tables
|
||||
* copyright (c) 2000,2001 Fabrice Bellard
|
||||
* copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* MPEG-1/2 tables.
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEG12DATA_H
|
||||
#define AVCODEC_MPEG12DATA_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "libavutil/rational.h"
|
||||
#include "rl.h"
|
||||
|
||||
extern const uint16_t ff_mpeg1_default_intra_matrix[];
|
||||
extern const uint16_t ff_mpeg1_default_non_intra_matrix[64];
|
||||
|
||||
extern const uint16_t ff_mpeg12_vlc_dc_lum_code[12];
|
||||
extern const unsigned char ff_mpeg12_vlc_dc_lum_bits[12];
|
||||
extern const uint16_t ff_mpeg12_vlc_dc_chroma_code[12];
|
||||
extern const unsigned char ff_mpeg12_vlc_dc_chroma_bits[12];
|
||||
|
||||
extern RLTable ff_rl_mpeg1;
|
||||
extern RLTable ff_rl_mpeg2;
|
||||
|
||||
extern const uint8_t ff_mpeg12_mbAddrIncrTable[36][2];
|
||||
extern const uint8_t ff_mpeg12_mbPatTable[64][2];
|
||||
|
||||
extern const uint8_t ff_mpeg12_mbMotionVectorTable[17][2];
|
||||
|
||||
extern const AVRational ff_mpeg12_frame_rate_tab[];
|
||||
extern const AVRational ff_mpeg2_frame_rate_tab[];
|
||||
|
||||
extern const float ff_mpeg1_aspect[16];
|
||||
extern const AVRational ff_mpeg2_aspect[16];
|
||||
|
||||
#endif /* AVCODEC_MPEG12DATA_H */
|
||||
114
media/ffvpx/libavcodec/mpegpicture.h
Normal file
114
media/ffvpx/libavcodec/mpegpicture.h
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Mpeg video formats-related defines and utility functions
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGPICTURE_H
|
||||
#define AVCODEC_MPEGPICTURE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libavutil/frame.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "motion_est.h"
|
||||
#include "thread.h"
|
||||
|
||||
#define MAX_PICTURE_COUNT 36
|
||||
#define EDGE_WIDTH 16
|
||||
|
||||
typedef struct ScratchpadContext {
|
||||
uint8_t *edge_emu_buffer; ///< temporary buffer for if MVs point to out-of-frame data
|
||||
uint8_t *rd_scratchpad; ///< scratchpad for rate distortion mb decision
|
||||
uint8_t *obmc_scratchpad;
|
||||
uint8_t *b_scratchpad; ///< scratchpad used for writing into write only buffers
|
||||
} ScratchpadContext;
|
||||
|
||||
/**
|
||||
* Picture.
|
||||
*/
|
||||
typedef struct Picture {
|
||||
struct AVFrame *f;
|
||||
ThreadFrame tf;
|
||||
|
||||
AVBufferRef *qscale_table_buf;
|
||||
int8_t *qscale_table;
|
||||
|
||||
AVBufferRef *motion_val_buf[2];
|
||||
int16_t (*motion_val[2])[2];
|
||||
|
||||
AVBufferRef *mb_type_buf;
|
||||
uint32_t *mb_type; ///< types and macros are defined in mpegutils.h
|
||||
|
||||
AVBufferRef *mbskip_table_buf;
|
||||
uint8_t *mbskip_table;
|
||||
|
||||
AVBufferRef *ref_index_buf[2];
|
||||
int8_t *ref_index[2];
|
||||
|
||||
AVBufferRef *mb_var_buf;
|
||||
uint16_t *mb_var; ///< Table for MB variances
|
||||
|
||||
AVBufferRef *mc_mb_var_buf;
|
||||
uint16_t *mc_mb_var; ///< Table for motion compensated MB variances
|
||||
|
||||
int alloc_mb_width; ///< mb_width used to allocate tables
|
||||
int alloc_mb_height; ///< mb_height used to allocate tables
|
||||
|
||||
AVBufferRef *mb_mean_buf;
|
||||
uint8_t *mb_mean; ///< Table for MB luminance
|
||||
|
||||
AVBufferRef *hwaccel_priv_buf;
|
||||
void *hwaccel_picture_private; ///< Hardware accelerator private data
|
||||
|
||||
int field_picture; ///< whether or not the picture was encoded in separate fields
|
||||
|
||||
int64_t mb_var_sum; ///< sum of MB variance for current frame
|
||||
int64_t mc_mb_var_sum; ///< motion compensated MB variance for current frame
|
||||
|
||||
int b_frame_score;
|
||||
int needs_realloc; ///< Picture needs to be reallocated (eg due to a frame size change)
|
||||
|
||||
int reference;
|
||||
int shared;
|
||||
|
||||
uint64_t encoding_error[AV_NUM_DATA_POINTERS];
|
||||
} Picture;
|
||||
|
||||
/**
|
||||
* Allocate a Picture.
|
||||
* The pixels are allocated/set by calling get_buffer() if shared = 0.
|
||||
*/
|
||||
int ff_alloc_picture(AVCodecContext *avctx, Picture *pic, MotionEstContext *me,
|
||||
ScratchpadContext *sc, int shared, int encoding,
|
||||
int chroma_x_shift, int chroma_y_shift, int out_format,
|
||||
int mb_stride, int mb_width, int mb_height, int b8_stride,
|
||||
ptrdiff_t *linesize, ptrdiff_t *uvlinesize);
|
||||
|
||||
int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me,
|
||||
ScratchpadContext *sc, int linesize);
|
||||
|
||||
int ff_mpeg_ref_picture(AVCodecContext *avctx, Picture *dst, Picture *src);
|
||||
void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *picture);
|
||||
|
||||
void ff_free_picture_tables(Picture *pic);
|
||||
int ff_update_picture_tables(Picture *dst, Picture *src);
|
||||
|
||||
int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared);
|
||||
|
||||
#endif /* AVCODEC_MPEGPICTURE_H */
|
||||
142
media/ffvpx/libavcodec/mpegutils.h
Normal file
142
media/ffvpx/libavcodec/mpegutils.h
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* Mpeg video formats-related defines and utility functions
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGUTILS_H
|
||||
#define AVCODEC_MPEGUTILS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libavutil/frame.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "version.h"
|
||||
|
||||
/**
|
||||
* Return value for header parsers if frame is not coded.
|
||||
* */
|
||||
#define FRAME_SKIPPED 100
|
||||
|
||||
/* picture type */
|
||||
#define PICT_TOP_FIELD 1
|
||||
#define PICT_BOTTOM_FIELD 2
|
||||
#define PICT_FRAME 3
|
||||
|
||||
/**
|
||||
* Value of Picture.reference when Picture is not a reference picture, but
|
||||
* is held for delayed output.
|
||||
*/
|
||||
#define DELAYED_PIC_REF 4
|
||||
|
||||
#define MAX_MB_BYTES (30 * 16 * 16 * 3 / 8 + 120)
|
||||
#define MAX_FCODE 7
|
||||
|
||||
/* MB types */
|
||||
#if !FF_API_MB_TYPE
|
||||
#define MB_TYPE_INTRA4x4 (1 << 0)
|
||||
#define MB_TYPE_INTRA16x16 (1 << 1) // FIXME H.264-specific
|
||||
#define MB_TYPE_INTRA_PCM (1 << 2) // FIXME H.264-specific
|
||||
#define MB_TYPE_16x16 (1 << 3)
|
||||
#define MB_TYPE_16x8 (1 << 4)
|
||||
#define MB_TYPE_8x16 (1 << 5)
|
||||
#define MB_TYPE_8x8 (1 << 6)
|
||||
#define MB_TYPE_INTERLACED (1 << 7)
|
||||
#define MB_TYPE_DIRECT2 (1 << 8) // FIXME
|
||||
#define MB_TYPE_ACPRED (1 << 9)
|
||||
#define MB_TYPE_GMC (1 << 10)
|
||||
#define MB_TYPE_SKIP (1 << 11)
|
||||
#define MB_TYPE_P0L0 (1 << 12)
|
||||
#define MB_TYPE_P1L0 (1 << 13)
|
||||
#define MB_TYPE_P0L1 (1 << 14)
|
||||
#define MB_TYPE_P1L1 (1 << 15)
|
||||
#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0)
|
||||
#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1)
|
||||
#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1)
|
||||
#define MB_TYPE_QUANT (1 << 16)
|
||||
#define MB_TYPE_CBP (1 << 17)
|
||||
#endif
|
||||
|
||||
#define MB_TYPE_INTRA MB_TYPE_INTRA4x4 // default mb_type if there is just one type
|
||||
|
||||
#define IS_INTRA4x4(a) ((a) & MB_TYPE_INTRA4x4)
|
||||
#define IS_INTRA16x16(a) ((a) & MB_TYPE_INTRA16x16)
|
||||
#define IS_PCM(a) ((a) & MB_TYPE_INTRA_PCM)
|
||||
#define IS_INTRA(a) ((a) & 7)
|
||||
#define IS_INTER(a) ((a) & (MB_TYPE_16x16 | MB_TYPE_16x8 | \
|
||||
MB_TYPE_8x16 | MB_TYPE_8x8))
|
||||
#define IS_SKIP(a) ((a) & MB_TYPE_SKIP)
|
||||
#define IS_INTRA_PCM(a) ((a) & MB_TYPE_INTRA_PCM)
|
||||
#define IS_INTERLACED(a) ((a) & MB_TYPE_INTERLACED)
|
||||
#define IS_DIRECT(a) ((a) & MB_TYPE_DIRECT2)
|
||||
#define IS_GMC(a) ((a) & MB_TYPE_GMC)
|
||||
#define IS_16X16(a) ((a) & MB_TYPE_16x16)
|
||||
#define IS_16X8(a) ((a) & MB_TYPE_16x8)
|
||||
#define IS_8X16(a) ((a) & MB_TYPE_8x16)
|
||||
#define IS_8X8(a) ((a) & MB_TYPE_8x8)
|
||||
#define IS_SUB_8X8(a) ((a) & MB_TYPE_16x16) // note reused
|
||||
#define IS_SUB_8X4(a) ((a) & MB_TYPE_16x8) // note reused
|
||||
#define IS_SUB_4X8(a) ((a) & MB_TYPE_8x16) // note reused
|
||||
#define IS_SUB_4X4(a) ((a) & MB_TYPE_8x8) // note reused
|
||||
#define IS_ACPRED(a) ((a) & MB_TYPE_ACPRED)
|
||||
#define IS_QUANT(a) ((a) & MB_TYPE_QUANT)
|
||||
#define IS_DIR(a, part, list) ((a) & (MB_TYPE_P0L0 << ((part) + 2 * (list))))
|
||||
|
||||
// does this mb use listX, note does not work if subMBs
|
||||
#define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0 | MB_TYPE_P1L0) << (2 * (list))))
|
||||
|
||||
#define HAS_CBP(a) ((a) & MB_TYPE_CBP)
|
||||
|
||||
/* MB types for encoding */
|
||||
#define CANDIDATE_MB_TYPE_INTRA (1 << 0)
|
||||
#define CANDIDATE_MB_TYPE_INTER (1 << 1)
|
||||
#define CANDIDATE_MB_TYPE_INTER4V (1 << 2)
|
||||
#define CANDIDATE_MB_TYPE_SKIPPED (1 << 3)
|
||||
|
||||
#define CANDIDATE_MB_TYPE_DIRECT (1 << 4)
|
||||
#define CANDIDATE_MB_TYPE_FORWARD (1 << 5)
|
||||
#define CANDIDATE_MB_TYPE_BACKWARD (1 << 6)
|
||||
#define CANDIDATE_MB_TYPE_BIDIR (1 << 7)
|
||||
|
||||
#define CANDIDATE_MB_TYPE_INTER_I (1 << 8)
|
||||
#define CANDIDATE_MB_TYPE_FORWARD_I (1 << 9)
|
||||
#define CANDIDATE_MB_TYPE_BACKWARD_I (1 << 10)
|
||||
#define CANDIDATE_MB_TYPE_BIDIR_I (1 << 11)
|
||||
|
||||
#define CANDIDATE_MB_TYPE_DIRECT0 (1 << 12)
|
||||
|
||||
#define INPLACE_OFFSET 16
|
||||
|
||||
enum OutputFormat {
|
||||
FMT_MPEG1,
|
||||
FMT_H261,
|
||||
FMT_H263,
|
||||
FMT_MJPEG,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Draw a horizontal band if supported.
|
||||
*
|
||||
* @param h is the normal height, this will be reduced automatically if needed
|
||||
*/
|
||||
void ff_draw_horiz_band(AVCodecContext *avctx, AVFrame *cur, AVFrame *last,
|
||||
int y, int h, int picture_structure, int first_field,
|
||||
int low_delay);
|
||||
|
||||
#endif /* AVCODEC_MPEGUTILS_H */
|
||||
752
media/ffvpx/libavcodec/mpegvideo.h
Normal file
752
media/ffvpx/libavcodec/mpegvideo.h
Normal file
|
|
@ -0,0 +1,752 @@
|
|||
/*
|
||||
* Generic DCT based hybrid video encoder
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer
|
||||
*
|
||||
* 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
|
||||
* mpegvideo header.
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGVIDEO_H
|
||||
#define AVCODEC_MPEGVIDEO_H
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "blockdsp.h"
|
||||
#include "error_resilience.h"
|
||||
#include "fdctdsp.h"
|
||||
#include "get_bits.h"
|
||||
#include "h264chroma.h"
|
||||
#include "h263dsp.h"
|
||||
#include "hpeldsp.h"
|
||||
#include "idctdsp.h"
|
||||
#include "internal.h"
|
||||
#include "me_cmp.h"
|
||||
#include "motion_est.h"
|
||||
#include "mpegpicture.h"
|
||||
#include "mpegvideodsp.h"
|
||||
#include "mpegvideoencdsp.h"
|
||||
#include "pixblockdsp.h"
|
||||
#include "put_bits.h"
|
||||
#include "ratecontrol.h"
|
||||
#include "parser.h"
|
||||
#include "mpegutils.h"
|
||||
#include "mpeg12data.h"
|
||||
#include "qpeldsp.h"
|
||||
#include "thread.h"
|
||||
#include "videodsp.h"
|
||||
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/timecode.h"
|
||||
|
||||
#define MAX_THREADS 32
|
||||
|
||||
#define MAX_B_FRAMES 16
|
||||
|
||||
/* Start codes. */
|
||||
#define SEQ_END_CODE 0x000001b7
|
||||
#define SEQ_START_CODE 0x000001b3
|
||||
#define GOP_START_CODE 0x000001b8
|
||||
#define PICTURE_START_CODE 0x00000100
|
||||
#define SLICE_MIN_START_CODE 0x00000101
|
||||
#define SLICE_MAX_START_CODE 0x000001af
|
||||
#define EXT_START_CODE 0x000001b5
|
||||
#define USER_START_CODE 0x000001b2
|
||||
|
||||
/**
|
||||
* MpegEncContext.
|
||||
*/
|
||||
typedef struct MpegEncContext {
|
||||
AVClass *class;
|
||||
|
||||
int y_dc_scale, c_dc_scale;
|
||||
int ac_pred;
|
||||
int block_last_index[12]; ///< last non zero coefficient in block
|
||||
int h263_aic; ///< Advanced INTRA Coding (AIC)
|
||||
|
||||
/* scantables */
|
||||
ScanTable inter_scantable; ///< if inter == intra then intra should be used to reduce the cache usage
|
||||
ScanTable intra_scantable;
|
||||
ScanTable intra_h_scantable;
|
||||
ScanTable intra_v_scantable;
|
||||
|
||||
/* WARNING: changes above this line require updates to hardcoded
|
||||
* offsets used in ASM. */
|
||||
|
||||
struct AVCodecContext *avctx;
|
||||
/* the following parameters must be initialized before encoding */
|
||||
int width, height;///< picture size. must be a multiple of 16
|
||||
int gop_size;
|
||||
int intra_only; ///< if true, only intra pictures are generated
|
||||
int64_t bit_rate; ///< wanted bit rate
|
||||
enum OutputFormat out_format; ///< output format
|
||||
int h263_pred; ///< use MPEG-4/H.263 ac/dc predictions
|
||||
int pb_frame; ///< PB-frame mode (0 = none, 1 = base, 2 = improved)
|
||||
|
||||
/* the following codec id fields are deprecated in favor of codec_id */
|
||||
int h263_plus; ///< H.263+ headers
|
||||
int h263_flv; ///< use flv H.263 header
|
||||
|
||||
enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
|
||||
int fixed_qscale; ///< fixed qscale if non zero
|
||||
int encoding; ///< true if we are encoding (vs decoding)
|
||||
int max_b_frames; ///< max number of B-frames for encoding
|
||||
int luma_elim_threshold;
|
||||
int chroma_elim_threshold;
|
||||
int strict_std_compliance; ///< strictly follow the std (MPEG-4, ...)
|
||||
int workaround_bugs; ///< workaround bugs in encoders which cannot be detected automatically
|
||||
int codec_tag; ///< internal codec_tag upper case converted from avctx codec_tag
|
||||
/* the following fields are managed internally by the encoder */
|
||||
|
||||
/* sequence parameters */
|
||||
int context_initialized;
|
||||
int input_picture_number; ///< used to set pic->display_picture_number, should not be used for/by anything else
|
||||
int coded_picture_number; ///< used to set pic->coded_picture_number, should not be used for/by anything else
|
||||
int picture_number; //FIXME remove, unclear definition
|
||||
int picture_in_gop_number; ///< 0-> first pic in gop, ...
|
||||
int mb_width, mb_height; ///< number of MBs horizontally & vertically
|
||||
int mb_stride; ///< mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11
|
||||
int b8_stride; ///< 2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
|
||||
int h_edge_pos, v_edge_pos;///< horizontal / vertical position of the right/bottom edge (pixel replication)
|
||||
int mb_num; ///< number of MBs of a picture
|
||||
ptrdiff_t linesize; ///< line size, in bytes, may be different from width
|
||||
ptrdiff_t uvlinesize; ///< line size, for chroma in bytes, may be different from width
|
||||
Picture *picture; ///< main picture buffer
|
||||
Picture **input_picture; ///< next pictures on display order for encoding
|
||||
Picture **reordered_input_picture; ///< pointer to the next pictures in coded order for encoding
|
||||
|
||||
int64_t user_specified_pts; ///< last non-zero pts from AVFrame which was passed into avcodec_encode_video2()
|
||||
/**
|
||||
* pts difference between the first and second input frame, used for
|
||||
* calculating dts of the first frame when there's a delay */
|
||||
int64_t dts_delta;
|
||||
/**
|
||||
* reordered pts to be used as dts for the next output frame when there's
|
||||
* a delay */
|
||||
int64_t reordered_pts;
|
||||
|
||||
/** bit output */
|
||||
PutBitContext pb;
|
||||
|
||||
int start_mb_y; ///< start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
|
||||
int end_mb_y; ///< end mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
|
||||
struct MpegEncContext *thread_context[MAX_THREADS];
|
||||
int slice_context_count; ///< number of used thread_contexts
|
||||
|
||||
/**
|
||||
* copy of the previous picture structure.
|
||||
* note, linesize & data, might not match the previous picture (for field pictures)
|
||||
*/
|
||||
Picture last_picture;
|
||||
|
||||
/**
|
||||
* copy of the next picture structure.
|
||||
* note, linesize & data, might not match the next picture (for field pictures)
|
||||
*/
|
||||
Picture next_picture;
|
||||
|
||||
/**
|
||||
* copy of the source picture structure for encoding.
|
||||
* note, linesize & data, might not match the source picture (for field pictures)
|
||||
*/
|
||||
Picture new_picture;
|
||||
|
||||
/**
|
||||
* copy of the current picture structure.
|
||||
* note, linesize & data, might not match the current picture (for field pictures)
|
||||
*/
|
||||
Picture current_picture; ///< buffer to store the decompressed current picture
|
||||
|
||||
Picture *last_picture_ptr; ///< pointer to the previous picture.
|
||||
Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred)
|
||||
Picture *current_picture_ptr; ///< pointer to the current picture
|
||||
int last_dc[3]; ///< last DC values for MPEG-1
|
||||
int16_t *dc_val_base;
|
||||
int16_t *dc_val[3]; ///< used for MPEG-4 DC prediction, all 3 arrays must be continuous
|
||||
const uint8_t *y_dc_scale_table; ///< qscale -> y_dc_scale table
|
||||
const uint8_t *c_dc_scale_table; ///< qscale -> c_dc_scale table
|
||||
const uint8_t *chroma_qscale_table; ///< qscale -> chroma_qscale (H.263)
|
||||
uint8_t *coded_block_base;
|
||||
uint8_t *coded_block; ///< used for coded block pattern prediction (msmpeg4v3, wmv1)
|
||||
int16_t (*ac_val_base)[16];
|
||||
int16_t (*ac_val[3])[16]; ///< used for MPEG-4 AC prediction, all 3 arrays must be continuous
|
||||
int mb_skipped; ///< MUST BE SET only during DECODING
|
||||
uint8_t *mbskip_table; /**< used to avoid copy if macroblock skipped (for black regions for example)
|
||||
and used for B-frame encoding & decoding (contains skip table of next P-frame) */
|
||||
uint8_t *mbintra_table; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding
|
||||
uint8_t *cbp_table; ///< used to store cbp, ac_pred for partitioned decoding
|
||||
uint8_t *pred_dir_table; ///< used to store pred_dir for partitioned decoding
|
||||
|
||||
ScratchpadContext sc;
|
||||
|
||||
int qscale; ///< QP
|
||||
int chroma_qscale; ///< chroma QP
|
||||
unsigned int lambda; ///< Lagrange multiplier used in rate distortion
|
||||
unsigned int lambda2; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT
|
||||
int *lambda_table;
|
||||
int adaptive_quant; ///< use adaptive quantization
|
||||
int dquant; ///< qscale difference to prev qscale
|
||||
int closed_gop; ///< MPEG1/2 GOP is closed
|
||||
int pict_type; ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
|
||||
int vbv_delay;
|
||||
int last_pict_type; //FIXME removes
|
||||
int last_non_b_pict_type; ///< used for MPEG-4 gmc B-frames & ratecontrol
|
||||
int droppable;
|
||||
int frame_rate_index;
|
||||
AVRational mpeg2_frame_rate_ext;
|
||||
int last_lambda_for[5]; ///< last lambda for a specific pict type
|
||||
int skipdct; ///< skip dct and code zero residual
|
||||
|
||||
/* motion compensation */
|
||||
int unrestricted_mv; ///< mv can point outside of the coded picture
|
||||
int h263_long_vectors; ///< use horrible H.263v1 long vector mode
|
||||
|
||||
BlockDSPContext bdsp;
|
||||
FDCTDSPContext fdsp;
|
||||
H264ChromaContext h264chroma;
|
||||
HpelDSPContext hdsp;
|
||||
IDCTDSPContext idsp;
|
||||
MECmpContext mecc;
|
||||
MpegVideoDSPContext mdsp;
|
||||
MpegvideoEncDSPContext mpvencdsp;
|
||||
PixblockDSPContext pdsp;
|
||||
QpelDSPContext qdsp;
|
||||
VideoDSPContext vdsp;
|
||||
H263DSPContext h263dsp;
|
||||
int f_code; ///< forward MV resolution
|
||||
int b_code; ///< backward MV resolution for B-frames (MPEG-4)
|
||||
int16_t (*p_mv_table_base)[2];
|
||||
int16_t (*b_forw_mv_table_base)[2];
|
||||
int16_t (*b_back_mv_table_base)[2];
|
||||
int16_t (*b_bidir_forw_mv_table_base)[2];
|
||||
int16_t (*b_bidir_back_mv_table_base)[2];
|
||||
int16_t (*b_direct_mv_table_base)[2];
|
||||
int16_t (*p_field_mv_table_base[2][2])[2];
|
||||
int16_t (*b_field_mv_table_base[2][2][2])[2];
|
||||
int16_t (*p_mv_table)[2]; ///< MV table (1MV per MB) P-frame encoding
|
||||
int16_t (*b_forw_mv_table)[2]; ///< MV table (1MV per MB) forward mode B-frame encoding
|
||||
int16_t (*b_back_mv_table)[2]; ///< MV table (1MV per MB) backward mode B-frame encoding
|
||||
int16_t (*b_bidir_forw_mv_table)[2]; ///< MV table (1MV per MB) bidir mode B-frame encoding
|
||||
int16_t (*b_bidir_back_mv_table)[2]; ///< MV table (1MV per MB) bidir mode B-frame encoding
|
||||
int16_t (*b_direct_mv_table)[2]; ///< MV table (1MV per MB) direct mode B-frame encoding
|
||||
int16_t (*p_field_mv_table[2][2])[2]; ///< MV table (2MV per MB) interlaced P-frame encoding
|
||||
int16_t (*b_field_mv_table[2][2][2])[2];///< MV table (4MV per MB) interlaced B-frame encoding
|
||||
uint8_t (*p_field_select_table[2]);
|
||||
uint8_t (*b_field_select_table[2][2]);
|
||||
#if FF_API_MOTION_EST
|
||||
int me_method; ///< ME algorithm
|
||||
#endif
|
||||
int motion_est; ///< ME algorithm
|
||||
int me_penalty_compensation;
|
||||
int me_pre; ///< prepass for motion estimation
|
||||
int mv_dir;
|
||||
#define MV_DIR_FORWARD 1
|
||||
#define MV_DIR_BACKWARD 2
|
||||
#define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
|
||||
int mv_type;
|
||||
#define MV_TYPE_16X16 0 ///< 1 vector for the whole mb
|
||||
#define MV_TYPE_8X8 1 ///< 4 vectors (H.263, MPEG-4 4MV)
|
||||
#define MV_TYPE_16X8 2 ///< 2 vectors, one per 16x8 block
|
||||
#define MV_TYPE_FIELD 3 ///< 2 vectors, one per field
|
||||
#define MV_TYPE_DMV 4 ///< 2 vectors, special mpeg2 Dual Prime Vectors
|
||||
/**motion vectors for a macroblock
|
||||
first coordinate : 0 = forward 1 = backward
|
||||
second " : depend on type
|
||||
third " : 0 = x, 1 = y
|
||||
*/
|
||||
int mv[2][4][2];
|
||||
int field_select[2][2];
|
||||
int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4
|
||||
uint8_t *fcode_tab; ///< smallest fcode needed for each MV
|
||||
int16_t direct_scale_mv[2][64]; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
|
||||
|
||||
MotionEstContext me;
|
||||
|
||||
int no_rounding; /**< apply no rounding to motion compensation (MPEG-4, msmpeg4, ...)
|
||||
for B-frames rounding mode is always 0 */
|
||||
|
||||
/* macroblock layer */
|
||||
int mb_x, mb_y;
|
||||
int mb_skip_run;
|
||||
int mb_intra;
|
||||
uint16_t *mb_type; ///< Table for candidate MB types for encoding (defines in mpegutils.h)
|
||||
|
||||
int block_index[6]; ///< index to current MB in block based arrays with edges
|
||||
int block_wrap[6];
|
||||
uint8_t *dest[3];
|
||||
|
||||
int *mb_index2xy; ///< mb_index -> mb_x + mb_y*mb_stride
|
||||
|
||||
/** matrix transmitted in the bitstream */
|
||||
uint16_t intra_matrix[64];
|
||||
uint16_t chroma_intra_matrix[64];
|
||||
uint16_t inter_matrix[64];
|
||||
uint16_t chroma_inter_matrix[64];
|
||||
int force_duplicated_matrix; ///< Force duplication of mjpeg matrices, useful for rtp streaming
|
||||
|
||||
int intra_quant_bias; ///< bias for the quantizer
|
||||
int inter_quant_bias; ///< bias for the quantizer
|
||||
int min_qcoeff; ///< minimum encodable coefficient
|
||||
int max_qcoeff; ///< maximum encodable coefficient
|
||||
int ac_esc_length; ///< num of bits needed to encode the longest esc
|
||||
uint8_t *intra_ac_vlc_length;
|
||||
uint8_t *intra_ac_vlc_last_length;
|
||||
uint8_t *intra_chroma_ac_vlc_length;
|
||||
uint8_t *intra_chroma_ac_vlc_last_length;
|
||||
uint8_t *inter_ac_vlc_length;
|
||||
uint8_t *inter_ac_vlc_last_length;
|
||||
uint8_t *luma_dc_vlc_length;
|
||||
#define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level))
|
||||
|
||||
int coded_score[12];
|
||||
|
||||
/** precomputed matrix (combine qscale and DCT renorm) */
|
||||
int (*q_intra_matrix)[64];
|
||||
int (*q_chroma_intra_matrix)[64];
|
||||
int (*q_inter_matrix)[64];
|
||||
/** identical to the above but for MMX & these are not permutated, second 64 entries are bias*/
|
||||
uint16_t (*q_intra_matrix16)[2][64];
|
||||
uint16_t (*q_chroma_intra_matrix16)[2][64];
|
||||
uint16_t (*q_inter_matrix16)[2][64];
|
||||
|
||||
/* noise reduction */
|
||||
int (*dct_error_sum)[64];
|
||||
int dct_count[2];
|
||||
uint16_t (*dct_offset)[64];
|
||||
|
||||
/* bit rate control */
|
||||
int64_t total_bits;
|
||||
int frame_bits; ///< bits used for the current frame
|
||||
int stuffing_bits; ///< bits used for stuffing
|
||||
int next_lambda; ///< next lambda used for retrying to encode a frame
|
||||
RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c
|
||||
|
||||
/* statistics, used for 2-pass encoding */
|
||||
int mv_bits;
|
||||
int header_bits;
|
||||
int i_tex_bits;
|
||||
int p_tex_bits;
|
||||
int i_count;
|
||||
int f_count;
|
||||
int b_count;
|
||||
int skip_count;
|
||||
int misc_bits; ///< cbp, mb_type
|
||||
int last_bits; ///< temp var used for calculating the above vars
|
||||
|
||||
/* error concealment / resync */
|
||||
int resync_mb_x; ///< x position of last resync marker
|
||||
int resync_mb_y; ///< y position of last resync marker
|
||||
GetBitContext last_resync_gb; ///< used to search for the next resync marker
|
||||
int mb_num_left; ///< number of MBs left in this video packet (for partitioned Slices only)
|
||||
int next_p_frame_damaged; ///< set if the next p frame is damaged, to avoid showing trashed B-frames
|
||||
|
||||
ParseContext parse_context;
|
||||
|
||||
/* H.263 specific */
|
||||
int gob_index;
|
||||
int obmc; ///< overlapped block motion compensation
|
||||
int mb_info; ///< interval for outputting info about mb offsets as side data
|
||||
int prev_mb_info, last_mb_info;
|
||||
uint8_t *mb_info_ptr;
|
||||
int mb_info_size;
|
||||
int ehc_mode;
|
||||
int rc_strategy;
|
||||
|
||||
/* H.263+ specific */
|
||||
int umvplus; ///< == H.263+ && unrestricted_mv
|
||||
int h263_aic_dir; ///< AIC direction: 0 = left, 1 = top
|
||||
int h263_slice_structured;
|
||||
int alt_inter_vlc; ///< alternative inter vlc
|
||||
int modified_quant;
|
||||
int loop_filter;
|
||||
int custom_pcf;
|
||||
|
||||
/* MPEG-4 specific */
|
||||
///< number of bits to represent the fractional part of time (encoder only)
|
||||
int time_increment_bits;
|
||||
int last_time_base;
|
||||
int time_base; ///< time in seconds of last I,P,S Frame
|
||||
int64_t time; ///< time of current frame
|
||||
int64_t last_non_b_time;
|
||||
uint16_t pp_time; ///< time distance between the last 2 p,s,i frames
|
||||
uint16_t pb_time; ///< time distance between the last b and p,s,i frame
|
||||
uint16_t pp_field_time;
|
||||
uint16_t pb_field_time; ///< like above, just for interlaced
|
||||
int real_sprite_warping_points;
|
||||
int sprite_offset[2][2]; ///< sprite offset[isChroma][isMVY]
|
||||
int sprite_delta[2][2]; ///< sprite_delta [isY][isMVY]
|
||||
int mcsel;
|
||||
int quant_precision;
|
||||
int quarter_sample; ///< 1->qpel, 0->half pel ME/MC
|
||||
int aspect_ratio_info; //FIXME remove
|
||||
int sprite_warping_accuracy;
|
||||
int data_partitioning; ///< data partitioning flag from header
|
||||
int partitioned_frame; ///< is current frame partitioned
|
||||
int low_delay; ///< no reordering needed / has no B-frames
|
||||
int vo_type;
|
||||
PutBitContext tex_pb; ///< used for data partitioned VOPs
|
||||
PutBitContext pb2; ///< used for data partitioned VOPs
|
||||
int mpeg_quant;
|
||||
int padding_bug_score; ///< used to detect the VERY common padding bug in MPEG-4
|
||||
|
||||
/* divx specific, used to workaround (many) bugs in divx5 */
|
||||
int divx_packed;
|
||||
uint8_t *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them
|
||||
int bitstream_buffer_size;
|
||||
unsigned int allocated_bitstream_buffer_size;
|
||||
|
||||
/* RV10 specific */
|
||||
int rv10_version; ///< RV10 version: 0 or 3
|
||||
int rv10_first_dc_coded[3];
|
||||
|
||||
/* MJPEG specific */
|
||||
struct MJpegContext *mjpeg_ctx;
|
||||
int esc_pos;
|
||||
int pred;
|
||||
|
||||
/* MSMPEG4 specific */
|
||||
int mv_table_index;
|
||||
int rl_table_index;
|
||||
int rl_chroma_table_index;
|
||||
int dc_table_index;
|
||||
int use_skip_mb_code;
|
||||
int slice_height; ///< in macroblocks
|
||||
int first_slice_line; ///< used in MPEG-4 too to handle resync markers
|
||||
int flipflop_rounding;
|
||||
int msmpeg4_version; ///< 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8
|
||||
int per_mb_rl_table;
|
||||
int esc3_level_length;
|
||||
int esc3_run_length;
|
||||
/** [mb_intra][isChroma][level][run][last] */
|
||||
int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2];
|
||||
int inter_intra_pred;
|
||||
int mspel;
|
||||
|
||||
/* decompression specific */
|
||||
GetBitContext gb;
|
||||
|
||||
/* MPEG-1 specific */
|
||||
int gop_picture_number; ///< index of the first picture of a GOP based on fake_pic_num & MPEG-1 specific
|
||||
int last_mv_dir; ///< last mv_dir, used for B-frame encoding
|
||||
uint8_t *vbv_delay_ptr; ///< pointer to vbv_delay in the bitstream
|
||||
|
||||
/* MPEG-2-specific - I wished not to have to support this mess. */
|
||||
int progressive_sequence;
|
||||
int mpeg_f_code[2][2];
|
||||
|
||||
// picture structure defines are loaded from mpegutils.h
|
||||
int picture_structure;
|
||||
|
||||
int64_t timecode_frame_start; ///< GOP timecode frame start number, in non drop frame format
|
||||
int intra_dc_precision;
|
||||
int frame_pred_frame_dct;
|
||||
int top_field_first;
|
||||
int concealment_motion_vectors;
|
||||
int q_scale_type;
|
||||
int brd_scale;
|
||||
int intra_vlc_format;
|
||||
int alternate_scan;
|
||||
int seq_disp_ext;
|
||||
int repeat_first_field;
|
||||
int chroma_420_type;
|
||||
int chroma_format;
|
||||
#define CHROMA_420 1
|
||||
#define CHROMA_422 2
|
||||
#define CHROMA_444 3
|
||||
int chroma_x_shift;//depend on pix_format, that depend on chroma_format
|
||||
int chroma_y_shift;
|
||||
|
||||
int progressive_frame;
|
||||
int full_pel[2];
|
||||
int interlaced_dct;
|
||||
int first_field; ///< is 1 for the first field of a field picture 0 otherwise
|
||||
int drop_frame_timecode; ///< timecode is in drop frame format.
|
||||
int scan_offset; ///< reserve space for SVCD scan offset user data.
|
||||
|
||||
/* RTP specific */
|
||||
int rtp_mode;
|
||||
int rtp_payload_size;
|
||||
|
||||
char *tc_opt_str; ///< timecode option string
|
||||
AVTimecode tc; ///< timecode context
|
||||
|
||||
uint8_t *ptr_lastgob;
|
||||
int swap_uv; //vcr2 codec is an MPEG-2 variant with U and V swapped
|
||||
int pack_pblocks; //xvmc needs to keep blocks without gaps.
|
||||
int16_t (*pblocks[12])[64];
|
||||
|
||||
int16_t (*block)[64]; ///< points to one of the following blocks
|
||||
int16_t (*blocks)[12][64]; // for HQ mode we need to keep the best block
|
||||
int (*decode_mb)(struct MpegEncContext *s, int16_t block[6][64]); // used by some codecs to avoid a switch()
|
||||
#define SLICE_OK 0
|
||||
#define SLICE_ERROR -1
|
||||
#define SLICE_END -2 ///<end marker found
|
||||
#define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded
|
||||
|
||||
void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_h263_intra)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_h263_inter)(struct MpegEncContext *s,
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
|
||||
int16_t *block/*align 16*/, int n, int qscale);
|
||||
int (*dct_quantize)(struct MpegEncContext *s, int16_t *block/*align 16*/, int n, int qscale, int *overflow);
|
||||
int (*fast_dct_quantize)(struct MpegEncContext *s, int16_t *block/*align 16*/, int n, int qscale, int *overflow);
|
||||
void (*denoise_dct)(struct MpegEncContext *s, int16_t *block);
|
||||
|
||||
int mpv_flags; ///< flags set by private options
|
||||
int quantizer_noise_shaping;
|
||||
|
||||
/**
|
||||
* ratecontrol qmin qmax limiting method
|
||||
* 0-> clipping, 1-> use a nice continuous function to limit qscale within qmin/qmax.
|
||||
*/
|
||||
float rc_qsquish;
|
||||
float rc_qmod_amp;
|
||||
int rc_qmod_freq;
|
||||
float rc_initial_cplx;
|
||||
float rc_buffer_aggressivity;
|
||||
float border_masking;
|
||||
int lmin, lmax;
|
||||
int vbv_ignore_qmax;
|
||||
|
||||
char *rc_eq;
|
||||
|
||||
/* temp buffers for rate control */
|
||||
float *cplx_tab, *bits_tab;
|
||||
|
||||
/* flag to indicate a reinitialization is required, e.g. after
|
||||
* a frame size change */
|
||||
int context_reinit;
|
||||
|
||||
ERContext er;
|
||||
|
||||
int error_rate;
|
||||
|
||||
/* temporary frames used by b_frame_strategy = 2 */
|
||||
AVFrame *tmp_frames[MAX_B_FRAMES + 2];
|
||||
int b_frame_strategy;
|
||||
int b_sensitivity;
|
||||
|
||||
/* frame skip options for encoding */
|
||||
int frame_skip_threshold;
|
||||
int frame_skip_factor;
|
||||
int frame_skip_exp;
|
||||
int frame_skip_cmp;
|
||||
|
||||
int scenechange_threshold;
|
||||
int noise_reduction;
|
||||
} MpegEncContext;
|
||||
|
||||
/* mpegvideo_enc common options */
|
||||
#define FF_MPV_FLAG_SKIP_RD 0x0001
|
||||
#define FF_MPV_FLAG_STRICT_GOP 0x0002
|
||||
#define FF_MPV_FLAG_QP_RD 0x0004
|
||||
#define FF_MPV_FLAG_CBP_RD 0x0008
|
||||
#define FF_MPV_FLAG_NAQ 0x0010
|
||||
#define FF_MPV_FLAG_MV0 0x0020
|
||||
|
||||
enum rc_strategy {
|
||||
MPV_RC_STRATEGY_FFMPEG,
|
||||
MPV_RC_STRATEGY_XVID,
|
||||
NB_MPV_RC_STRATEGY
|
||||
};
|
||||
|
||||
#define FF_MPV_OPT_CMP_FUNC \
|
||||
{ "sad", "Sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "sse", "Sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "satd", "Sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "dct", "Sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "psnr", "Sum of squared quantization errors, low quality", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_PSNR }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "bit", "Number of bits needed for the block", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_BIT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "rd", "Rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "zero", "Zero", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "vsad", "Sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "vsse", "Sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "nsse", "Noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "dct264", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT264 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{ "chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }
|
||||
|
||||
#ifndef FF_MPV_OFFSET
|
||||
#define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
|
||||
#endif
|
||||
#define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
|
||||
#define FF_MPV_COMMON_OPTS \
|
||||
FF_MPV_OPT_CMP_FUNC, \
|
||||
{ "mpv_flags", "Flags common for all mpegvideo-based encoders.", FF_MPV_OFFSET(mpv_flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "skip_rd", "RD optimal MB level residual skipping", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_SKIP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "strict_gop", "Strictly enforce gop size", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_STRICT_GOP }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "qp_rd", "Use rate distortion optimization for qp selection", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_QP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "cbp_rd", "use rate distortion optimization for CBP", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_CBP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "naq", "normalize adaptive quantization", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_NAQ }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "mv0", "always try a mb with mv=<0,0>", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_MV0 }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||
{ "luma_elim_threshold", "single coefficient elimination threshold for luminance (negative values also consider dc coefficient)",\
|
||||
FF_MPV_OFFSET(luma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\
|
||||
{ "chroma_elim_threshold", "single coefficient elimination threshold for chrominance (negative values also consider dc coefficient)",\
|
||||
FF_MPV_OFFSET(chroma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\
|
||||
{ "quantizer_noise_shaping", NULL, FF_MPV_OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\
|
||||
{ "error_rate", "Simulate errors in the bitstream to test error concealment.", \
|
||||
FF_MPV_OFFSET(error_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\
|
||||
{"qsquish", "how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function)", \
|
||||
FF_MPV_OFFSET(rc_qsquish), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, 0, 99, FF_MPV_OPT_FLAGS}, \
|
||||
{"rc_qmod_amp", "experimental quantizer modulation", FF_MPV_OFFSET(rc_qmod_amp), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||
{"rc_qmod_freq", "experimental quantizer modulation", FF_MPV_OFFSET(rc_qmod_freq), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||
{"rc_eq", "Set rate control equation. When computing the expression, besides the standard functions " \
|
||||
"defined in the section 'Expression Evaluation', the following functions are available: " \
|
||||
"bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv " \
|
||||
"fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.", \
|
||||
FF_MPV_OFFSET(rc_eq), AV_OPT_TYPE_STRING, .flags = FF_MPV_OPT_FLAGS }, \
|
||||
{"rc_init_cplx", "initial complexity for 1-pass encoding", FF_MPV_OFFSET(rc_initial_cplx), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||
{"rc_buf_aggressivity", "currently useless", FF_MPV_OFFSET(rc_buffer_aggressivity), AV_OPT_TYPE_FLOAT, {.dbl = 1.0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||
{"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||
{"lmin", "minimum Lagrange factor (VBR)", FF_MPV_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"lmax", "maximum Lagrange factor (VBR)", FF_MPV_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"ibias", "intra quant bias", FF_MPV_OFFSET(intra_quant_bias), AV_OPT_TYPE_INT, {.i64 = FF_DEFAULT_QUANT_BIAS }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"pbias", "inter quant bias", FF_MPV_OFFSET(inter_quant_bias), AV_OPT_TYPE_INT, {.i64 = FF_DEFAULT_QUANT_BIAS }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"rc_strategy", "ratecontrol method", FF_MPV_OFFSET(rc_strategy), AV_OPT_TYPE_INT, {.i64 = MPV_RC_STRATEGY_FFMPEG }, 0, NB_MPV_RC_STRATEGY-1, FF_MPV_OPT_FLAGS, "rc_strategy" }, \
|
||||
{ "ffmpeg", "default native rate control", 0, AV_OPT_TYPE_CONST, { .i64 = MPV_RC_STRATEGY_FFMPEG }, 0, 0, FF_MPV_OPT_FLAGS, "rc_strategy" }, \
|
||||
{ "xvid", "libxvid (2 pass only)", 0, AV_OPT_TYPE_CONST, { .i64 = MPV_RC_STRATEGY_XVID }, 0, 0, FF_MPV_OPT_FLAGS, "rc_strategy" }, \
|
||||
{"motion_est", "motion estimation algorithm", FF_MPV_OFFSET(motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, FF_MPV_OPT_FLAGS, "motion_est" }, \
|
||||
{ "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
|
||||
{ "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
|
||||
{ "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
|
||||
{ "force_duplicated_matrix", "Always write luma and chroma matrix for mjpeg, useful for rtp streaming.", FF_MPV_OFFSET(force_duplicated_matrix), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FF_MPV_OPT_FLAGS }, \
|
||||
{"b_strategy", "Strategy to choose between I/P/B-frames", FF_MPV_OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, FF_MPV_OPT_FLAGS }, \
|
||||
{"b_sensitivity", "Adjust sensitivity of b_frame_strategy 1", FF_MPV_OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"brd_scale", "Downscale frames for dynamic B-frame decision", FF_MPV_OFFSET(brd_scale), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 3, FF_MPV_OPT_FLAGS }, \
|
||||
{"skip_threshold", "Frame skip threshold", FF_MPV_OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"skip_factor", "Frame skip factor", FF_MPV_OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"skip_exp", "Frame skip exponent", FF_MPV_OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"skip_cmp", "Frame skip compare function", FF_MPV_OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||
{"sc_threshold", "Scene change threshold", FF_MPV_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"noise_reduction", "Noise reduction", FF_MPV_OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"mpeg_quant", "Use MPEG quantizers instead of H.263", FF_MPV_OFFSET(mpeg_quant), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, FF_MPV_OPT_FLAGS }, \
|
||||
{"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)", FF_MPV_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
{"mepre", "pre motion estimation", FF_MPV_OFFSET(me_pre), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||
|
||||
extern const AVOption ff_mpv_generic_options[];
|
||||
|
||||
/**
|
||||
* Set the given MpegEncContext to common defaults (same for encoding
|
||||
* and decoding). The changed fields will not depend upon the prior
|
||||
* state of the MpegEncContext.
|
||||
*/
|
||||
void ff_mpv_common_defaults(MpegEncContext *s);
|
||||
|
||||
void ff_dct_encode_init_x86(MpegEncContext *s);
|
||||
|
||||
int ff_mpv_common_init(MpegEncContext *s);
|
||||
void ff_mpv_common_init_arm(MpegEncContext *s);
|
||||
void ff_mpv_common_init_axp(MpegEncContext *s);
|
||||
void ff_mpv_common_init_neon(MpegEncContext *s);
|
||||
void ff_mpv_common_init_ppc(MpegEncContext *s);
|
||||
void ff_mpv_common_init_x86(MpegEncContext *s);
|
||||
void ff_mpv_common_init_mips(MpegEncContext *s);
|
||||
|
||||
int ff_mpv_common_frame_size_change(MpegEncContext *s);
|
||||
void ff_mpv_common_end(MpegEncContext *s);
|
||||
|
||||
void ff_mpv_decode_defaults(MpegEncContext *s);
|
||||
void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx);
|
||||
void ff_mpv_decode_mb(MpegEncContext *s, int16_t block[12][64]);
|
||||
void ff_mpv_report_decode_progress(MpegEncContext *s);
|
||||
|
||||
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx);
|
||||
void ff_mpv_frame_end(MpegEncContext *s);
|
||||
|
||||
int ff_mpv_encode_init(AVCodecContext *avctx);
|
||||
void ff_mpv_encode_init_x86(MpegEncContext *s);
|
||||
|
||||
int ff_mpv_encode_end(AVCodecContext *avctx);
|
||||
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
|
||||
const AVFrame *frame, int *got_packet);
|
||||
int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase);
|
||||
|
||||
void ff_clean_intra_table_entries(MpegEncContext *s);
|
||||
void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h);
|
||||
void ff_mpeg_flush(AVCodecContext *avctx);
|
||||
|
||||
void ff_print_debug_info(MpegEncContext *s, Picture *p, AVFrame *pict);
|
||||
void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_table,
|
||||
uint32_t *mbtype_table, int8_t *qscale_table, int16_t (*motion_val[2])[2],
|
||||
int *low_delay,
|
||||
int mb_width, int mb_height, int mb_stride, int quarter_sample);
|
||||
|
||||
int ff_mpv_export_qp_table(MpegEncContext *s, AVFrame *f, Picture *p, int qp_type);
|
||||
|
||||
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix);
|
||||
|
||||
int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src);
|
||||
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src);
|
||||
void ff_set_qscale(MpegEncContext * s, int qscale);
|
||||
|
||||
void ff_mpv_idct_init(MpegEncContext *s);
|
||||
int ff_dct_encode_init(MpegEncContext *s);
|
||||
void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[2][64],
|
||||
const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra);
|
||||
int ff_dct_quantize_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
|
||||
void ff_block_permute(int16_t *block, uint8_t *permutation,
|
||||
const uint8_t *scantable, int last);
|
||||
void ff_init_block_index(MpegEncContext *s);
|
||||
|
||||
void ff_mpv_motion(MpegEncContext *s,
|
||||
uint8_t *dest_y, uint8_t *dest_cb,
|
||||
uint8_t *dest_cr, int dir,
|
||||
uint8_t **ref_picture,
|
||||
op_pixels_func (*pix_op)[4],
|
||||
qpel_mc_func (*qpix_op)[16]);
|
||||
|
||||
static inline void ff_update_block_index(MpegEncContext *s){
|
||||
const int block_size= 8 >> s->avctx->lowres;
|
||||
|
||||
s->block_index[0]+=2;
|
||||
s->block_index[1]+=2;
|
||||
s->block_index[2]+=2;
|
||||
s->block_index[3]+=2;
|
||||
s->block_index[4]++;
|
||||
s->block_index[5]++;
|
||||
s->dest[0]+= 2*block_size;
|
||||
s->dest[1]+= block_size;
|
||||
s->dest[2]+= block_size;
|
||||
}
|
||||
|
||||
static inline int get_bits_diff(MpegEncContext *s){
|
||||
const int bits= put_bits_count(&s->pb);
|
||||
const int last= s->last_bits;
|
||||
|
||||
s->last_bits = bits;
|
||||
|
||||
return bits - last;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_MPEGVIDEO_H */
|
||||
47
media/ffvpx/libavcodec/mpegvideodsp.h
Normal file
47
media/ffvpx/libavcodec/mpegvideodsp.h
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGVIDEODSP_H
|
||||
#define AVCODEC_MPEGVIDEODSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy,
|
||||
int dxx, int dxy, int dyx, int dyy, int shift, int r,
|
||||
int width, int height);
|
||||
|
||||
typedef struct MpegVideoDSPContext {
|
||||
/**
|
||||
* translational global motion compensation.
|
||||
*/
|
||||
void (*gmc1)(uint8_t *dst /* align 8 */, uint8_t *src /* align 1 */,
|
||||
int srcStride, int h, int x16, int y16, int rounder);
|
||||
/**
|
||||
* global motion compensation.
|
||||
*/
|
||||
void (*gmc)(uint8_t *dst /* align 8 */, uint8_t *src /* align 1 */,
|
||||
int stride, int h, int ox, int oy,
|
||||
int dxx, int dxy, int dyx, int dyy,
|
||||
int shift, int r, int width, int height);
|
||||
} MpegVideoDSPContext;
|
||||
|
||||
void ff_mpegvideodsp_init(MpegVideoDSPContext *c);
|
||||
void ff_mpegvideodsp_init_ppc(MpegVideoDSPContext *c);
|
||||
void ff_mpegvideodsp_init_x86(MpegVideoDSPContext *c);
|
||||
|
||||
#endif /* AVCODEC_MPEGVIDEODSP_H */
|
||||
58
media/ffvpx/libavcodec/mpegvideoencdsp.h
Normal file
58
media/ffvpx/libavcodec/mpegvideoencdsp.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGVIDEOENCDSP_H
|
||||
#define AVCODEC_MPEGVIDEOENCDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
#define BASIS_SHIFT 16
|
||||
#define RECON_SHIFT 6
|
||||
|
||||
#define EDGE_TOP 1
|
||||
#define EDGE_BOTTOM 2
|
||||
|
||||
typedef struct MpegvideoEncDSPContext {
|
||||
int (*try_8x8basis)(int16_t rem[64], int16_t weight[64],
|
||||
int16_t basis[64], int scale);
|
||||
void (*add_8x8basis)(int16_t rem[64], int16_t basis[64], int scale);
|
||||
|
||||
int (*pix_sum)(uint8_t *pix, int line_size);
|
||||
int (*pix_norm1)(uint8_t *pix, int line_size);
|
||||
|
||||
void (*shrink[4])(uint8_t *dst, int dst_wrap, const uint8_t *src,
|
||||
int src_wrap, int width, int height);
|
||||
|
||||
void (*draw_edges)(uint8_t *buf, int wrap, int width, int height,
|
||||
int w, int h, int sides);
|
||||
} MpegvideoEncDSPContext;
|
||||
|
||||
void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx);
|
||||
void ff_mpegvideoencdsp_init_arm(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx);
|
||||
void ff_mpegvideoencdsp_init_ppc(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx);
|
||||
void ff_mpegvideoencdsp_init_x86(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx);
|
||||
void ff_mpegvideoencdsp_init_mips(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx);
|
||||
|
||||
#endif /* AVCODEC_MPEGVIDEOENCDSP_H */
|
||||
503
media/ffvpx/libavcodec/options.c
Normal file
503
media/ffvpx/libavcodec/options.c
Normal file
|
|
@ -0,0 +1,503 @@
|
|||
/*
|
||||
* Copyright (c) 2001 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* Options definition for AVCodecContext.
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include <float.h> /* FLT_MIN, FLT_MAX */
|
||||
#include <string.h>
|
||||
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
#include "ff_options_table.h"
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
|
||||
static const char* context_to_name(void* ptr) {
|
||||
AVCodecContext *avc= ptr;
|
||||
|
||||
if(avc && avc->codec && avc->codec->name)
|
||||
return avc->codec->name;
|
||||
else
|
||||
return "NULL";
|
||||
}
|
||||
|
||||
static void *codec_child_next(void *obj, void *prev)
|
||||
{
|
||||
AVCodecContext *s = obj;
|
||||
if (!prev && s->codec && s->codec->priv_class && s->priv_data)
|
||||
return s->priv_data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const AVClass *codec_child_class_next(const AVClass *prev)
|
||||
{
|
||||
AVCodec *c = NULL;
|
||||
|
||||
/* find the codec that corresponds to prev */
|
||||
while (prev && (c = av_codec_next(c)))
|
||||
if (c->priv_class == prev)
|
||||
break;
|
||||
|
||||
/* find next codec with priv options */
|
||||
while (c = av_codec_next(c))
|
||||
if (c->priv_class)
|
||||
return c->priv_class;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static AVClassCategory get_category(void *ptr)
|
||||
{
|
||||
AVCodecContext* avctx = ptr;
|
||||
if(avctx->codec && avctx->codec->decode) return AV_CLASS_CATEGORY_DECODER;
|
||||
else return AV_CLASS_CATEGORY_ENCODER;
|
||||
}
|
||||
|
||||
static const AVClass av_codec_context_class = {
|
||||
.class_name = "AVCodecContext",
|
||||
.item_name = context_to_name,
|
||||
.option = avcodec_options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
.log_level_offset_offset = offsetof(AVCodecContext, log_level_offset),
|
||||
.child_next = codec_child_next,
|
||||
.child_class_next = codec_child_class_next,
|
||||
.category = AV_CLASS_CATEGORY_ENCODER,
|
||||
.get_category = get_category,
|
||||
};
|
||||
|
||||
static int init_context_defaults(AVCodecContext *s, const AVCodec *codec)
|
||||
{
|
||||
int flags=0;
|
||||
memset(s, 0, sizeof(AVCodecContext));
|
||||
|
||||
s->av_class = &av_codec_context_class;
|
||||
|
||||
s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
|
||||
if (codec) {
|
||||
s->codec = codec;
|
||||
s->codec_id = codec->id;
|
||||
}
|
||||
|
||||
if(s->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||
flags= AV_OPT_FLAG_AUDIO_PARAM;
|
||||
else if(s->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
flags= AV_OPT_FLAG_VIDEO_PARAM;
|
||||
else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE)
|
||||
flags= AV_OPT_FLAG_SUBTITLE_PARAM;
|
||||
av_opt_set_defaults2(s, flags, flags);
|
||||
|
||||
s->time_base = (AVRational){0,1};
|
||||
s->framerate = (AVRational){ 0, 1 };
|
||||
s->pkt_timebase = (AVRational){ 0, 1 };
|
||||
s->get_buffer2 = avcodec_default_get_buffer2;
|
||||
s->get_format = avcodec_default_get_format;
|
||||
s->execute = avcodec_default_execute;
|
||||
s->execute2 = avcodec_default_execute2;
|
||||
s->sample_aspect_ratio = (AVRational){0,1};
|
||||
s->pix_fmt = AV_PIX_FMT_NONE;
|
||||
s->sample_fmt = AV_SAMPLE_FMT_NONE;
|
||||
|
||||
s->reordered_opaque = AV_NOPTS_VALUE;
|
||||
if(codec && codec->priv_data_size){
|
||||
if(!s->priv_data){
|
||||
s->priv_data= av_mallocz(codec->priv_data_size);
|
||||
if (!s->priv_data) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
}
|
||||
if(codec->priv_class){
|
||||
*(const AVClass**)s->priv_data = codec->priv_class;
|
||||
av_opt_set_defaults(s->priv_data);
|
||||
}
|
||||
}
|
||||
if (codec && codec->defaults) {
|
||||
int ret;
|
||||
const AVCodecDefault *d = codec->defaults;
|
||||
while (d->key) {
|
||||
ret = av_opt_set(s, d->key, d->value, 0);
|
||||
av_assert0(ret >= 0);
|
||||
d++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if FF_API_GET_CONTEXT_DEFAULTS
|
||||
int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec)
|
||||
{
|
||||
return init_context_defaults(s, codec);
|
||||
}
|
||||
#endif
|
||||
|
||||
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
|
||||
{
|
||||
AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
|
||||
|
||||
if (!avctx)
|
||||
return NULL;
|
||||
|
||||
if (init_context_defaults(avctx, codec) < 0) {
|
||||
av_free(avctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return avctx;
|
||||
}
|
||||
|
||||
void avcodec_free_context(AVCodecContext **pavctx)
|
||||
{
|
||||
AVCodecContext *avctx = *pavctx;
|
||||
|
||||
if (!avctx)
|
||||
return;
|
||||
|
||||
avcodec_close(avctx);
|
||||
|
||||
av_freep(&avctx->extradata);
|
||||
av_freep(&avctx->subtitle_header);
|
||||
av_freep(&avctx->intra_matrix);
|
||||
av_freep(&avctx->inter_matrix);
|
||||
av_freep(&avctx->rc_override);
|
||||
|
||||
av_freep(pavctx);
|
||||
}
|
||||
|
||||
#if FF_API_COPY_CONTEXT
|
||||
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
|
||||
{
|
||||
const AVCodec *orig_codec = dest->codec;
|
||||
uint8_t *orig_priv_data = dest->priv_data;
|
||||
|
||||
if (avcodec_is_open(dest)) { // check that the dest context is uninitialized
|
||||
av_log(dest, AV_LOG_ERROR,
|
||||
"Tried to copy AVCodecContext %p into already-initialized %p\n",
|
||||
src, dest);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
av_opt_free(dest);
|
||||
av_freep(&dest->rc_override);
|
||||
av_freep(&dest->intra_matrix);
|
||||
av_freep(&dest->inter_matrix);
|
||||
av_freep(&dest->extradata);
|
||||
av_freep(&dest->subtitle_header);
|
||||
|
||||
memcpy(dest, src, sizeof(*dest));
|
||||
av_opt_copy(dest, src);
|
||||
|
||||
dest->priv_data = orig_priv_data;
|
||||
dest->codec = orig_codec;
|
||||
|
||||
if (orig_priv_data && src->codec && src->codec->priv_class &&
|
||||
dest->codec && dest->codec->priv_class)
|
||||
av_opt_copy(orig_priv_data, src->priv_data);
|
||||
|
||||
|
||||
/* set values specific to opened codecs back to their default state */
|
||||
dest->slice_offset = NULL;
|
||||
dest->hwaccel = NULL;
|
||||
dest->internal = NULL;
|
||||
#if FF_API_CODED_FRAME
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
dest->coded_frame = NULL;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
|
||||
/* reallocate values that should be allocated separately */
|
||||
dest->extradata = NULL;
|
||||
dest->intra_matrix = NULL;
|
||||
dest->inter_matrix = NULL;
|
||||
dest->rc_override = NULL;
|
||||
dest->subtitle_header = NULL;
|
||||
dest->hw_frames_ctx = NULL;
|
||||
|
||||
#define alloc_and_copy_or_fail(obj, size, pad) \
|
||||
if (src->obj && size > 0) { \
|
||||
dest->obj = av_malloc(size + pad); \
|
||||
if (!dest->obj) \
|
||||
goto fail; \
|
||||
memcpy(dest->obj, src->obj, size); \
|
||||
if (pad) \
|
||||
memset(((uint8_t *) dest->obj) + size, 0, pad); \
|
||||
}
|
||||
alloc_and_copy_or_fail(extradata, src->extradata_size,
|
||||
AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
dest->extradata_size = src->extradata_size;
|
||||
alloc_and_copy_or_fail(intra_matrix, 64 * sizeof(int16_t), 0);
|
||||
alloc_and_copy_or_fail(inter_matrix, 64 * sizeof(int16_t), 0);
|
||||
alloc_and_copy_or_fail(rc_override, src->rc_override_count * sizeof(*src->rc_override), 0);
|
||||
alloc_and_copy_or_fail(subtitle_header, src->subtitle_header_size, 1);
|
||||
av_assert0(dest->subtitle_header_size == src->subtitle_header_size);
|
||||
#undef alloc_and_copy_or_fail
|
||||
|
||||
if (src->hw_frames_ctx) {
|
||||
dest->hw_frames_ctx = av_buffer_ref(src->hw_frames_ctx);
|
||||
if (!dest->hw_frames_ctx)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
av_freep(&dest->subtitle_header);
|
||||
av_freep(&dest->rc_override);
|
||||
av_freep(&dest->intra_matrix);
|
||||
av_freep(&dest->inter_matrix);
|
||||
av_freep(&dest->extradata);
|
||||
av_buffer_unref(&dest->hw_frames_ctx);
|
||||
dest->subtitle_header_size = 0;
|
||||
dest->extradata_size = 0;
|
||||
av_opt_free(dest);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
#endif
|
||||
|
||||
const AVClass *avcodec_get_class(void)
|
||||
{
|
||||
return &av_codec_context_class;
|
||||
}
|
||||
|
||||
#define FOFFSET(x) offsetof(AVFrame,x)
|
||||
|
||||
static const AVOption frame_options[]={
|
||||
{"best_effort_timestamp", "", FOFFSET(best_effort_timestamp), AV_OPT_TYPE_INT64, {.i64 = AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, 0},
|
||||
{"pkt_pos", "", FOFFSET(pkt_pos), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
|
||||
{"pkt_size", "", FOFFSET(pkt_size), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
|
||||
{"sample_aspect_ratio", "", FOFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0},
|
||||
{"width", "", FOFFSET(width), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"height", "", FOFFSET(height), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"format", "", FOFFSET(format), AV_OPT_TYPE_INT, {.i64 = -1 }, 0, INT_MAX, 0},
|
||||
{"channel_layout", "", FOFFSET(channel_layout), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, 0},
|
||||
{"sample_rate", "", FOFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{NULL},
|
||||
};
|
||||
|
||||
static const AVClass av_frame_class = {
|
||||
.class_name = "AVFrame",
|
||||
.item_name = NULL,
|
||||
.option = frame_options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
const AVClass *avcodec_get_frame_class(void)
|
||||
{
|
||||
return &av_frame_class;
|
||||
}
|
||||
|
||||
#define SROFFSET(x) offsetof(AVSubtitleRect,x)
|
||||
|
||||
static const AVOption subtitle_rect_options[]={
|
||||
{"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
|
||||
{"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, "flags"},
|
||||
{"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0},
|
||||
{NULL},
|
||||
};
|
||||
|
||||
static const AVClass av_subtitle_rect_class = {
|
||||
.class_name = "AVSubtitleRect",
|
||||
.item_name = NULL,
|
||||
.option = subtitle_rect_options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
const AVClass *avcodec_get_subtitle_rect_class(void)
|
||||
{
|
||||
return &av_subtitle_rect_class;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
static int dummy_init(AVCodecContext *ctx)
|
||||
{
|
||||
//TODO: this code should set every possible pointer that could be set by codec and is not an option;
|
||||
ctx->extradata_size = 8;
|
||||
ctx->extradata = av_malloc(ctx->extradata_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_close(AVCodecContext *ctx)
|
||||
{
|
||||
av_freep(&ctx->extradata);
|
||||
ctx->extradata_size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_encode(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
|
||||
{
|
||||
return AVERROR(ENOSYS);
|
||||
}
|
||||
|
||||
typedef struct Dummy12Context {
|
||||
AVClass *av_class;
|
||||
int num;
|
||||
char* str;
|
||||
} Dummy12Context;
|
||||
|
||||
typedef struct Dummy3Context {
|
||||
void *fake_av_class;
|
||||
int num;
|
||||
char* str;
|
||||
} Dummy3Context;
|
||||
|
||||
#define OFFSET(x) offsetof(Dummy12Context, x)
|
||||
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
|
||||
static const AVOption dummy_options[] = {
|
||||
{ "str", "set str", OFFSET(str), AV_OPT_TYPE_STRING, { .str = "i'm src default value" }, 0, 0, VE},
|
||||
{ "num", "set num", OFFSET(num), AV_OPT_TYPE_INT, { .i64 = 1500100900 }, 0, INT_MAX, VE},
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
static const AVClass dummy_v1_class = {
|
||||
.class_name = "dummy_v1_class",
|
||||
.item_name = av_default_item_name,
|
||||
.option = dummy_options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
static const AVClass dummy_v2_class = {
|
||||
.class_name = "dummy_v2_class",
|
||||
.item_name = av_default_item_name,
|
||||
.option = dummy_options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
/* codec with options */
|
||||
static AVCodec dummy_v1_encoder = {
|
||||
.name = "dummy_v1_codec",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.id = AV_CODEC_ID_NONE - 1,
|
||||
.encode2 = dummy_encode,
|
||||
.init = dummy_init,
|
||||
.close = dummy_close,
|
||||
.priv_class = &dummy_v1_class,
|
||||
.priv_data_size = sizeof(Dummy12Context),
|
||||
};
|
||||
|
||||
/* codec with options, different class */
|
||||
static AVCodec dummy_v2_encoder = {
|
||||
.name = "dummy_v2_codec",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.id = AV_CODEC_ID_NONE - 2,
|
||||
.encode2 = dummy_encode,
|
||||
.init = dummy_init,
|
||||
.close = dummy_close,
|
||||
.priv_class = &dummy_v2_class,
|
||||
.priv_data_size = sizeof(Dummy12Context),
|
||||
};
|
||||
|
||||
/* codec with priv data, but no class */
|
||||
static AVCodec dummy_v3_encoder = {
|
||||
.name = "dummy_v3_codec",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.id = AV_CODEC_ID_NONE - 3,
|
||||
.encode2 = dummy_encode,
|
||||
.init = dummy_init,
|
||||
.close = dummy_close,
|
||||
.priv_data_size = sizeof(Dummy3Context),
|
||||
};
|
||||
|
||||
/* codec without priv data */
|
||||
static AVCodec dummy_v4_encoder = {
|
||||
.name = "dummy_v4_codec",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.id = AV_CODEC_ID_NONE - 4,
|
||||
.encode2 = dummy_encode,
|
||||
.init = dummy_init,
|
||||
.close = dummy_close,
|
||||
};
|
||||
|
||||
static void test_copy_print_codec(const AVCodecContext *ctx)
|
||||
{
|
||||
printf("%-14s: %dx%d prv: %s",
|
||||
ctx->codec ? ctx->codec->name : "NULL",
|
||||
ctx->width, ctx->height,
|
||||
ctx->priv_data ? "set" : "null");
|
||||
if (ctx->codec && ctx->codec->priv_class && ctx->codec->priv_data_size) {
|
||||
int64_t i64;
|
||||
char *str = NULL;
|
||||
av_opt_get_int(ctx->priv_data, "num", 0, &i64);
|
||||
av_opt_get(ctx->priv_data, "str", 0, (uint8_t**)&str);
|
||||
printf(" opts: %"PRId64" %s", i64, str);
|
||||
av_free(str);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void test_copy(const AVCodec *c1, const AVCodec *c2)
|
||||
{
|
||||
AVCodecContext *ctx1, *ctx2;
|
||||
printf("%s -> %s\nclosed:\n", c1 ? c1->name : "NULL", c2 ? c2->name : "NULL");
|
||||
ctx1 = avcodec_alloc_context3(c1);
|
||||
ctx2 = avcodec_alloc_context3(c2);
|
||||
ctx1->width = ctx1->height = 128;
|
||||
if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
|
||||
av_opt_set(ctx2->priv_data, "num", "667", 0);
|
||||
av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
|
||||
}
|
||||
avcodec_copy_context(ctx2, ctx1);
|
||||
test_copy_print_codec(ctx1);
|
||||
test_copy_print_codec(ctx2);
|
||||
if (ctx1->codec) {
|
||||
printf("opened:\n");
|
||||
avcodec_open2(ctx1, ctx1->codec, NULL);
|
||||
if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
|
||||
av_opt_set(ctx2->priv_data, "num", "667", 0);
|
||||
av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
|
||||
}
|
||||
avcodec_copy_context(ctx2, ctx1);
|
||||
test_copy_print_codec(ctx1);
|
||||
test_copy_print_codec(ctx2);
|
||||
avcodec_close(ctx1);
|
||||
}
|
||||
avcodec_free_context(&ctx1);
|
||||
avcodec_free_context(&ctx2);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
AVCodec *dummy_codec[] = {
|
||||
&dummy_v1_encoder,
|
||||
&dummy_v2_encoder,
|
||||
&dummy_v3_encoder,
|
||||
&dummy_v4_encoder,
|
||||
NULL,
|
||||
};
|
||||
int i, j;
|
||||
|
||||
for (i = 0; dummy_codec[i]; i++)
|
||||
avcodec_register(dummy_codec[i]);
|
||||
|
||||
printf("testing avcodec_copy_context()\n");
|
||||
for (i = 0; i < FF_ARRAY_ELEMS(dummy_codec); i++)
|
||||
for (j = 0; j < FF_ARRAY_ELEMS(dummy_codec); j++)
|
||||
test_copy(dummy_codec[i], dummy_codec[j]);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
340
media/ffvpx/libavcodec/parser.c
Normal file
340
media/ffvpx/libavcodec/parser.c
Normal file
|
|
@ -0,0 +1,340 @@
|
|||
/*
|
||||
* Audio and Video frame extraction
|
||||
* Copyright (c) 2003 Fabrice Bellard
|
||||
* Copyright (c) 2003 Michael Niedermayer
|
||||
*
|
||||
* 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 <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/atomic.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
#include "internal.h"
|
||||
#include "parser.h"
|
||||
|
||||
static AVCodecParser *av_first_parser = NULL;
|
||||
|
||||
AVCodecParser *av_parser_next(const AVCodecParser *p)
|
||||
{
|
||||
if (p)
|
||||
return p->next;
|
||||
else
|
||||
return av_first_parser;
|
||||
}
|
||||
|
||||
void av_register_codec_parser(AVCodecParser *parser)
|
||||
{
|
||||
do {
|
||||
parser->next = av_first_parser;
|
||||
} while (parser->next != avpriv_atomic_ptr_cas((void * volatile *)&av_first_parser, parser->next, parser));
|
||||
}
|
||||
|
||||
AVCodecParserContext *av_parser_init(int codec_id)
|
||||
{
|
||||
AVCodecParserContext *s = NULL;
|
||||
AVCodecParser *parser;
|
||||
int ret;
|
||||
|
||||
if (codec_id == AV_CODEC_ID_NONE)
|
||||
return NULL;
|
||||
|
||||
for (parser = av_first_parser; parser; parser = parser->next) {
|
||||
if (parser->codec_ids[0] == codec_id ||
|
||||
parser->codec_ids[1] == codec_id ||
|
||||
parser->codec_ids[2] == codec_id ||
|
||||
parser->codec_ids[3] == codec_id ||
|
||||
parser->codec_ids[4] == codec_id)
|
||||
goto found;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
found:
|
||||
s = av_mallocz(sizeof(AVCodecParserContext));
|
||||
if (!s)
|
||||
goto err_out;
|
||||
s->parser = parser;
|
||||
s->priv_data = av_mallocz(parser->priv_data_size);
|
||||
if (!s->priv_data)
|
||||
goto err_out;
|
||||
s->fetch_timestamp=1;
|
||||
s->pict_type = AV_PICTURE_TYPE_I;
|
||||
if (parser->parser_init) {
|
||||
ret = parser->parser_init(s);
|
||||
if (ret != 0)
|
||||
goto err_out;
|
||||
}
|
||||
s->key_frame = -1;
|
||||
#if FF_API_CONVERGENCE_DURATION
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
s->convergence_duration = 0;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
s->dts_sync_point = INT_MIN;
|
||||
s->dts_ref_dts_delta = INT_MIN;
|
||||
s->pts_dts_delta = INT_MIN;
|
||||
s->format = -1;
|
||||
|
||||
return s;
|
||||
|
||||
err_out:
|
||||
if (s)
|
||||
av_freep(&s->priv_data);
|
||||
av_free(s);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove, int fuzzy)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!fuzzy) {
|
||||
s->dts =
|
||||
s->pts = AV_NOPTS_VALUE;
|
||||
s->pos = -1;
|
||||
s->offset = 0;
|
||||
}
|
||||
for (i = 0; i < AV_PARSER_PTS_NB; i++) {
|
||||
if (s->cur_offset + off >= s->cur_frame_offset[i] &&
|
||||
(s->frame_offset < s->cur_frame_offset[i] ||
|
||||
(!s->frame_offset && !s->next_frame_offset)) && // first field/frame
|
||||
// check disabled since MPEG-TS does not send complete PES packets
|
||||
/*s->next_frame_offset + off <*/ s->cur_frame_end[i]){
|
||||
|
||||
if (!fuzzy || s->cur_frame_dts[i] != AV_NOPTS_VALUE) {
|
||||
s->dts = s->cur_frame_dts[i];
|
||||
s->pts = s->cur_frame_pts[i];
|
||||
s->pos = s->cur_frame_pos[i];
|
||||
s->offset = s->next_frame_offset - s->cur_frame_offset[i];
|
||||
}
|
||||
if (remove)
|
||||
s->cur_frame_offset[i] = INT64_MAX;
|
||||
if (s->cur_offset + off < s->cur_frame_end[i])
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx,
|
||||
uint8_t **poutbuf, int *poutbuf_size,
|
||||
const uint8_t *buf, int buf_size,
|
||||
int64_t pts, int64_t dts, int64_t pos)
|
||||
{
|
||||
int index, i;
|
||||
uint8_t dummy_buf[AV_INPUT_BUFFER_PADDING_SIZE];
|
||||
|
||||
av_assert1(avctx->codec_id != AV_CODEC_ID_NONE);
|
||||
|
||||
/* Parsers only work for the specified codec ids. */
|
||||
av_assert1(avctx->codec_id == s->parser->codec_ids[0] ||
|
||||
avctx->codec_id == s->parser->codec_ids[1] ||
|
||||
avctx->codec_id == s->parser->codec_ids[2] ||
|
||||
avctx->codec_id == s->parser->codec_ids[3] ||
|
||||
avctx->codec_id == s->parser->codec_ids[4]);
|
||||
|
||||
if (!(s->flags & PARSER_FLAG_FETCHED_OFFSET)) {
|
||||
s->next_frame_offset =
|
||||
s->cur_offset = pos;
|
||||
s->flags |= PARSER_FLAG_FETCHED_OFFSET;
|
||||
}
|
||||
|
||||
if (buf_size == 0) {
|
||||
/* padding is always necessary even if EOF, so we add it here */
|
||||
memset(dummy_buf, 0, sizeof(dummy_buf));
|
||||
buf = dummy_buf;
|
||||
} else if (s->cur_offset + buf_size != s->cur_frame_end[s->cur_frame_start_index]) { /* skip remainder packets */
|
||||
/* add a new packet descriptor */
|
||||
i = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
|
||||
s->cur_frame_start_index = i;
|
||||
s->cur_frame_offset[i] = s->cur_offset;
|
||||
s->cur_frame_end[i] = s->cur_offset + buf_size;
|
||||
s->cur_frame_pts[i] = pts;
|
||||
s->cur_frame_dts[i] = dts;
|
||||
s->cur_frame_pos[i] = pos;
|
||||
}
|
||||
|
||||
if (s->fetch_timestamp) {
|
||||
s->fetch_timestamp = 0;
|
||||
s->last_pts = s->pts;
|
||||
s->last_dts = s->dts;
|
||||
s->last_pos = s->pos;
|
||||
ff_fetch_timestamp(s, 0, 0, 0);
|
||||
}
|
||||
/* WARNING: the returned index can be negative */
|
||||
index = s->parser->parser_parse(s, avctx, (const uint8_t **) poutbuf,
|
||||
poutbuf_size, buf, buf_size);
|
||||
av_assert0(index > -0x20000000); // The API does not allow returning AVERROR codes
|
||||
/* update the file pointer */
|
||||
if (*poutbuf_size) {
|
||||
/* fill the data for the current frame */
|
||||
s->frame_offset = s->next_frame_offset;
|
||||
|
||||
/* offset of the next frame */
|
||||
s->next_frame_offset = s->cur_offset + index;
|
||||
s->fetch_timestamp = 1;
|
||||
}
|
||||
if (index < 0)
|
||||
index = 0;
|
||||
s->cur_offset += index;
|
||||
return index;
|
||||
}
|
||||
|
||||
int av_parser_change(AVCodecParserContext *s, AVCodecContext *avctx,
|
||||
uint8_t **poutbuf, int *poutbuf_size,
|
||||
const uint8_t *buf, int buf_size, int keyframe)
|
||||
{
|
||||
if (s && s->parser->split) {
|
||||
if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER ||
|
||||
avctx->flags2 & AV_CODEC_FLAG2_LOCAL_HEADER) {
|
||||
int i = s->parser->split(avctx, buf, buf_size);
|
||||
buf += i;
|
||||
buf_size -= i;
|
||||
}
|
||||
}
|
||||
|
||||
/* cast to avoid warning about discarding qualifiers */
|
||||
*poutbuf = (uint8_t *) buf;
|
||||
*poutbuf_size = buf_size;
|
||||
if (avctx->extradata) {
|
||||
if (keyframe && (avctx->flags2 & AV_CODEC_FLAG2_LOCAL_HEADER)) {
|
||||
int size = buf_size + avctx->extradata_size;
|
||||
|
||||
*poutbuf_size = size;
|
||||
*poutbuf = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!*poutbuf)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
|
||||
memcpy(*poutbuf + avctx->extradata_size, buf,
|
||||
buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void av_parser_close(AVCodecParserContext *s)
|
||||
{
|
||||
if (s) {
|
||||
if (s->parser->parser_close)
|
||||
s->parser->parser_close(s);
|
||||
av_freep(&s->priv_data);
|
||||
av_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
int ff_combine_frame(ParseContext *pc, int next,
|
||||
const uint8_t **buf, int *buf_size)
|
||||
{
|
||||
if (pc->overread) {
|
||||
ff_dlog(NULL, "overread %d, state:%X next:%d index:%d o_index:%d\n",
|
||||
pc->overread, pc->state, next, pc->index, pc->overread_index);
|
||||
ff_dlog(NULL, "%X %X %X %X\n",
|
||||
(*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
|
||||
}
|
||||
|
||||
/* Copy overread bytes from last frame into buffer. */
|
||||
for (; pc->overread > 0; pc->overread--)
|
||||
pc->buffer[pc->index++] = pc->buffer[pc->overread_index++];
|
||||
|
||||
/* flush remaining if EOF */
|
||||
if (!*buf_size && next == END_NOT_FOUND)
|
||||
next = 0;
|
||||
|
||||
pc->last_index = pc->index;
|
||||
|
||||
/* copy into buffer end return */
|
||||
if (next == END_NOT_FOUND) {
|
||||
void *new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size,
|
||||
*buf_size + pc->index +
|
||||
AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
|
||||
if (!new_buffer) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to reallocate parser buffer to %d\n", *buf_size + pc->index + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
pc->index = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
pc->buffer = new_buffer;
|
||||
memcpy(&pc->buffer[pc->index], *buf, *buf_size);
|
||||
pc->index += *buf_size;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*buf_size =
|
||||
pc->overread_index = pc->index + next;
|
||||
|
||||
/* append to buffer */
|
||||
if (pc->index) {
|
||||
void *new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size,
|
||||
next + pc->index +
|
||||
AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!new_buffer) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to reallocate parser buffer to %d\n", next + pc->index + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
pc->overread_index =
|
||||
pc->index = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
pc->buffer = new_buffer;
|
||||
if (next > -AV_INPUT_BUFFER_PADDING_SIZE)
|
||||
memcpy(&pc->buffer[pc->index], *buf,
|
||||
next + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
pc->index = 0;
|
||||
*buf = pc->buffer;
|
||||
}
|
||||
|
||||
/* store overread bytes */
|
||||
for (; next < 0; next++) {
|
||||
pc->state = pc->state << 8 | pc->buffer[pc->last_index + next];
|
||||
pc->state64 = pc->state64 << 8 | pc->buffer[pc->last_index + next];
|
||||
pc->overread++;
|
||||
}
|
||||
|
||||
if (pc->overread) {
|
||||
ff_dlog(NULL, "overread %d, state:%X next:%d index:%d o_index:%d\n",
|
||||
pc->overread, pc->state, next, pc->index, pc->overread_index);
|
||||
ff_dlog(NULL, "%X %X %X %X\n",
|
||||
(*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_parse_close(AVCodecParserContext *s)
|
||||
{
|
||||
ParseContext *pc = s->priv_data;
|
||||
|
||||
av_freep(&pc->buffer);
|
||||
}
|
||||
|
||||
int ff_mpeg4video_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
|
||||
{
|
||||
uint32_t state = -1;
|
||||
const uint8_t *ptr = buf, *end = buf + buf_size;
|
||||
|
||||
while (ptr < end) {
|
||||
ptr = avpriv_find_start_code(ptr, end, &state);
|
||||
if (state == 0x1B3 || state == 0x1B6)
|
||||
return ptr - 4 - buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
60
media/ffvpx/libavcodec/parser.h
Normal file
60
media/ffvpx/libavcodec/parser.h
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* AVCodecParser prototypes and definitions
|
||||
* Copyright (c) 2003 Fabrice Bellard
|
||||
* Copyright (c) 2003 Michael Niedermayer
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_PARSER_H
|
||||
#define AVCODEC_PARSER_H
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
typedef struct ParseContext{
|
||||
uint8_t *buffer;
|
||||
int index;
|
||||
int last_index;
|
||||
unsigned int buffer_size;
|
||||
uint32_t state; ///< contains the last few bytes in MSB order
|
||||
int frame_start_found;
|
||||
int overread; ///< the number of bytes which where irreversibly read from the next frame
|
||||
int overread_index; ///< the index into ParseContext.buffer of the overread bytes
|
||||
uint64_t state64; ///< contains the last 8 bytes in MSB order
|
||||
} ParseContext;
|
||||
|
||||
#define END_NOT_FOUND (-100)
|
||||
|
||||
/**
|
||||
* Combine the (truncated) bitstream to a complete frame.
|
||||
* @return -1 if no complete frame could be created,
|
||||
* AVERROR(ENOMEM) if there was a memory allocation error
|
||||
*/
|
||||
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size);
|
||||
int ff_mpeg4video_split(AVCodecContext *avctx, const uint8_t *buf,
|
||||
int buf_size);
|
||||
void ff_parse_close(AVCodecParserContext *s);
|
||||
|
||||
/**
|
||||
* Fetch timestamps for a specific byte within the current access unit.
|
||||
* @param off byte position within the access unit
|
||||
* @param remove Found timestamps will be removed if set to 1, kept if set to 0.
|
||||
* @param fuzzy Only use found value if it is more informative than what we already have
|
||||
*/
|
||||
void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove, int fuzzy);
|
||||
|
||||
#endif /* AVCODEC_PARSER_H */
|
||||
48
media/ffvpx/libavcodec/pixblockdsp.h
Normal file
48
media/ffvpx/libavcodec/pixblockdsp.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_PIXBLOCKDSP_H
|
||||
#define AVCODEC_PIXBLOCKDSP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
typedef struct PixblockDSPContext {
|
||||
void (*get_pixels)(int16_t *block /* align 16 */,
|
||||
const uint8_t *pixels /* align 8 */,
|
||||
ptrdiff_t line_size);
|
||||
void (*diff_pixels)(int16_t *block /* align 16 */,
|
||||
const uint8_t *s1 /* align 8 */,
|
||||
const uint8_t *s2 /* align 8 */,
|
||||
int stride);
|
||||
} PixblockDSPContext;
|
||||
|
||||
void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);
|
||||
void ff_pixblockdsp_init_alpha(PixblockDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_pixblockdsp_init_arm(PixblockDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_pixblockdsp_init_x86(PixblockDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth);
|
||||
|
||||
#endif /* AVCODEC_PIXBLOCKDSP_H */
|
||||
131
media/ffvpx/libavcodec/profiles.c
Normal file
131
media/ffvpx/libavcodec/profiles.c
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* 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 "config.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "profiles.h"
|
||||
|
||||
#if !CONFIG_SMALL
|
||||
|
||||
const AVProfile ff_aac_profiles[] = {
|
||||
{ FF_PROFILE_AAC_LOW, "LC" },
|
||||
{ FF_PROFILE_AAC_HE, "HE-AAC" },
|
||||
{ FF_PROFILE_AAC_HE_V2, "HE-AACv2" },
|
||||
{ FF_PROFILE_AAC_LD, "LD" },
|
||||
{ FF_PROFILE_AAC_ELD, "ELD" },
|
||||
{ FF_PROFILE_AAC_MAIN, "Main" },
|
||||
{ FF_PROFILE_AAC_LOW, "LC" },
|
||||
{ FF_PROFILE_AAC_SSR, "SSR" },
|
||||
{ FF_PROFILE_AAC_LTP, "LTP" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_dca_profiles[] = {
|
||||
{ FF_PROFILE_DTS, "DTS" },
|
||||
{ FF_PROFILE_DTS_ES, "DTS-ES" },
|
||||
{ FF_PROFILE_DTS_96_24, "DTS 96/24" },
|
||||
{ FF_PROFILE_DTS_HD_HRA, "DTS-HD HRA" },
|
||||
{ FF_PROFILE_DTS_HD_MA, "DTS-HD MA" },
|
||||
{ FF_PROFILE_DTS_EXPRESS, "DTS Express" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_h264_profiles[] = {
|
||||
{ FF_PROFILE_H264_BASELINE, "Baseline" },
|
||||
{ FF_PROFILE_H264_CONSTRAINED_BASELINE, "Constrained Baseline" },
|
||||
{ FF_PROFILE_H264_MAIN, "Main" },
|
||||
{ FF_PROFILE_H264_EXTENDED, "Extended" },
|
||||
{ FF_PROFILE_H264_HIGH, "High" },
|
||||
{ FF_PROFILE_H264_HIGH_10, "High 10" },
|
||||
{ FF_PROFILE_H264_HIGH_10_INTRA, "High 10 Intra" },
|
||||
{ FF_PROFILE_H264_HIGH_422, "High 4:2:2" },
|
||||
{ FF_PROFILE_H264_HIGH_422_INTRA, "High 4:2:2 Intra" },
|
||||
{ FF_PROFILE_H264_HIGH_444, "High 4:4:4" },
|
||||
{ FF_PROFILE_H264_HIGH_444_PREDICTIVE, "High 4:4:4 Predictive" },
|
||||
{ FF_PROFILE_H264_HIGH_444_INTRA, "High 4:4:4 Intra" },
|
||||
{ FF_PROFILE_H264_CAVLC_444, "CAVLC 4:4:4" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_hevc_profiles[] = {
|
||||
{ FF_PROFILE_HEVC_MAIN, "Main" },
|
||||
{ FF_PROFILE_HEVC_MAIN_10, "Main 10" },
|
||||
{ FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
|
||||
{ FF_PROFILE_HEVC_REXT, "Rext" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_jpeg2000_profiles[] = {
|
||||
{ FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0, "JPEG 2000 codestream restriction 0" },
|
||||
{ FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1, "JPEG 2000 codestream restriction 1" },
|
||||
{ FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION, "JPEG 2000 no codestream restrictions" },
|
||||
{ FF_PROFILE_JPEG2000_DCINEMA_2K, "JPEG 2000 digital cinema 2K" },
|
||||
{ FF_PROFILE_JPEG2000_DCINEMA_4K, "JPEG 2000 digital cinema 4K" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_mpeg2_video_profiles[] = {
|
||||
{ FF_PROFILE_MPEG2_422, "4:2:2" },
|
||||
{ FF_PROFILE_MPEG2_HIGH, "High" },
|
||||
{ FF_PROFILE_MPEG2_SS, "Spatially Scalable" },
|
||||
{ FF_PROFILE_MPEG2_SNR_SCALABLE, "SNR Scalable" },
|
||||
{ FF_PROFILE_MPEG2_MAIN, "Main" },
|
||||
{ FF_PROFILE_MPEG2_SIMPLE, "Simple" },
|
||||
{ FF_PROFILE_RESERVED, "Reserved" },
|
||||
{ FF_PROFILE_RESERVED, "Reserved" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_mpeg4_video_profiles[] = {
|
||||
{ FF_PROFILE_MPEG4_SIMPLE, "Simple Profile" },
|
||||
{ FF_PROFILE_MPEG4_SIMPLE_SCALABLE, "Simple Scalable Profile" },
|
||||
{ FF_PROFILE_MPEG4_CORE, "Core Profile" },
|
||||
{ FF_PROFILE_MPEG4_MAIN, "Main Profile" },
|
||||
{ FF_PROFILE_MPEG4_N_BIT, "N-bit Profile" },
|
||||
{ FF_PROFILE_MPEG4_SCALABLE_TEXTURE, "Scalable Texture Profile" },
|
||||
{ FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION, "Simple Face Animation Profile" },
|
||||
{ FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE, "Basic Animated Texture Profile" },
|
||||
{ FF_PROFILE_MPEG4_HYBRID, "Hybrid Profile" },
|
||||
{ FF_PROFILE_MPEG4_ADVANCED_REAL_TIME, "Advanced Real Time Simple Profile" },
|
||||
{ FF_PROFILE_MPEG4_CORE_SCALABLE, "Code Scalable Profile" },
|
||||
{ FF_PROFILE_MPEG4_ADVANCED_CODING, "Advanced Coding Profile" },
|
||||
{ FF_PROFILE_MPEG4_ADVANCED_CORE, "Advanced Core Profile" },
|
||||
{ FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE, "Advanced Scalable Texture Profile" },
|
||||
{ FF_PROFILE_MPEG4_SIMPLE_STUDIO, "Simple Studio Profile" },
|
||||
{ FF_PROFILE_MPEG4_ADVANCED_SIMPLE, "Advanced Simple Profile" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_vc1_profiles[] = {
|
||||
{ FF_PROFILE_VC1_SIMPLE, "Simple" },
|
||||
{ FF_PROFILE_VC1_MAIN, "Main" },
|
||||
{ FF_PROFILE_VC1_COMPLEX, "Complex" },
|
||||
{ FF_PROFILE_VC1_ADVANCED, "Advanced" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
const AVProfile ff_vp9_profiles[] = {
|
||||
{ FF_PROFILE_VP9_0, "Profile 0" },
|
||||
{ FF_PROFILE_VP9_1, "Profile 1" },
|
||||
{ FF_PROFILE_VP9_2, "Profile 2" },
|
||||
{ FF_PROFILE_VP9_3, "Profile 3" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
#endif /* !CONFIG_SMALL */
|
||||
34
media/ffvpx/libavcodec/profiles.h
Normal file
34
media/ffvpx/libavcodec/profiles.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_PROFILES_H
|
||||
#define AVCODEC_PROFILES_H
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
extern const AVProfile ff_aac_profiles[];
|
||||
extern const AVProfile ff_dca_profiles[];
|
||||
extern const AVProfile ff_h264_profiles[];
|
||||
extern const AVProfile ff_hevc_profiles[];
|
||||
extern const AVProfile ff_jpeg2000_profiles[];
|
||||
extern const AVProfile ff_mpeg2_video_profiles[];
|
||||
extern const AVProfile ff_mpeg4_video_profiles[];
|
||||
extern const AVProfile ff_vc1_profiles[];
|
||||
extern const AVProfile ff_vp9_profiles[];
|
||||
|
||||
#endif /* AVCODEC_PROFILES_H */
|
||||
88
media/ffvpx/libavcodec/pthread.c
Normal file
88
media/ffvpx/libavcodec/pthread.c
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2004 Roman Shaposhnik
|
||||
* Copyright (c) 2008 Alexander Strange (astrange@ithinksw.com)
|
||||
*
|
||||
* Many thanks to Steven M. Schultz for providing clever ideas and
|
||||
* to Michael Niedermayer <michaelni@gmx.at> for writing initial
|
||||
* implementation.
|
||||
*
|
||||
* 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
|
||||
* Multithreading support functions
|
||||
* @see doc/multithreading.txt
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "pthread_internal.h"
|
||||
#include "thread.h"
|
||||
|
||||
/**
|
||||
* Set the threading algorithms used.
|
||||
*
|
||||
* Threading requires more than one thread.
|
||||
* Frame threading requires entire frames to be passed to the codec,
|
||||
* and introduces extra decoding delay, so is incompatible with low_delay.
|
||||
*
|
||||
* @param avctx The context.
|
||||
*/
|
||||
static void validate_thread_parameters(AVCodecContext *avctx)
|
||||
{
|
||||
int frame_threading_supported = (avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)
|
||||
&& !(avctx->flags & AV_CODEC_FLAG_TRUNCATED)
|
||||
&& !(avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
|
||||
&& !(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS);
|
||||
if (avctx->thread_count == 1) {
|
||||
avctx->active_thread_type = 0;
|
||||
} else if (frame_threading_supported && (avctx->thread_type & FF_THREAD_FRAME)) {
|
||||
avctx->active_thread_type = FF_THREAD_FRAME;
|
||||
} else if (avctx->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS &&
|
||||
avctx->thread_type & FF_THREAD_SLICE) {
|
||||
avctx->active_thread_type = FF_THREAD_SLICE;
|
||||
} else if (!(avctx->codec->capabilities & AV_CODEC_CAP_AUTO_THREADS)) {
|
||||
avctx->thread_count = 1;
|
||||
avctx->active_thread_type = 0;
|
||||
}
|
||||
|
||||
if (avctx->thread_count > MAX_AUTO_THREADS)
|
||||
av_log(avctx, AV_LOG_WARNING,
|
||||
"Application has requested %d threads. Using a thread count greater than %d is not recommended.\n",
|
||||
avctx->thread_count, MAX_AUTO_THREADS);
|
||||
}
|
||||
|
||||
int ff_thread_init(AVCodecContext *avctx)
|
||||
{
|
||||
validate_thread_parameters(avctx);
|
||||
|
||||
if (avctx->active_thread_type&FF_THREAD_SLICE)
|
||||
return ff_slice_thread_init(avctx);
|
||||
else if (avctx->active_thread_type&FF_THREAD_FRAME)
|
||||
return ff_frame_thread_init(avctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_thread_free(AVCodecContext *avctx)
|
||||
{
|
||||
if (avctx->active_thread_type&FF_THREAD_FRAME)
|
||||
ff_frame_thread_free(avctx, avctx->thread_count);
|
||||
else
|
||||
ff_slice_thread_free(avctx);
|
||||
}
|
||||
900
media/ffvpx/libavcodec/pthread_frame.c
Normal file
900
media/ffvpx/libavcodec/pthread_frame.c
Normal file
|
|
@ -0,0 +1,900 @@
|
|||
/*
|
||||
* 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
|
||||
* Frame multithreading support functions
|
||||
* @see doc/multithreading.txt
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "pthread_internal.h"
|
||||
#include "thread.h"
|
||||
#include "version.h"
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/buffer.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/frame.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/thread.h"
|
||||
|
||||
#if defined(MOZ_TSAN)
|
||||
typedef _Atomic(int) atomic_int;
|
||||
#else
|
||||
typedef volatile int atomic_int;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Context used by codec threads and stored in their AVCodecInternal thread_ctx.
|
||||
*/
|
||||
typedef enum {
|
||||
STATE_INPUT_READY, ///< Set when the thread is awaiting a packet.
|
||||
STATE_SETTING_UP, ///< Set before the codec has called ff_thread_finish_setup().
|
||||
STATE_GET_BUFFER, /**<
|
||||
* Set when the codec calls get_buffer().
|
||||
* State is returned to STATE_SETTING_UP afterwards.
|
||||
*/
|
||||
STATE_GET_FORMAT, /**<
|
||||
* Set when the codec calls get_format().
|
||||
* State is returned to STATE_SETTING_UP afterwards.
|
||||
*/
|
||||
STATE_SETUP_FINISHED ///< Set after the codec has called ff_thread_finish_setup().
|
||||
} State;
|
||||
|
||||
typedef struct PerThreadContext {
|
||||
struct FrameThreadContext *parent;
|
||||
|
||||
pthread_t thread;
|
||||
int thread_init;
|
||||
pthread_cond_t input_cond; ///< Used to wait for a new packet from the main thread.
|
||||
pthread_cond_t progress_cond; ///< Used by child threads to wait for progress to change.
|
||||
pthread_cond_t output_cond; ///< Used by the main thread to wait for frames to finish.
|
||||
|
||||
pthread_mutex_t mutex; ///< Mutex used to protect the contents of the PerThreadContext.
|
||||
pthread_mutex_t progress_mutex; ///< Mutex used to protect frame progress values and progress_cond.
|
||||
|
||||
AVCodecContext *avctx; ///< Context used to decode packets passed to this thread.
|
||||
|
||||
AVPacket avpkt; ///< Input packet (for decoding) or output (for encoding).
|
||||
|
||||
AVFrame *frame; ///< Output frame (for decoding) or input (for encoding).
|
||||
int got_frame; ///< The output of got_picture_ptr from the last avcodec_decode_video() call.
|
||||
int result; ///< The result of the last codec decode/encode() call.
|
||||
|
||||
atomic_int state;
|
||||
|
||||
/**
|
||||
* Array of frames passed to ff_thread_release_buffer().
|
||||
* Frames are released after all threads referencing them are finished.
|
||||
*/
|
||||
AVFrame *released_buffers;
|
||||
int num_released_buffers;
|
||||
int released_buffers_allocated;
|
||||
|
||||
AVFrame *requested_frame; ///< AVFrame the codec passed to get_buffer()
|
||||
int requested_flags; ///< flags passed to get_buffer() for requested_frame
|
||||
|
||||
const enum AVPixelFormat *available_formats; ///< Format array for get_format()
|
||||
enum AVPixelFormat result_format; ///< get_format() result
|
||||
|
||||
int die; ///< Set when the thread should exit.
|
||||
} PerThreadContext;
|
||||
|
||||
/**
|
||||
* Context stored in the client AVCodecInternal thread_ctx.
|
||||
*/
|
||||
typedef struct FrameThreadContext {
|
||||
PerThreadContext *threads; ///< The contexts for each thread.
|
||||
PerThreadContext *prev_thread; ///< The last thread submit_packet() was called on.
|
||||
|
||||
pthread_mutex_t buffer_mutex; ///< Mutex used to protect get/release_buffer().
|
||||
|
||||
int next_decoding; ///< The next context to submit a packet to.
|
||||
int next_finished; ///< The next context to return output from.
|
||||
|
||||
int delaying; /**<
|
||||
* Set for the first N packets, where N is the number of threads.
|
||||
* While it is set, ff_thread_en/decode_frame won't return any results.
|
||||
*/
|
||||
} FrameThreadContext;
|
||||
|
||||
#define THREAD_SAFE_CALLBACKS(avctx) \
|
||||
((avctx)->thread_safe_callbacks || (avctx)->get_buffer2 == avcodec_default_get_buffer2)
|
||||
|
||||
/**
|
||||
* Codec worker thread.
|
||||
*
|
||||
* Automatically calls ff_thread_finish_setup() if the codec does
|
||||
* not provide an update_thread_context method, or if the codec returns
|
||||
* before calling it.
|
||||
*/
|
||||
static attribute_align_arg void *frame_worker_thread(void *arg)
|
||||
{
|
||||
PerThreadContext *p = arg;
|
||||
AVCodecContext *avctx = p->avctx;
|
||||
const AVCodec *codec = avctx->codec;
|
||||
|
||||
pthread_mutex_lock(&p->mutex);
|
||||
while (1) {
|
||||
while (p->state == STATE_INPUT_READY && !p->die)
|
||||
pthread_cond_wait(&p->input_cond, &p->mutex);
|
||||
|
||||
if (p->die) break;
|
||||
|
||||
if (!codec->update_thread_context && THREAD_SAFE_CALLBACKS(avctx))
|
||||
ff_thread_finish_setup(avctx);
|
||||
|
||||
av_frame_unref(p->frame);
|
||||
p->got_frame = 0;
|
||||
p->result = codec->decode(avctx, p->frame, &p->got_frame, &p->avpkt);
|
||||
|
||||
if ((p->result < 0 || !p->got_frame) && p->frame->buf[0]) {
|
||||
if (avctx->internal->allocate_progress)
|
||||
av_log(avctx, AV_LOG_ERROR, "A frame threaded decoder did not "
|
||||
"free the frame on failure. This is a bug, please report it.\n");
|
||||
av_frame_unref(p->frame);
|
||||
}
|
||||
|
||||
if (p->state == STATE_SETTING_UP) ff_thread_finish_setup(avctx);
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
#if 0 //BUFREF-FIXME
|
||||
for (i = 0; i < MAX_BUFFERS; i++)
|
||||
if (p->progress_used[i] && (p->got_frame || p->result<0 || avctx->codec_id != AV_CODEC_ID_H264)) {
|
||||
p->progress[i][0] = INT_MAX;
|
||||
p->progress[i][1] = INT_MAX;
|
||||
}
|
||||
#endif
|
||||
p->state = STATE_INPUT_READY;
|
||||
|
||||
pthread_cond_broadcast(&p->progress_cond);
|
||||
pthread_cond_signal(&p->output_cond);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&p->mutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the next thread's AVCodecContext with values from the reference thread's context.
|
||||
*
|
||||
* @param dst The destination context.
|
||||
* @param src The source context.
|
||||
* @param for_user 0 if the destination is a codec thread, 1 if the destination is the user's thread
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src, int for_user)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (dst != src) {
|
||||
dst->time_base = src->time_base;
|
||||
dst->framerate = src->framerate;
|
||||
dst->width = src->width;
|
||||
dst->height = src->height;
|
||||
dst->pix_fmt = src->pix_fmt;
|
||||
|
||||
dst->coded_width = src->coded_width;
|
||||
dst->coded_height = src->coded_height;
|
||||
|
||||
dst->has_b_frames = src->has_b_frames;
|
||||
dst->idct_algo = src->idct_algo;
|
||||
|
||||
dst->bits_per_coded_sample = src->bits_per_coded_sample;
|
||||
dst->sample_aspect_ratio = src->sample_aspect_ratio;
|
||||
#if FF_API_AFD
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
dst->dtg_active_format = src->dtg_active_format;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif /* FF_API_AFD */
|
||||
|
||||
dst->profile = src->profile;
|
||||
dst->level = src->level;
|
||||
|
||||
dst->bits_per_raw_sample = src->bits_per_raw_sample;
|
||||
dst->ticks_per_frame = src->ticks_per_frame;
|
||||
dst->color_primaries = src->color_primaries;
|
||||
|
||||
dst->color_trc = src->color_trc;
|
||||
dst->colorspace = src->colorspace;
|
||||
dst->color_range = src->color_range;
|
||||
dst->chroma_sample_location = src->chroma_sample_location;
|
||||
|
||||
dst->hwaccel = src->hwaccel;
|
||||
dst->hwaccel_context = src->hwaccel_context;
|
||||
|
||||
dst->channels = src->channels;
|
||||
dst->sample_rate = src->sample_rate;
|
||||
dst->sample_fmt = src->sample_fmt;
|
||||
dst->channel_layout = src->channel_layout;
|
||||
dst->internal->hwaccel_priv_data = src->internal->hwaccel_priv_data;
|
||||
}
|
||||
|
||||
if (for_user) {
|
||||
dst->delay = src->thread_count - 1;
|
||||
#if FF_API_CODED_FRAME
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
dst->coded_frame = src->coded_frame;
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
#endif
|
||||
} else {
|
||||
if (dst->codec->update_thread_context)
|
||||
err = dst->codec->update_thread_context(dst, src);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the next thread's AVCodecContext with values set by the user.
|
||||
*
|
||||
* @param dst The destination context.
|
||||
* @param src The source context.
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
|
||||
{
|
||||
#define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
|
||||
dst->flags = src->flags;
|
||||
|
||||
dst->draw_horiz_band= src->draw_horiz_band;
|
||||
dst->get_buffer2 = src->get_buffer2;
|
||||
|
||||
dst->opaque = src->opaque;
|
||||
dst->debug = src->debug;
|
||||
dst->debug_mv = src->debug_mv;
|
||||
|
||||
dst->slice_flags = src->slice_flags;
|
||||
dst->flags2 = src->flags2;
|
||||
|
||||
copy_fields(skip_loop_filter, subtitle_header);
|
||||
|
||||
dst->frame_number = src->frame_number;
|
||||
dst->reordered_opaque = src->reordered_opaque;
|
||||
dst->thread_safe_callbacks = src->thread_safe_callbacks;
|
||||
|
||||
if (src->slice_count && src->slice_offset) {
|
||||
if (dst->slice_count < src->slice_count) {
|
||||
int err = av_reallocp_array(&dst->slice_offset, src->slice_count,
|
||||
sizeof(*dst->slice_offset));
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
memcpy(dst->slice_offset, src->slice_offset,
|
||||
src->slice_count * sizeof(*dst->slice_offset));
|
||||
}
|
||||
dst->slice_count = src->slice_count;
|
||||
return 0;
|
||||
#undef copy_fields
|
||||
}
|
||||
|
||||
/// Releases the buffers that this decoding thread was the last user of.
|
||||
static void release_delayed_buffers(PerThreadContext *p)
|
||||
{
|
||||
FrameThreadContext *fctx = p->parent;
|
||||
|
||||
while (p->num_released_buffers > 0) {
|
||||
AVFrame *f;
|
||||
|
||||
pthread_mutex_lock(&fctx->buffer_mutex);
|
||||
|
||||
// fix extended data in case the caller screwed it up
|
||||
av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
p->avctx->codec_type == AVMEDIA_TYPE_AUDIO);
|
||||
f = &p->released_buffers[--p->num_released_buffers];
|
||||
f->extended_data = f->data;
|
||||
av_frame_unref(f);
|
||||
|
||||
pthread_mutex_unlock(&fctx->buffer_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
static int submit_packet(PerThreadContext *p, AVPacket *avpkt)
|
||||
{
|
||||
FrameThreadContext *fctx = p->parent;
|
||||
PerThreadContext *prev_thread = fctx->prev_thread;
|
||||
const AVCodec *codec = p->avctx->codec;
|
||||
|
||||
if (!avpkt->size && !(codec->capabilities & AV_CODEC_CAP_DELAY))
|
||||
return 0;
|
||||
|
||||
pthread_mutex_lock(&p->mutex);
|
||||
|
||||
release_delayed_buffers(p);
|
||||
|
||||
if (prev_thread) {
|
||||
int err;
|
||||
if (prev_thread->state == STATE_SETTING_UP) {
|
||||
pthread_mutex_lock(&prev_thread->progress_mutex);
|
||||
while (prev_thread->state == STATE_SETTING_UP)
|
||||
pthread_cond_wait(&prev_thread->progress_cond, &prev_thread->progress_mutex);
|
||||
pthread_mutex_unlock(&prev_thread->progress_mutex);
|
||||
}
|
||||
|
||||
err = update_context_from_thread(p->avctx, prev_thread->avctx, 0);
|
||||
if (err) {
|
||||
pthread_mutex_unlock(&p->mutex);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
av_packet_unref(&p->avpkt);
|
||||
av_packet_ref(&p->avpkt, avpkt);
|
||||
|
||||
p->state = STATE_SETTING_UP;
|
||||
pthread_cond_signal(&p->input_cond);
|
||||
pthread_mutex_unlock(&p->mutex);
|
||||
|
||||
/*
|
||||
* If the client doesn't have a thread-safe get_buffer(),
|
||||
* then decoding threads call back to the main thread,
|
||||
* and it calls back to the client here.
|
||||
*/
|
||||
|
||||
if (!p->avctx->thread_safe_callbacks && (
|
||||
p->avctx->get_format != avcodec_default_get_format ||
|
||||
p->avctx->get_buffer2 != avcodec_default_get_buffer2)) {
|
||||
while (p->state != STATE_SETUP_FINISHED && p->state != STATE_INPUT_READY) {
|
||||
int call_done = 1;
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
while (p->state == STATE_SETTING_UP)
|
||||
pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
|
||||
|
||||
State p_state = (State)p->state;
|
||||
switch (p_state) {
|
||||
case STATE_GET_BUFFER:
|
||||
p->result = ff_get_buffer(p->avctx, p->requested_frame, p->requested_flags);
|
||||
break;
|
||||
case STATE_GET_FORMAT:
|
||||
p->result_format = ff_get_format(p->avctx, p->available_formats);
|
||||
break;
|
||||
default:
|
||||
call_done = 0;
|
||||
break;
|
||||
}
|
||||
if (call_done) {
|
||||
p->state = STATE_SETTING_UP;
|
||||
pthread_cond_signal(&p->progress_cond);
|
||||
}
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
fctx->prev_thread = p;
|
||||
fctx->next_decoding++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_thread_decode_frame(AVCodecContext *avctx,
|
||||
AVFrame *picture, int *got_picture_ptr,
|
||||
AVPacket *avpkt)
|
||||
{
|
||||
FrameThreadContext *fctx = avctx->internal->thread_ctx;
|
||||
int finished = fctx->next_finished;
|
||||
PerThreadContext *p;
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Submit a packet to the next decoding thread.
|
||||
*/
|
||||
|
||||
p = &fctx->threads[fctx->next_decoding];
|
||||
err = update_context_from_user(p->avctx, avctx);
|
||||
if (err) return err;
|
||||
err = submit_packet(p, avpkt);
|
||||
if (err) return err;
|
||||
|
||||
/*
|
||||
* If we're still receiving the initial packets, don't return a frame.
|
||||
*/
|
||||
|
||||
if (fctx->next_decoding > (avctx->thread_count-1-(avctx->codec_id == AV_CODEC_ID_FFV1)))
|
||||
fctx->delaying = 0;
|
||||
|
||||
if (fctx->delaying) {
|
||||
*got_picture_ptr=0;
|
||||
if (avpkt->size)
|
||||
return avpkt->size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the next available frame from the oldest thread.
|
||||
* If we're at the end of the stream, then we have to skip threads that
|
||||
* didn't output a frame, because we don't want to accidentally signal
|
||||
* EOF (avpkt->size == 0 && *got_picture_ptr == 0).
|
||||
*/
|
||||
|
||||
do {
|
||||
p = &fctx->threads[finished++];
|
||||
|
||||
if (p->state != STATE_INPUT_READY) {
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
while (p->state != STATE_INPUT_READY)
|
||||
pthread_cond_wait(&p->output_cond, &p->progress_mutex);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
|
||||
av_frame_move_ref(picture, p->frame);
|
||||
*got_picture_ptr = p->got_frame;
|
||||
picture->pkt_dts = p->avpkt.dts;
|
||||
|
||||
if (p->result < 0)
|
||||
err = p->result;
|
||||
|
||||
/*
|
||||
* A later call with avkpt->size == 0 may loop over all threads,
|
||||
* including this one, searching for a frame to return before being
|
||||
* stopped by the "finished != fctx->next_finished" condition.
|
||||
* Make sure we don't mistakenly return the same frame again.
|
||||
*/
|
||||
p->got_frame = 0;
|
||||
|
||||
if (finished >= avctx->thread_count) finished = 0;
|
||||
} while (!avpkt->size && !*got_picture_ptr && finished != fctx->next_finished);
|
||||
|
||||
update_context_from_thread(avctx, p->avctx, 1);
|
||||
|
||||
if (fctx->next_decoding >= avctx->thread_count) fctx->next_decoding = 0;
|
||||
|
||||
fctx->next_finished = finished;
|
||||
|
||||
/*
|
||||
* When no frame was found while flushing, but an error occurred in
|
||||
* any thread, return it instead of 0.
|
||||
* Otherwise the error can get lost.
|
||||
*/
|
||||
if (!avpkt->size && !*got_picture_ptr)
|
||||
return err;
|
||||
|
||||
/* return the size of the consumed packet if no error occurred */
|
||||
return (p->result >= 0) ? avpkt->size : p->result;
|
||||
}
|
||||
|
||||
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
|
||||
{
|
||||
PerThreadContext *p;
|
||||
atomic_int *progress = f->progress ? (atomic_int*)f->progress->data : NULL;
|
||||
|
||||
if (!progress || progress[field] >= n) return;
|
||||
|
||||
p = f->owner->internal->thread_ctx;
|
||||
|
||||
if (f->owner->debug&FF_DEBUG_THREADS)
|
||||
av_log(f->owner, AV_LOG_DEBUG, "%p finished %d field %d\n", progress, n, field);
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
progress[field] = n;
|
||||
pthread_cond_broadcast(&p->progress_cond);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
|
||||
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
|
||||
{
|
||||
PerThreadContext *p;
|
||||
atomic_int *progress = f->progress ? (atomic_int*)f->progress->data : NULL;
|
||||
|
||||
if (!progress || progress[field] >= n) return;
|
||||
|
||||
p = f->owner->internal->thread_ctx;
|
||||
|
||||
if (f->owner->debug&FF_DEBUG_THREADS)
|
||||
av_log(f->owner, AV_LOG_DEBUG, "thread awaiting %d field %d from %p\n", n, field, progress);
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
while (progress[field] < n)
|
||||
pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
|
||||
void ff_thread_finish_setup(AVCodecContext *avctx) {
|
||||
PerThreadContext *p = avctx->internal->thread_ctx;
|
||||
|
||||
if (!(avctx->active_thread_type&FF_THREAD_FRAME)) return;
|
||||
|
||||
if(p->state == STATE_SETUP_FINISHED){
|
||||
av_log(avctx, AV_LOG_WARNING, "Multiple ff_thread_finish_setup() calls\n");
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
p->state = STATE_SETUP_FINISHED;
|
||||
pthread_cond_broadcast(&p->progress_cond);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
|
||||
/// Waits for all threads to finish.
|
||||
static void park_frame_worker_threads(FrameThreadContext *fctx, int thread_count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < thread_count; i++) {
|
||||
PerThreadContext *p = &fctx->threads[i];
|
||||
|
||||
if (p->state != STATE_INPUT_READY) {
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
while (p->state != STATE_INPUT_READY)
|
||||
pthread_cond_wait(&p->output_cond, &p->progress_mutex);
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
}
|
||||
p->got_frame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
|
||||
{
|
||||
FrameThreadContext *fctx = avctx->internal->thread_ctx;
|
||||
const AVCodec *codec = avctx->codec;
|
||||
int i;
|
||||
|
||||
park_frame_worker_threads(fctx, thread_count);
|
||||
|
||||
if (fctx->prev_thread && fctx->prev_thread != fctx->threads)
|
||||
if (update_context_from_thread(fctx->threads->avctx, fctx->prev_thread->avctx, 0) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Final thread update failed\n");
|
||||
fctx->prev_thread->avctx->internal->is_copy = fctx->threads->avctx->internal->is_copy;
|
||||
fctx->threads->avctx->internal->is_copy = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < thread_count; i++) {
|
||||
PerThreadContext *p = &fctx->threads[i];
|
||||
|
||||
pthread_mutex_lock(&p->mutex);
|
||||
p->die = 1;
|
||||
pthread_cond_signal(&p->input_cond);
|
||||
pthread_mutex_unlock(&p->mutex);
|
||||
|
||||
if (p->thread_init)
|
||||
pthread_join(p->thread, NULL);
|
||||
p->thread_init=0;
|
||||
|
||||
if (codec->close && p->avctx)
|
||||
codec->close(p->avctx);
|
||||
|
||||
release_delayed_buffers(p);
|
||||
av_frame_free(&p->frame);
|
||||
}
|
||||
|
||||
for (i = 0; i < thread_count; i++) {
|
||||
PerThreadContext *p = &fctx->threads[i];
|
||||
|
||||
pthread_mutex_destroy(&p->mutex);
|
||||
pthread_mutex_destroy(&p->progress_mutex);
|
||||
pthread_cond_destroy(&p->input_cond);
|
||||
pthread_cond_destroy(&p->progress_cond);
|
||||
pthread_cond_destroy(&p->output_cond);
|
||||
av_packet_unref(&p->avpkt);
|
||||
av_freep(&p->released_buffers);
|
||||
|
||||
if (i && p->avctx) {
|
||||
av_freep(&p->avctx->priv_data);
|
||||
av_freep(&p->avctx->slice_offset);
|
||||
}
|
||||
|
||||
if (p->avctx)
|
||||
av_freep(&p->avctx->internal);
|
||||
av_freep(&p->avctx);
|
||||
}
|
||||
|
||||
av_freep(&fctx->threads);
|
||||
pthread_mutex_destroy(&fctx->buffer_mutex);
|
||||
av_freep(&avctx->internal->thread_ctx);
|
||||
|
||||
if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
|
||||
av_opt_free(avctx->priv_data);
|
||||
avctx->codec = NULL;
|
||||
}
|
||||
|
||||
int ff_frame_thread_init(AVCodecContext *avctx)
|
||||
{
|
||||
int thread_count = avctx->thread_count;
|
||||
const AVCodec *codec = avctx->codec;
|
||||
AVCodecContext *src = avctx;
|
||||
FrameThreadContext *fctx;
|
||||
int i, err = 0;
|
||||
|
||||
#if HAVE_W32THREADS
|
||||
w32thread_init();
|
||||
#endif
|
||||
|
||||
if (!thread_count) {
|
||||
int nb_cpus = av_cpu_count();
|
||||
if ((avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) || avctx->debug_mv)
|
||||
nb_cpus = 1;
|
||||
// use number of cores + 1 as thread count if there is more than one
|
||||
if (nb_cpus > 1)
|
||||
thread_count = avctx->thread_count = FFMIN(nb_cpus + 1, MAX_AUTO_THREADS);
|
||||
else
|
||||
thread_count = avctx->thread_count = 1;
|
||||
}
|
||||
|
||||
if (thread_count <= 1) {
|
||||
avctx->active_thread_type = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
avctx->internal->thread_ctx = fctx = av_mallocz(sizeof(FrameThreadContext));
|
||||
if (!fctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
fctx->threads = av_mallocz_array(thread_count, sizeof(PerThreadContext));
|
||||
if (!fctx->threads) {
|
||||
av_freep(&avctx->internal->thread_ctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
pthread_mutex_init(&fctx->buffer_mutex, NULL);
|
||||
fctx->delaying = 1;
|
||||
|
||||
for (i = 0; i < thread_count; i++) {
|
||||
AVCodecContext *copy = av_malloc(sizeof(AVCodecContext));
|
||||
PerThreadContext *p = &fctx->threads[i];
|
||||
|
||||
pthread_mutex_init(&p->mutex, NULL);
|
||||
pthread_mutex_init(&p->progress_mutex, NULL);
|
||||
pthread_cond_init(&p->input_cond, NULL);
|
||||
pthread_cond_init(&p->progress_cond, NULL);
|
||||
pthread_cond_init(&p->output_cond, NULL);
|
||||
|
||||
p->frame = av_frame_alloc();
|
||||
if (!p->frame) {
|
||||
av_freep(©);
|
||||
err = AVERROR(ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
|
||||
p->parent = fctx;
|
||||
p->avctx = copy;
|
||||
|
||||
if (!copy) {
|
||||
err = AVERROR(ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
|
||||
*copy = *src;
|
||||
|
||||
copy->internal = av_malloc(sizeof(AVCodecInternal));
|
||||
if (!copy->internal) {
|
||||
copy->priv_data = NULL;
|
||||
err = AVERROR(ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
*copy->internal = *src->internal;
|
||||
copy->internal->thread_ctx = p;
|
||||
copy->internal->pkt = &p->avpkt;
|
||||
|
||||
if (!i) {
|
||||
src = copy;
|
||||
|
||||
if (codec->init)
|
||||
err = codec->init(copy);
|
||||
|
||||
update_context_from_thread(avctx, copy, 1);
|
||||
} else {
|
||||
copy->priv_data = av_malloc(codec->priv_data_size);
|
||||
if (!copy->priv_data) {
|
||||
err = AVERROR(ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
memcpy(copy->priv_data, src->priv_data, codec->priv_data_size);
|
||||
copy->internal->is_copy = 1;
|
||||
|
||||
if (codec->init_thread_copy)
|
||||
err = codec->init_thread_copy(copy);
|
||||
}
|
||||
|
||||
if (err) goto error;
|
||||
|
||||
err = AVERROR(pthread_create(&p->thread, NULL, frame_worker_thread, p));
|
||||
p->thread_init= !err;
|
||||
if(!p->thread_init)
|
||||
goto error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
ff_frame_thread_free(avctx, i+1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void ff_thread_flush(AVCodecContext *avctx)
|
||||
{
|
||||
int i;
|
||||
FrameThreadContext *fctx = avctx->internal->thread_ctx;
|
||||
|
||||
if (!fctx) return;
|
||||
|
||||
park_frame_worker_threads(fctx, avctx->thread_count);
|
||||
if (fctx->prev_thread) {
|
||||
if (fctx->prev_thread != &fctx->threads[0])
|
||||
update_context_from_thread(fctx->threads[0].avctx, fctx->prev_thread->avctx, 0);
|
||||
}
|
||||
|
||||
fctx->next_decoding = fctx->next_finished = 0;
|
||||
fctx->delaying = 1;
|
||||
fctx->prev_thread = NULL;
|
||||
for (i = 0; i < avctx->thread_count; i++) {
|
||||
PerThreadContext *p = &fctx->threads[i];
|
||||
// Make sure decode flush calls with size=0 won't return old frames
|
||||
p->got_frame = 0;
|
||||
av_frame_unref(p->frame);
|
||||
|
||||
release_delayed_buffers(p);
|
||||
|
||||
if (avctx->codec->flush)
|
||||
avctx->codec->flush(p->avctx);
|
||||
}
|
||||
}
|
||||
|
||||
int ff_thread_can_start_frame(AVCodecContext *avctx)
|
||||
{
|
||||
PerThreadContext *p = avctx->internal->thread_ctx;
|
||||
if ((avctx->active_thread_type&FF_THREAD_FRAME) && p->state != STATE_SETTING_UP &&
|
||||
(avctx->codec->update_thread_context || !THREAD_SAFE_CALLBACKS(avctx))) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int flags)
|
||||
{
|
||||
PerThreadContext *p = avctx->internal->thread_ctx;
|
||||
int err;
|
||||
|
||||
f->owner = avctx;
|
||||
|
||||
ff_init_buffer_info(avctx, f->f);
|
||||
|
||||
if (!(avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
return ff_get_buffer(avctx, f->f, flags);
|
||||
|
||||
if (p->state != STATE_SETTING_UP &&
|
||||
(avctx->codec->update_thread_context || !THREAD_SAFE_CALLBACKS(avctx))) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() cannot be called after ff_thread_finish_setup()\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (avctx->internal->allocate_progress) {
|
||||
int *progress;
|
||||
f->progress = av_buffer_alloc(2 * sizeof(int));
|
||||
if (!f->progress) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
progress = (int*)f->progress->data;
|
||||
|
||||
progress[0] = progress[1] = -1;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&p->parent->buffer_mutex);
|
||||
if (avctx->thread_safe_callbacks ||
|
||||
avctx->get_buffer2 == avcodec_default_get_buffer2) {
|
||||
err = ff_get_buffer(avctx, f->f, flags);
|
||||
} else {
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
p->requested_frame = f->f;
|
||||
p->requested_flags = flags;
|
||||
p->state = STATE_GET_BUFFER;
|
||||
pthread_cond_broadcast(&p->progress_cond);
|
||||
|
||||
while (p->state != STATE_SETTING_UP)
|
||||
pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
|
||||
|
||||
err = p->result;
|
||||
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
|
||||
}
|
||||
if (!THREAD_SAFE_CALLBACKS(avctx) && !avctx->codec->update_thread_context)
|
||||
ff_thread_finish_setup(avctx);
|
||||
if (err)
|
||||
av_buffer_unref(&f->progress);
|
||||
|
||||
pthread_mutex_unlock(&p->parent->buffer_mutex);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
|
||||
{
|
||||
enum AVPixelFormat res;
|
||||
PerThreadContext *p = avctx->internal->thread_ctx;
|
||||
if (!(avctx->active_thread_type & FF_THREAD_FRAME) || avctx->thread_safe_callbacks ||
|
||||
avctx->get_format == avcodec_default_get_format)
|
||||
return ff_get_format(avctx, fmt);
|
||||
if (p->state != STATE_SETTING_UP) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_format() cannot be called after ff_thread_finish_setup()\n");
|
||||
return -1;
|
||||
}
|
||||
pthread_mutex_lock(&p->progress_mutex);
|
||||
p->available_formats = fmt;
|
||||
p->state = STATE_GET_FORMAT;
|
||||
pthread_cond_broadcast(&p->progress_cond);
|
||||
|
||||
while (p->state != STATE_SETTING_UP)
|
||||
pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
|
||||
|
||||
res = p->result_format;
|
||||
|
||||
pthread_mutex_unlock(&p->progress_mutex);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
|
||||
{
|
||||
int ret = thread_get_buffer_internal(avctx, f, flags);
|
||||
if (ret < 0)
|
||||
av_log(avctx, AV_LOG_ERROR, "thread_get_buffer() failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f)
|
||||
{
|
||||
PerThreadContext *p = avctx->internal->thread_ctx;
|
||||
FrameThreadContext *fctx;
|
||||
AVFrame *dst, *tmp;
|
||||
int can_direct_free = !(avctx->active_thread_type & FF_THREAD_FRAME) ||
|
||||
avctx->thread_safe_callbacks ||
|
||||
avctx->get_buffer2 == avcodec_default_get_buffer2;
|
||||
|
||||
if (!f->f || !f->f->buf[0])
|
||||
return;
|
||||
|
||||
if (avctx->debug & FF_DEBUG_BUFFERS)
|
||||
av_log(avctx, AV_LOG_DEBUG, "thread_release_buffer called on pic %p\n", f);
|
||||
|
||||
av_buffer_unref(&f->progress);
|
||||
f->owner = NULL;
|
||||
|
||||
if (can_direct_free) {
|
||||
av_frame_unref(f->f);
|
||||
return;
|
||||
}
|
||||
|
||||
fctx = p->parent;
|
||||
pthread_mutex_lock(&fctx->buffer_mutex);
|
||||
|
||||
if (p->num_released_buffers + 1 >= INT_MAX / sizeof(*p->released_buffers))
|
||||
goto fail;
|
||||
tmp = av_fast_realloc(p->released_buffers, &p->released_buffers_allocated,
|
||||
(p->num_released_buffers + 1) *
|
||||
sizeof(*p->released_buffers));
|
||||
if (!tmp)
|
||||
goto fail;
|
||||
p->released_buffers = tmp;
|
||||
|
||||
dst = &p->released_buffers[p->num_released_buffers];
|
||||
av_frame_move_ref(dst, f->f);
|
||||
|
||||
p->num_released_buffers++;
|
||||
|
||||
fail:
|
||||
pthread_mutex_unlock(&fctx->buffer_mutex);
|
||||
}
|
||||
34
media/ffvpx/libavcodec/pthread_internal.h
Normal file
34
media/ffvpx/libavcodec/pthread_internal.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_PTHREAD_INTERNAL_H
|
||||
#define AVCODEC_PTHREAD_INTERNAL_H
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
/* H.264 slice threading seems to be buggy with more than 16 threads,
|
||||
* limit the number of threads to 16 for automatic detection */
|
||||
#define MAX_AUTO_THREADS 16
|
||||
|
||||
int ff_slice_thread_init(AVCodecContext *avctx);
|
||||
void ff_slice_thread_free(AVCodecContext *avctx);
|
||||
|
||||
int ff_frame_thread_init(AVCodecContext *avctx);
|
||||
void ff_frame_thread_free(AVCodecContext *avctx, int thread_count);
|
||||
|
||||
#endif // AVCODEC_PTHREAD_INTERNAL_H
|
||||
314
media/ffvpx/libavcodec/pthread_slice.c
Normal file
314
media/ffvpx/libavcodec/pthread_slice.c
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
/*
|
||||
* 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
|
||||
* Slice multithreading support functions
|
||||
* @see doc/multithreading.txt
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "pthread_internal.h"
|
||||
#include "thread.h"
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "libavutil/thread.h"
|
||||
|
||||
typedef int (action_func)(AVCodecContext *c, void *arg);
|
||||
typedef int (action_func2)(AVCodecContext *c, void *arg, int jobnr, int threadnr);
|
||||
|
||||
typedef struct SliceThreadContext {
|
||||
pthread_t *workers;
|
||||
action_func *func;
|
||||
action_func2 *func2;
|
||||
void *args;
|
||||
int *rets;
|
||||
int job_count;
|
||||
int job_size;
|
||||
|
||||
pthread_cond_t last_job_cond;
|
||||
pthread_cond_t current_job_cond;
|
||||
pthread_mutex_t current_job_lock;
|
||||
unsigned current_execute;
|
||||
int current_job;
|
||||
int done;
|
||||
|
||||
int *entries;
|
||||
int entries_count;
|
||||
int thread_count;
|
||||
pthread_cond_t *progress_cond;
|
||||
pthread_mutex_t *progress_mutex;
|
||||
} SliceThreadContext;
|
||||
|
||||
static void* attribute_align_arg worker(void *v)
|
||||
{
|
||||
AVCodecContext *avctx = v;
|
||||
SliceThreadContext *c = avctx->internal->thread_ctx;
|
||||
unsigned last_execute = 0;
|
||||
int our_job = c->job_count;
|
||||
int thread_count = avctx->thread_count;
|
||||
int self_id;
|
||||
|
||||
pthread_mutex_lock(&c->current_job_lock);
|
||||
self_id = c->current_job++;
|
||||
for (;;){
|
||||
int ret;
|
||||
while (our_job >= c->job_count) {
|
||||
if (c->current_job == thread_count + c->job_count)
|
||||
pthread_cond_signal(&c->last_job_cond);
|
||||
|
||||
while (last_execute == c->current_execute && !c->done)
|
||||
pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
|
||||
last_execute = c->current_execute;
|
||||
our_job = self_id;
|
||||
|
||||
if (c->done) {
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
|
||||
ret = c->func ? c->func(avctx, (char*)c->args + our_job*c->job_size):
|
||||
c->func2(avctx, c->args, our_job, self_id);
|
||||
if (c->rets)
|
||||
c->rets[our_job%c->job_count] = ret;
|
||||
|
||||
pthread_mutex_lock(&c->current_job_lock);
|
||||
our_job = c->current_job++;
|
||||
}
|
||||
}
|
||||
|
||||
void ff_slice_thread_free(AVCodecContext *avctx)
|
||||
{
|
||||
SliceThreadContext *c = avctx->internal->thread_ctx;
|
||||
int i;
|
||||
|
||||
pthread_mutex_lock(&c->current_job_lock);
|
||||
c->done = 1;
|
||||
pthread_cond_broadcast(&c->current_job_cond);
|
||||
for (i = 0; i < c->thread_count; i++)
|
||||
pthread_cond_broadcast(&c->progress_cond[i]);
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
|
||||
for (i=0; i<avctx->thread_count; i++)
|
||||
pthread_join(c->workers[i], NULL);
|
||||
|
||||
for (i = 0; i < c->thread_count; i++) {
|
||||
pthread_mutex_destroy(&c->progress_mutex[i]);
|
||||
pthread_cond_destroy(&c->progress_cond[i]);
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&c->current_job_lock);
|
||||
pthread_cond_destroy(&c->current_job_cond);
|
||||
pthread_cond_destroy(&c->last_job_cond);
|
||||
|
||||
av_freep(&c->entries);
|
||||
av_freep(&c->progress_mutex);
|
||||
av_freep(&c->progress_cond);
|
||||
|
||||
av_freep(&c->workers);
|
||||
av_freep(&avctx->internal->thread_ctx);
|
||||
}
|
||||
|
||||
static av_always_inline void thread_park_workers(SliceThreadContext *c, int thread_count)
|
||||
{
|
||||
while (c->current_job != thread_count + c->job_count)
|
||||
pthread_cond_wait(&c->last_job_cond, &c->current_job_lock);
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
}
|
||||
|
||||
static int thread_execute(AVCodecContext *avctx, action_func* func, void *arg, int *ret, int job_count, int job_size)
|
||||
{
|
||||
SliceThreadContext *c = avctx->internal->thread_ctx;
|
||||
|
||||
if (!(avctx->active_thread_type&FF_THREAD_SLICE) || avctx->thread_count <= 1)
|
||||
return avcodec_default_execute(avctx, func, arg, ret, job_count, job_size);
|
||||
|
||||
if (job_count <= 0)
|
||||
return 0;
|
||||
|
||||
pthread_mutex_lock(&c->current_job_lock);
|
||||
|
||||
c->current_job = avctx->thread_count;
|
||||
c->job_count = job_count;
|
||||
c->job_size = job_size;
|
||||
c->args = arg;
|
||||
c->func = func;
|
||||
if (ret) {
|
||||
c->rets = ret;
|
||||
} else {
|
||||
c->rets = NULL;
|
||||
}
|
||||
c->current_execute++;
|
||||
pthread_cond_broadcast(&c->current_job_cond);
|
||||
|
||||
thread_park_workers(c, avctx->thread_count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int thread_execute2(AVCodecContext *avctx, action_func2* func2, void *arg, int *ret, int job_count)
|
||||
{
|
||||
SliceThreadContext *c = avctx->internal->thread_ctx;
|
||||
c->func2 = func2;
|
||||
return thread_execute(avctx, NULL, arg, ret, job_count, 0);
|
||||
}
|
||||
|
||||
int ff_slice_thread_init(AVCodecContext *avctx)
|
||||
{
|
||||
int i;
|
||||
SliceThreadContext *c;
|
||||
int thread_count = avctx->thread_count;
|
||||
|
||||
#if HAVE_W32THREADS
|
||||
w32thread_init();
|
||||
#endif
|
||||
|
||||
// We cannot do this in the encoder init as the threads are created before
|
||||
if (av_codec_is_encoder(avctx->codec) &&
|
||||
avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
|
||||
avctx->height > 2800)
|
||||
thread_count = avctx->thread_count = 1;
|
||||
|
||||
if (!thread_count) {
|
||||
int nb_cpus = av_cpu_count();
|
||||
if (avctx->height)
|
||||
nb_cpus = FFMIN(nb_cpus, (avctx->height+15)/16);
|
||||
// use number of cores + 1 as thread count if there is more than one
|
||||
if (nb_cpus > 1)
|
||||
thread_count = avctx->thread_count = FFMIN(nb_cpus + 1, MAX_AUTO_THREADS);
|
||||
else
|
||||
thread_count = avctx->thread_count = 1;
|
||||
}
|
||||
|
||||
if (thread_count <= 1) {
|
||||
avctx->active_thread_type = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
c = av_mallocz(sizeof(SliceThreadContext));
|
||||
if (!c)
|
||||
return -1;
|
||||
|
||||
c->workers = av_mallocz_array(thread_count, sizeof(pthread_t));
|
||||
if (!c->workers) {
|
||||
av_free(c);
|
||||
return -1;
|
||||
}
|
||||
|
||||
avctx->internal->thread_ctx = c;
|
||||
c->current_job = 0;
|
||||
c->job_count = 0;
|
||||
c->job_size = 0;
|
||||
c->done = 0;
|
||||
pthread_cond_init(&c->current_job_cond, NULL);
|
||||
pthread_cond_init(&c->last_job_cond, NULL);
|
||||
pthread_mutex_init(&c->current_job_lock, NULL);
|
||||
pthread_mutex_lock(&c->current_job_lock);
|
||||
for (i=0; i<thread_count; i++) {
|
||||
if(pthread_create(&c->workers[i], NULL, worker, avctx)) {
|
||||
avctx->thread_count = i;
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
ff_thread_free(avctx);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
thread_park_workers(c, thread_count);
|
||||
|
||||
avctx->execute = thread_execute;
|
||||
avctx->execute2 = thread_execute2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n)
|
||||
{
|
||||
SliceThreadContext *p = avctx->internal->thread_ctx;
|
||||
int *entries = p->entries;
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex[thread]);
|
||||
entries[field] +=n;
|
||||
pthread_cond_signal(&p->progress_cond[thread]);
|
||||
pthread_mutex_unlock(&p->progress_mutex[thread]);
|
||||
}
|
||||
|
||||
void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift)
|
||||
{
|
||||
SliceThreadContext *p = avctx->internal->thread_ctx;
|
||||
int *entries = p->entries;
|
||||
|
||||
if (!entries || !field) return;
|
||||
|
||||
thread = thread ? thread - 1 : p->thread_count - 1;
|
||||
|
||||
pthread_mutex_lock(&p->progress_mutex[thread]);
|
||||
while ((entries[field - 1] - entries[field]) < shift){
|
||||
pthread_cond_wait(&p->progress_cond[thread], &p->progress_mutex[thread]);
|
||||
}
|
||||
pthread_mutex_unlock(&p->progress_mutex[thread]);
|
||||
}
|
||||
|
||||
int ff_alloc_entries(AVCodecContext *avctx, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (avctx->active_thread_type & FF_THREAD_SLICE) {
|
||||
SliceThreadContext *p = avctx->internal->thread_ctx;
|
||||
|
||||
if (p->entries) {
|
||||
av_assert0(p->thread_count == avctx->thread_count);
|
||||
av_freep(&p->entries);
|
||||
}
|
||||
|
||||
p->thread_count = avctx->thread_count;
|
||||
p->entries = av_mallocz_array(count, sizeof(int));
|
||||
|
||||
if (!p->progress_mutex) {
|
||||
p->progress_mutex = av_malloc_array(p->thread_count, sizeof(pthread_mutex_t));
|
||||
p->progress_cond = av_malloc_array(p->thread_count, sizeof(pthread_cond_t));
|
||||
}
|
||||
|
||||
if (!p->entries || !p->progress_mutex || !p->progress_cond) {
|
||||
av_freep(&p->entries);
|
||||
av_freep(&p->progress_mutex);
|
||||
av_freep(&p->progress_cond);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
p->entries_count = count;
|
||||
|
||||
for (i = 0; i < p->thread_count; i++) {
|
||||
pthread_mutex_init(&p->progress_mutex[i], NULL);
|
||||
pthread_cond_init(&p->progress_cond[i], NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_reset_entries(AVCodecContext *avctx)
|
||||
{
|
||||
SliceThreadContext *p = avctx->internal->thread_ctx;
|
||||
memset(p->entries, 0, p->entries_count * sizeof(int));
|
||||
}
|
||||
268
media/ffvpx/libavcodec/put_bits.h
Normal file
268
media/ffvpx/libavcodec/put_bits.h
Normal file
|
|
@ -0,0 +1,268 @@
|
|||
/*
|
||||
* copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* 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
|
||||
* bitstream writer API
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_PUT_BITS_H
|
||||
#define AVCODEC_PUT_BITS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/avassert.h"
|
||||
|
||||
typedef struct PutBitContext {
|
||||
uint32_t bit_buf;
|
||||
int bit_left;
|
||||
uint8_t *buf, *buf_ptr, *buf_end;
|
||||
int size_in_bits;
|
||||
} PutBitContext;
|
||||
|
||||
/**
|
||||
* Initialize the PutBitContext s.
|
||||
*
|
||||
* @param buffer the buffer where to put bits
|
||||
* @param buffer_size the size in bytes of buffer
|
||||
*/
|
||||
static inline void init_put_bits(PutBitContext *s, uint8_t *buffer,
|
||||
int buffer_size)
|
||||
{
|
||||
if (buffer_size < 0) {
|
||||
buffer_size = 0;
|
||||
buffer = NULL;
|
||||
}
|
||||
|
||||
s->size_in_bits = 8 * buffer_size;
|
||||
s->buf = buffer;
|
||||
s->buf_end = s->buf + buffer_size;
|
||||
s->buf_ptr = s->buf;
|
||||
s->bit_left = 32;
|
||||
s->bit_buf = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebase the bit writer onto a reallocated buffer.
|
||||
*
|
||||
* @param buffer the buffer where to put bits
|
||||
* @param buffer_size the size in bytes of buffer,
|
||||
* must be larger than the previous size
|
||||
*/
|
||||
static inline void rebase_put_bits(PutBitContext *s, uint8_t *buffer,
|
||||
int buffer_size)
|
||||
{
|
||||
av_assert0(8*buffer_size > s->size_in_bits);
|
||||
|
||||
s->buf_end = buffer + buffer_size;
|
||||
s->buf_ptr = buffer + (s->buf_ptr - s->buf);
|
||||
s->buf = buffer;
|
||||
s->size_in_bits = 8 * buffer_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the total number of bits written to the bitstream.
|
||||
*/
|
||||
static inline int put_bits_count(PutBitContext *s)
|
||||
{
|
||||
return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the number of bits available in the bitstream.
|
||||
*/
|
||||
static inline int put_bits_left(PutBitContext* s)
|
||||
{
|
||||
return (s->buf_end - s->buf_ptr) * 8 - 32 + s->bit_left;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad the end of the output stream with zeros.
|
||||
*/
|
||||
static inline void flush_put_bits(PutBitContext *s)
|
||||
{
|
||||
#ifndef BITSTREAM_WRITER_LE
|
||||
if (s->bit_left < 32)
|
||||
s->bit_buf <<= s->bit_left;
|
||||
#endif
|
||||
while (s->bit_left < 32) {
|
||||
av_assert0(s->buf_ptr < s->buf_end);
|
||||
#ifdef BITSTREAM_WRITER_LE
|
||||
*s->buf_ptr++ = s->bit_buf;
|
||||
s->bit_buf >>= 8;
|
||||
#else
|
||||
*s->buf_ptr++ = s->bit_buf >> 24;
|
||||
s->bit_buf <<= 8;
|
||||
#endif
|
||||
s->bit_left += 8;
|
||||
}
|
||||
s->bit_left = 32;
|
||||
s->bit_buf = 0;
|
||||
}
|
||||
|
||||
#ifdef BITSTREAM_WRITER_LE
|
||||
#define avpriv_align_put_bits align_put_bits_unsupported_here
|
||||
#define avpriv_put_string ff_put_string_unsupported_here
|
||||
#define avpriv_copy_bits avpriv_copy_bits_unsupported_here
|
||||
#else
|
||||
/**
|
||||
* Pad the bitstream with zeros up to the next byte boundary.
|
||||
*/
|
||||
void avpriv_align_put_bits(PutBitContext *s);
|
||||
|
||||
/**
|
||||
* Put the string string in the bitstream.
|
||||
*
|
||||
* @param terminate_string 0-terminates the written string if value is 1
|
||||
*/
|
||||
void avpriv_put_string(PutBitContext *pb, const char *string,
|
||||
int terminate_string);
|
||||
|
||||
/**
|
||||
* Copy the content of src to the bitstream.
|
||||
*
|
||||
* @param length the number of bits of src to copy
|
||||
*/
|
||||
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Write up to 31 bits into a bitstream.
|
||||
* Use put_bits32 to write 32 bits.
|
||||
*/
|
||||
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
|
||||
{
|
||||
unsigned int bit_buf;
|
||||
int bit_left;
|
||||
|
||||
av_assert2(n <= 31 && value < (1U << n));
|
||||
|
||||
bit_buf = s->bit_buf;
|
||||
bit_left = s->bit_left;
|
||||
|
||||
/* XXX: optimize */
|
||||
#ifdef BITSTREAM_WRITER_LE
|
||||
bit_buf |= value << (32 - bit_left);
|
||||
if (n >= bit_left) {
|
||||
if (3 < s->buf_end - s->buf_ptr) {
|
||||
AV_WL32(s->buf_ptr, bit_buf);
|
||||
s->buf_ptr += 4;
|
||||
} else {
|
||||
av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
|
||||
av_assert2(0);
|
||||
}
|
||||
bit_buf = value >> bit_left;
|
||||
bit_left += 32;
|
||||
}
|
||||
bit_left -= n;
|
||||
#else
|
||||
if (n < bit_left) {
|
||||
bit_buf = (bit_buf << n) | value;
|
||||
bit_left -= n;
|
||||
} else {
|
||||
bit_buf <<= bit_left;
|
||||
bit_buf |= value >> (n - bit_left);
|
||||
if (3 < s->buf_end - s->buf_ptr) {
|
||||
AV_WB32(s->buf_ptr, bit_buf);
|
||||
s->buf_ptr += 4;
|
||||
} else {
|
||||
av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
|
||||
av_assert2(0);
|
||||
}
|
||||
bit_left += 32 - n;
|
||||
bit_buf = value;
|
||||
}
|
||||
#endif
|
||||
|
||||
s->bit_buf = bit_buf;
|
||||
s->bit_left = bit_left;
|
||||
}
|
||||
|
||||
static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
|
||||
{
|
||||
av_assert2(n >= 0 && n <= 31);
|
||||
|
||||
put_bits(pb, n, av_mod_uintp2(value, n));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write exactly 32 bits into a bitstream.
|
||||
*/
|
||||
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
|
||||
{
|
||||
int lo = value & 0xffff;
|
||||
int hi = value >> 16;
|
||||
#ifdef BITSTREAM_WRITER_LE
|
||||
put_bits(s, 16, lo);
|
||||
put_bits(s, 16, hi);
|
||||
#else
|
||||
put_bits(s, 16, hi);
|
||||
put_bits(s, 16, lo);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the pointer to the byte where the bitstream writer will put
|
||||
* the next bit.
|
||||
*/
|
||||
static inline uint8_t *put_bits_ptr(PutBitContext *s)
|
||||
{
|
||||
return s->buf_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip the given number of bytes.
|
||||
* PutBitContext must be flushed & aligned to a byte boundary before calling this.
|
||||
*/
|
||||
static inline void skip_put_bytes(PutBitContext *s, int n)
|
||||
{
|
||||
av_assert2((put_bits_count(s) & 7) == 0);
|
||||
av_assert2(s->bit_left == 32);
|
||||
av_assert0(n <= s->buf_end - s->buf_ptr);
|
||||
s->buf_ptr += n;
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip the given number of bits.
|
||||
* Must only be used if the actual values in the bitstream do not matter.
|
||||
* If n is 0 the behavior is undefined.
|
||||
*/
|
||||
static inline void skip_put_bits(PutBitContext *s, int n)
|
||||
{
|
||||
s->bit_left -= n;
|
||||
s->buf_ptr -= 4 * (s->bit_left >> 5);
|
||||
s->bit_left &= 31;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the end of the buffer.
|
||||
*
|
||||
* @param size the new size in bytes of the buffer where to put bits
|
||||
*/
|
||||
static inline void set_put_bits_buffer_size(PutBitContext *s, int size)
|
||||
{
|
||||
av_assert0(size <= INT_MAX/8 - 32);
|
||||
s->buf_end = s->buf + size;
|
||||
s->size_in_bits = 8*size;
|
||||
}
|
||||
|
||||
#endif /* AVCODEC_PUT_BITS_H */
|
||||
83
media/ffvpx/libavcodec/qpeldsp.h
Normal file
83
media/ffvpx/libavcodec/qpeldsp.h
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* quarterpel DSP functions
|
||||
*
|
||||
* 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
|
||||
* quarterpel DSP functions
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_QPELDSP_H
|
||||
#define AVCODEC_QPELDSP_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
void ff_put_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
void ff_put_pixels8_l2_8(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
|
||||
int dst_stride, int src_stride1, int src_stride2,
|
||||
int h);
|
||||
|
||||
#define DEF_OLD_QPEL(name) \
|
||||
void ff_put_ ## name(uint8_t *dst /* align width (8 or 16) */, \
|
||||
const uint8_t *src /* align 1 */, \
|
||||
ptrdiff_t stride); \
|
||||
void ff_put_no_rnd_ ## name(uint8_t *dst /* align width (8 or 16) */, \
|
||||
const uint8_t *src /* align 1 */, \
|
||||
ptrdiff_t stride); \
|
||||
void ff_avg_ ## name(uint8_t *dst /* align width (8 or 16) */, \
|
||||
const uint8_t *src /* align 1 */, \
|
||||
ptrdiff_t stride);
|
||||
|
||||
DEF_OLD_QPEL(qpel16_mc11_old_c)
|
||||
DEF_OLD_QPEL(qpel16_mc31_old_c)
|
||||
DEF_OLD_QPEL(qpel16_mc12_old_c)
|
||||
DEF_OLD_QPEL(qpel16_mc32_old_c)
|
||||
DEF_OLD_QPEL(qpel16_mc13_old_c)
|
||||
DEF_OLD_QPEL(qpel16_mc33_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc11_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc31_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc12_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc32_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc13_old_c)
|
||||
DEF_OLD_QPEL(qpel8_mc33_old_c)
|
||||
|
||||
typedef void (*qpel_mc_func)(uint8_t *dst /* align width (8 or 16) */,
|
||||
const uint8_t *src /* align 1 */,
|
||||
ptrdiff_t stride);
|
||||
|
||||
/**
|
||||
* quarterpel DSP context
|
||||
*/
|
||||
typedef struct QpelDSPContext {
|
||||
qpel_mc_func put_qpel_pixels_tab[2][16];
|
||||
qpel_mc_func avg_qpel_pixels_tab[2][16];
|
||||
qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16];
|
||||
} QpelDSPContext;
|
||||
|
||||
void ff_qpeldsp_init(QpelDSPContext *c);
|
||||
|
||||
void ff_qpeldsp_init_x86(QpelDSPContext *c);
|
||||
void ff_qpeldsp_init_mips(QpelDSPContext *c);
|
||||
|
||||
#endif /* AVCODEC_QPELDSP_H */
|
||||
42
media/ffvpx/libavcodec/qsv_api.c
Normal file
42
media/ffvpx/libavcodec/qsv_api.c
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Intel MediaSDK QSV public API functions
|
||||
*
|
||||
* 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 "config.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
#if CONFIG_QSV
|
||||
#include "qsv.h"
|
||||
|
||||
AVQSVContext *av_qsv_alloc_context(void)
|
||||
{
|
||||
return av_mallocz(sizeof(AVQSVContext));
|
||||
}
|
||||
#else
|
||||
|
||||
struct AVQSVContext *av_qsv_alloc_context(void);
|
||||
|
||||
struct AVQSVContext *av_qsv_alloc_context(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
103
media/ffvpx/libavcodec/ratecontrol.h
Normal file
103
media/ffvpx/libavcodec/ratecontrol.h
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Ratecontrol
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
* Copyright (c) 2002-2004 Michael Niedermayer
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_RATECONTROL_H
|
||||
#define AVCODEC_RATECONTROL_H
|
||||
|
||||
/**
|
||||
* @file
|
||||
* ratecontrol header.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "libavutil/eval.h"
|
||||
|
||||
typedef struct Predictor{
|
||||
double coeff;
|
||||
double count;
|
||||
double decay;
|
||||
} Predictor;
|
||||
|
||||
typedef struct RateControlEntry{
|
||||
int pict_type;
|
||||
float qscale;
|
||||
int mv_bits;
|
||||
int i_tex_bits;
|
||||
int p_tex_bits;
|
||||
int misc_bits;
|
||||
int header_bits;
|
||||
uint64_t expected_bits;
|
||||
int new_pict_type;
|
||||
float new_qscale;
|
||||
int64_t mc_mb_var_sum;
|
||||
int64_t mb_var_sum;
|
||||
int i_count;
|
||||
int skip_count;
|
||||
int f_code;
|
||||
int b_code;
|
||||
}RateControlEntry;
|
||||
|
||||
/**
|
||||
* rate control context.
|
||||
*/
|
||||
typedef struct RateControlContext{
|
||||
int num_entries; ///< number of RateControlEntries
|
||||
RateControlEntry *entry;
|
||||
double buffer_index; ///< amount of bits in the video/audio buffer
|
||||
Predictor pred[5];
|
||||
double short_term_qsum; ///< sum of recent qscales
|
||||
double short_term_qcount; ///< count of recent qscales
|
||||
double pass1_rc_eq_output_sum;///< sum of the output of the rc equation, this is used for normalization
|
||||
double pass1_wanted_bits; ///< bits which should have been output by the pass1 code (including complexity init)
|
||||
double last_qscale;
|
||||
double last_qscale_for[5]; ///< last qscale for a specific pict type, used for max_diff & ipb factor stuff
|
||||
int64_t last_mc_mb_var_sum;
|
||||
int64_t last_mb_var_sum;
|
||||
uint64_t i_cplx_sum[5];
|
||||
uint64_t p_cplx_sum[5];
|
||||
uint64_t mv_bits_sum[5];
|
||||
uint64_t qscale_sum[5];
|
||||
int frame_count[5];
|
||||
int last_non_b_pict_type;
|
||||
|
||||
void *non_lavc_opaque; ///< context for non lavc rc code (for example xvid)
|
||||
float dry_run_qscale; ///< for xvid rc
|
||||
int last_picture_number; ///< for xvid rc
|
||||
AVExpr * rc_eq_eval;
|
||||
}RateControlContext;
|
||||
|
||||
struct MpegEncContext;
|
||||
|
||||
/* rate control */
|
||||
int ff_rate_control_init(struct MpegEncContext *s);
|
||||
float ff_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
|
||||
void ff_write_pass1_stats(struct MpegEncContext *s);
|
||||
void ff_rate_control_uninit(struct MpegEncContext *s);
|
||||
int ff_vbv_update(struct MpegEncContext *s, int frame_size);
|
||||
void ff_get_2pass_fcode(struct MpegEncContext *s);
|
||||
|
||||
int ff_xvid_rate_control_init(struct MpegEncContext *s);
|
||||
void ff_xvid_rate_control_uninit(struct MpegEncContext *s);
|
||||
float ff_xvid_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
|
||||
|
||||
#endif /* AVCODEC_RATECONTROL_H */
|
||||
308
media/ffvpx/libavcodec/raw.c
Normal file
308
media/ffvpx/libavcodec/raw.c
Normal file
|
|
@ -0,0 +1,308 @@
|
|||
/*
|
||||
* Raw Video Codec
|
||||
* Copyright (c) 2001 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
* Raw Video Codec
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "raw.h"
|
||||
#include "libavutil/common.h"
|
||||
|
||||
const PixelFormatTag ff_raw_pix_fmt_tags[] = {
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('I', 'Y', 'U', 'V') },
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('Y', 'V', '1', '2') },
|
||||
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'U', 'V', '9') },
|
||||
{ AV_PIX_FMT_YUV410P, MKTAG('Y', 'V', 'U', '9') },
|
||||
{ AV_PIX_FMT_YUV411P, MKTAG('Y', '4', '1', 'B') },
|
||||
{ AV_PIX_FMT_YUV422P, MKTAG('Y', '4', '2', 'B') },
|
||||
{ AV_PIX_FMT_YUV422P, MKTAG('P', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_YUV422P, MKTAG('Y', 'V', '1', '6') },
|
||||
/* yuvjXXX formats are deprecated hacks specific to libav*,
|
||||
they are identical to yuvXXX */
|
||||
{ AV_PIX_FMT_YUVJ420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */
|
||||
{ AV_PIX_FMT_YUVJ420P, MKTAG('I', 'Y', 'U', 'V') },
|
||||
{ AV_PIX_FMT_YUVJ420P, MKTAG('Y', 'V', '1', '2') },
|
||||
{ AV_PIX_FMT_YUVJ422P, MKTAG('Y', '4', '2', 'B') },
|
||||
{ AV_PIX_FMT_YUVJ422P, MKTAG('P', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_GRAY8, MKTAG('Y', '8', '0', '0') },
|
||||
{ AV_PIX_FMT_GRAY8, MKTAG('Y', '8', ' ', ' ') },
|
||||
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('Y', 'U', 'Y', '2') }, /* Packed formats */
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('Y', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('V', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('V', 'Y', 'U', 'Y') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('Y', 'U', 'N', 'V') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('Y', 'U', 'Y', 'V') },
|
||||
{ AV_PIX_FMT_YVYU422, MKTAG('Y', 'V', 'Y', 'U') }, /* Philips */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('U', 'Y', 'V', 'Y') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('H', 'D', 'Y', 'C') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('U', 'Y', 'N', 'V') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('U', 'Y', 'N', 'Y') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('u', 'y', 'v', '1') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('2', 'V', 'u', '1') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('A', 'V', 'R', 'n') }, /* Avid AVI Codec 1:1 */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('A', 'V', '1', 'x') }, /* Avid 1:1x */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('A', 'V', 'u', 'p') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('a', 'u', 'v', '2') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('c', 'y', 'u', 'v') }, /* CYUV is also Creative YUV */
|
||||
{ AV_PIX_FMT_UYYVYY411, MKTAG('Y', '4', '1', '1') },
|
||||
{ AV_PIX_FMT_GRAY8, MKTAG('G', 'R', 'E', 'Y') },
|
||||
{ AV_PIX_FMT_NV12, MKTAG('N', 'V', '1', '2') },
|
||||
{ AV_PIX_FMT_NV21, MKTAG('N', 'V', '2', '1') },
|
||||
|
||||
/* nut */
|
||||
{ AV_PIX_FMT_RGB555LE, MKTAG('R', 'G', 'B', 15) },
|
||||
{ AV_PIX_FMT_BGR555LE, MKTAG('B', 'G', 'R', 15) },
|
||||
{ AV_PIX_FMT_RGB565LE, MKTAG('R', 'G', 'B', 16) },
|
||||
{ AV_PIX_FMT_BGR565LE, MKTAG('B', 'G', 'R', 16) },
|
||||
{ AV_PIX_FMT_RGB555BE, MKTAG(15 , 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_BGR555BE, MKTAG(15 , 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_RGB565BE, MKTAG(16 , 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_BGR565BE, MKTAG(16 , 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_RGB444LE, MKTAG('R', 'G', 'B', 12) },
|
||||
{ AV_PIX_FMT_BGR444LE, MKTAG('B', 'G', 'R', 12) },
|
||||
{ AV_PIX_FMT_RGB444BE, MKTAG(12 , 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_BGR444BE, MKTAG(12 , 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_RGBA64LE, MKTAG('R', 'B', 'A', 64 ) },
|
||||
{ AV_PIX_FMT_BGRA64LE, MKTAG('B', 'R', 'A', 64 ) },
|
||||
{ AV_PIX_FMT_RGBA64BE, MKTAG(64 , 'R', 'B', 'A') },
|
||||
{ AV_PIX_FMT_BGRA64BE, MKTAG(64 , 'B', 'R', 'A') },
|
||||
{ AV_PIX_FMT_RGBA, MKTAG('R', 'G', 'B', 'A') },
|
||||
{ AV_PIX_FMT_RGB0, MKTAG('R', 'G', 'B', 0 ) },
|
||||
{ AV_PIX_FMT_BGRA, MKTAG('B', 'G', 'R', 'A') },
|
||||
{ AV_PIX_FMT_BGR0, MKTAG('B', 'G', 'R', 0 ) },
|
||||
{ AV_PIX_FMT_ABGR, MKTAG('A', 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_0BGR, MKTAG( 0 , 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_ARGB, MKTAG('A', 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_0RGB, MKTAG( 0 , 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_RGB24, MKTAG('R', 'G', 'B', 24 ) },
|
||||
{ AV_PIX_FMT_BGR24, MKTAG('B', 'G', 'R', 24 ) },
|
||||
{ AV_PIX_FMT_YUV411P, MKTAG('4', '1', '1', 'P') },
|
||||
{ AV_PIX_FMT_YUV422P, MKTAG('4', '2', '2', 'P') },
|
||||
{ AV_PIX_FMT_YUVJ422P, MKTAG('4', '2', '2', 'P') },
|
||||
{ AV_PIX_FMT_YUV440P, MKTAG('4', '4', '0', 'P') },
|
||||
{ AV_PIX_FMT_YUVJ440P, MKTAG('4', '4', '0', 'P') },
|
||||
{ AV_PIX_FMT_YUV444P, MKTAG('4', '4', '4', 'P') },
|
||||
{ AV_PIX_FMT_YUVJ444P, MKTAG('4', '4', '4', 'P') },
|
||||
{ AV_PIX_FMT_MONOWHITE,MKTAG('B', '1', 'W', '0') },
|
||||
{ AV_PIX_FMT_MONOBLACK,MKTAG('B', '0', 'W', '1') },
|
||||
{ AV_PIX_FMT_BGR8, MKTAG('B', 'G', 'R', 8 ) },
|
||||
{ AV_PIX_FMT_RGB8, MKTAG('R', 'G', 'B', 8 ) },
|
||||
{ AV_PIX_FMT_BGR4, MKTAG('B', 'G', 'R', 4 ) },
|
||||
{ AV_PIX_FMT_RGB4, MKTAG('R', 'G', 'B', 4 ) },
|
||||
{ AV_PIX_FMT_RGB4_BYTE,MKTAG('B', '4', 'B', 'Y') },
|
||||
{ AV_PIX_FMT_BGR4_BYTE,MKTAG('R', '4', 'B', 'Y') },
|
||||
{ AV_PIX_FMT_RGB48LE, MKTAG('R', 'G', 'B', 48 ) },
|
||||
{ AV_PIX_FMT_RGB48BE, MKTAG( 48, 'R', 'G', 'B') },
|
||||
{ AV_PIX_FMT_BGR48LE, MKTAG('B', 'G', 'R', 48 ) },
|
||||
{ AV_PIX_FMT_BGR48BE, MKTAG( 48, 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_GRAY16LE, MKTAG('Y', '1', 0 , 16 ) },
|
||||
{ AV_PIX_FMT_GRAY16BE, MKTAG(16 , 0 , '1', 'Y') },
|
||||
{ AV_PIX_FMT_YUV420P9LE, MKTAG('Y', '3', 11 , 9 ) },
|
||||
{ AV_PIX_FMT_YUV420P9BE, MKTAG( 9 , 11 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV422P9LE, MKTAG('Y', '3', 10 , 9 ) },
|
||||
{ AV_PIX_FMT_YUV422P9BE, MKTAG( 9 , 10 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV444P9LE, MKTAG('Y', '3', 0 , 9 ) },
|
||||
{ AV_PIX_FMT_YUV444P9BE, MKTAG( 9 , 0 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV420P10LE, MKTAG('Y', '3', 11 , 10 ) },
|
||||
{ AV_PIX_FMT_YUV420P10BE, MKTAG(10 , 11 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV422P10LE, MKTAG('Y', '3', 10 , 10 ) },
|
||||
{ AV_PIX_FMT_YUV422P10BE, MKTAG(10 , 10 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV444P10LE, MKTAG('Y', '3', 0 , 10 ) },
|
||||
{ AV_PIX_FMT_YUV444P10BE, MKTAG(10 , 0 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV420P12LE, MKTAG('Y', '3', 11 , 12 ) },
|
||||
{ AV_PIX_FMT_YUV420P12BE, MKTAG(12 , 11 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV422P12LE, MKTAG('Y', '3', 10 , 12 ) },
|
||||
{ AV_PIX_FMT_YUV422P12BE, MKTAG(12 , 10 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV444P12LE, MKTAG('Y', '3', 0 , 12 ) },
|
||||
{ AV_PIX_FMT_YUV444P12BE, MKTAG(12 , 0 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV420P14LE, MKTAG('Y', '3', 11 , 14 ) },
|
||||
{ AV_PIX_FMT_YUV420P14BE, MKTAG(14 , 11 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV422P14LE, MKTAG('Y', '3', 10 , 14 ) },
|
||||
{ AV_PIX_FMT_YUV422P14BE, MKTAG(14 , 10 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV444P14LE, MKTAG('Y', '3', 0 , 14 ) },
|
||||
{ AV_PIX_FMT_YUV444P14BE, MKTAG(14 , 0 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV420P16LE, MKTAG('Y', '3', 11 , 16 ) },
|
||||
{ AV_PIX_FMT_YUV420P16BE, MKTAG(16 , 11 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV422P16LE, MKTAG('Y', '3', 10 , 16 ) },
|
||||
{ AV_PIX_FMT_YUV422P16BE, MKTAG(16 , 10 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUV444P16LE, MKTAG('Y', '3', 0 , 16 ) },
|
||||
{ AV_PIX_FMT_YUV444P16BE, MKTAG(16 , 0 , '3', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA420P, MKTAG('Y', '4', 11 , 8 ) },
|
||||
{ AV_PIX_FMT_YUVA422P, MKTAG('Y', '4', 10 , 8 ) },
|
||||
{ AV_PIX_FMT_YUVA444P, MKTAG('Y', '4', 0 , 8 ) },
|
||||
{ AV_PIX_FMT_YA8, MKTAG('Y', '2', 0 , 8 ) },
|
||||
{ AV_PIX_FMT_PAL8, MKTAG('P', 'A', 'L', 8 ) },
|
||||
|
||||
{ AV_PIX_FMT_YUVA420P9LE, MKTAG('Y', '4', 11 , 9 ) },
|
||||
{ AV_PIX_FMT_YUVA420P9BE, MKTAG( 9 , 11 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA422P9LE, MKTAG('Y', '4', 10 , 9 ) },
|
||||
{ AV_PIX_FMT_YUVA422P9BE, MKTAG( 9 , 10 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA444P9LE, MKTAG('Y', '4', 0 , 9 ) },
|
||||
{ AV_PIX_FMT_YUVA444P9BE, MKTAG( 9 , 0 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA420P10LE, MKTAG('Y', '4', 11 , 10 ) },
|
||||
{ AV_PIX_FMT_YUVA420P10BE, MKTAG(10 , 11 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA422P10LE, MKTAG('Y', '4', 10 , 10 ) },
|
||||
{ AV_PIX_FMT_YUVA422P10BE, MKTAG(10 , 10 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA444P10LE, MKTAG('Y', '4', 0 , 10 ) },
|
||||
{ AV_PIX_FMT_YUVA444P10BE, MKTAG(10 , 0 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA420P16LE, MKTAG('Y', '4', 11 , 16 ) },
|
||||
{ AV_PIX_FMT_YUVA420P16BE, MKTAG(16 , 11 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA422P16LE, MKTAG('Y', '4', 10 , 16 ) },
|
||||
{ AV_PIX_FMT_YUVA422P16BE, MKTAG(16 , 10 , '4', 'Y') },
|
||||
{ AV_PIX_FMT_YUVA444P16LE, MKTAG('Y', '4', 0 , 16 ) },
|
||||
{ AV_PIX_FMT_YUVA444P16BE, MKTAG(16 , 0 , '4', 'Y') },
|
||||
|
||||
{ AV_PIX_FMT_GBRP, MKTAG('G', '3', 00 , 8 ) },
|
||||
{ AV_PIX_FMT_GBRP9LE, MKTAG('G', '3', 00 , 9 ) },
|
||||
{ AV_PIX_FMT_GBRP9BE, MKTAG( 9 , 00 , '3', 'G') },
|
||||
{ AV_PIX_FMT_GBRP10LE, MKTAG('G', '3', 00 , 10 ) },
|
||||
{ AV_PIX_FMT_GBRP10BE, MKTAG(10 , 00 , '3', 'G') },
|
||||
{ AV_PIX_FMT_GBRP12LE, MKTAG('G', '3', 00 , 12 ) },
|
||||
{ AV_PIX_FMT_GBRP12BE, MKTAG(12 , 00 , '3', 'G') },
|
||||
{ AV_PIX_FMT_GBRP14LE, MKTAG('G', '3', 00 , 14 ) },
|
||||
{ AV_PIX_FMT_GBRP14BE, MKTAG(14 , 00 , '3', 'G') },
|
||||
{ AV_PIX_FMT_GBRP16LE, MKTAG('G', '3', 00 , 16 ) },
|
||||
{ AV_PIX_FMT_GBRP16BE, MKTAG(16 , 00 , '3', 'G') },
|
||||
|
||||
{ AV_PIX_FMT_XYZ12LE, MKTAG('X', 'Y', 'Z' , 36 ) },
|
||||
{ AV_PIX_FMT_XYZ12BE, MKTAG(36 , 'Z' , 'Y', 'X') },
|
||||
|
||||
{ AV_PIX_FMT_BAYER_BGGR8, MKTAG(0xBA, 'B', 'G', 8 ) },
|
||||
{ AV_PIX_FMT_BAYER_BGGR16LE, MKTAG(0xBA, 'B', 'G', 16 ) },
|
||||
{ AV_PIX_FMT_BAYER_BGGR16BE, MKTAG(16 , 'G', 'B', 0xBA) },
|
||||
{ AV_PIX_FMT_BAYER_RGGB8, MKTAG(0xBA, 'R', 'G', 8 ) },
|
||||
{ AV_PIX_FMT_BAYER_RGGB16LE, MKTAG(0xBA, 'R', 'G', 16 ) },
|
||||
{ AV_PIX_FMT_BAYER_RGGB16BE, MKTAG(16 , 'G', 'R', 0xBA) },
|
||||
{ AV_PIX_FMT_BAYER_GBRG8, MKTAG(0xBA, 'G', 'B', 8 ) },
|
||||
{ AV_PIX_FMT_BAYER_GBRG16LE, MKTAG(0xBA, 'G', 'B', 16 ) },
|
||||
{ AV_PIX_FMT_BAYER_GBRG16BE, MKTAG(16, 'B', 'G', 0xBA) },
|
||||
{ AV_PIX_FMT_BAYER_GRBG8, MKTAG(0xBA, 'G', 'R', 8 ) },
|
||||
{ AV_PIX_FMT_BAYER_GRBG16LE, MKTAG(0xBA, 'G', 'R', 16 ) },
|
||||
{ AV_PIX_FMT_BAYER_GRBG16BE, MKTAG(16, 'R', 'G', 0xBA) },
|
||||
|
||||
/* quicktime */
|
||||
{ AV_PIX_FMT_YUV420P, MKTAG('R', '4', '2', '0') }, /* Radius DV YUV PAL */
|
||||
{ AV_PIX_FMT_YUV411P, MKTAG('R', '4', '1', '1') }, /* Radius DV YUV NTSC */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('2', 'v', 'u', 'y') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('2', 'V', 'u', 'y') },
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('A', 'V', 'U', 'I') }, /* FIXME merge both fields */
|
||||
{ AV_PIX_FMT_UYVY422, MKTAG('b', 'x', 'y', 'v') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('y', 'u', 'v', '2') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('y', 'u', 'v', 's') },
|
||||
{ AV_PIX_FMT_YUYV422, MKTAG('D', 'V', 'O', 'O') }, /* Digital Voodoo SD 8 Bit */
|
||||
{ AV_PIX_FMT_RGB555LE,MKTAG('L', '5', '5', '5') },
|
||||
{ AV_PIX_FMT_RGB565LE,MKTAG('L', '5', '6', '5') },
|
||||
{ AV_PIX_FMT_RGB565BE,MKTAG('B', '5', '6', '5') },
|
||||
{ AV_PIX_FMT_BGR24, MKTAG('2', '4', 'B', 'G') },
|
||||
{ AV_PIX_FMT_BGR24, MKTAG('b', 'x', 'b', 'g') },
|
||||
{ AV_PIX_FMT_BGRA, MKTAG('B', 'G', 'R', 'A') },
|
||||
{ AV_PIX_FMT_RGBA, MKTAG('R', 'G', 'B', 'A') },
|
||||
{ AV_PIX_FMT_RGB24, MKTAG('b', 'x', 'r', 'g') },
|
||||
{ AV_PIX_FMT_ABGR, MKTAG('A', 'B', 'G', 'R') },
|
||||
{ AV_PIX_FMT_GRAY16BE,MKTAG('b', '1', '6', 'g') },
|
||||
{ AV_PIX_FMT_RGB48BE, MKTAG('b', '4', '8', 'r') },
|
||||
|
||||
/* vlc */
|
||||
{ AV_PIX_FMT_YUV410P, MKTAG('I', '4', '1', '0') },
|
||||
{ AV_PIX_FMT_YUV411P, MKTAG('I', '4', '1', '1') },
|
||||
{ AV_PIX_FMT_YUV422P, MKTAG('I', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_YUV440P, MKTAG('I', '4', '4', '0') },
|
||||
{ AV_PIX_FMT_YUV444P, MKTAG('I', '4', '4', '4') },
|
||||
{ AV_PIX_FMT_YUVJ420P, MKTAG('J', '4', '2', '0') },
|
||||
{ AV_PIX_FMT_YUVJ422P, MKTAG('J', '4', '2', '2') },
|
||||
{ AV_PIX_FMT_YUVJ440P, MKTAG('J', '4', '4', '0') },
|
||||
{ AV_PIX_FMT_YUVJ444P, MKTAG('J', '4', '4', '4') },
|
||||
{ AV_PIX_FMT_YUVA444P, MKTAG('Y', 'U', 'V', 'A') },
|
||||
{ AV_PIX_FMT_YUVA420P, MKTAG('I', '4', '0', 'A') },
|
||||
{ AV_PIX_FMT_YUVA422P, MKTAG('I', '4', '2', 'A') },
|
||||
{ AV_PIX_FMT_RGB8, MKTAG('R', 'G', 'B', '2') },
|
||||
{ AV_PIX_FMT_RGB555LE, MKTAG('R', 'V', '1', '5') },
|
||||
{ AV_PIX_FMT_RGB565LE, MKTAG('R', 'V', '1', '6') },
|
||||
{ AV_PIX_FMT_BGR24, MKTAG('R', 'V', '2', '4') },
|
||||
{ AV_PIX_FMT_BGR0, MKTAG('R', 'V', '3', '2') },
|
||||
{ AV_PIX_FMT_RGBA, MKTAG('A', 'V', '3', '2') },
|
||||
{ AV_PIX_FMT_YUV420P9LE, MKTAG('I', '0', '9', 'L') },
|
||||
{ AV_PIX_FMT_YUV420P9BE, MKTAG('I', '0', '9', 'B') },
|
||||
{ AV_PIX_FMT_YUV422P9LE, MKTAG('I', '2', '9', 'L') },
|
||||
{ AV_PIX_FMT_YUV422P9BE, MKTAG('I', '2', '9', 'B') },
|
||||
{ AV_PIX_FMT_YUV444P9LE, MKTAG('I', '4', '9', 'L') },
|
||||
{ AV_PIX_FMT_YUV444P9BE, MKTAG('I', '4', '9', 'B') },
|
||||
{ AV_PIX_FMT_YUV420P10LE, MKTAG('I', '0', 'A', 'L') },
|
||||
{ AV_PIX_FMT_YUV420P10BE, MKTAG('I', '0', 'A', 'B') },
|
||||
{ AV_PIX_FMT_YUV422P10LE, MKTAG('I', '2', 'A', 'L') },
|
||||
{ AV_PIX_FMT_YUV422P10BE, MKTAG('I', '2', 'A', 'B') },
|
||||
{ AV_PIX_FMT_YUV444P10LE, MKTAG('I', '4', 'A', 'L') },
|
||||
{ AV_PIX_FMT_YUV444P10BE, MKTAG('I', '4', 'A', 'B') },
|
||||
{ AV_PIX_FMT_YUV444P16LE, MKTAG('I', '4', 'F', 'L') },
|
||||
{ AV_PIX_FMT_YUV444P16BE, MKTAG('I', '4', 'F', 'B') },
|
||||
|
||||
/* special */
|
||||
{ AV_PIX_FMT_RGB565LE,MKTAG( 3 , 0 , 0 , 0 ) }, /* flipped RGB565LE */
|
||||
{ AV_PIX_FMT_YUV444P, MKTAG('Y', 'V', '2', '4') }, /* YUV444P, swapped UV */
|
||||
|
||||
{ AV_PIX_FMT_NONE, 0 },
|
||||
};
|
||||
|
||||
const struct PixelFormatTag *avpriv_get_raw_pix_fmt_tags(void)
|
||||
{
|
||||
return ff_raw_pix_fmt_tags;
|
||||
}
|
||||
|
||||
unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat fmt)
|
||||
{
|
||||
const PixelFormatTag *tags = ff_raw_pix_fmt_tags;
|
||||
while (tags->pix_fmt >= 0) {
|
||||
if (tags->pix_fmt == fmt)
|
||||
return tags->fourcc;
|
||||
tags++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const PixelFormatTag avpriv_pix_fmt_bps_avi[] = {
|
||||
{ AV_PIX_FMT_PAL8, 1 },
|
||||
{ AV_PIX_FMT_PAL8, 2 },
|
||||
{ AV_PIX_FMT_PAL8, 4 },
|
||||
{ AV_PIX_FMT_PAL8, 8 },
|
||||
{ AV_PIX_FMT_RGB444LE, 12 },
|
||||
{ AV_PIX_FMT_RGB555LE, 15 },
|
||||
{ AV_PIX_FMT_RGB555LE, 16 },
|
||||
{ AV_PIX_FMT_BGR24, 24 },
|
||||
{ AV_PIX_FMT_BGRA, 32 },
|
||||
{ AV_PIX_FMT_NONE, 0 },
|
||||
};
|
||||
|
||||
const PixelFormatTag avpriv_pix_fmt_bps_mov[] = {
|
||||
{ AV_PIX_FMT_PAL8, 1 },
|
||||
{ AV_PIX_FMT_PAL8, 2 },
|
||||
{ AV_PIX_FMT_PAL8, 4 },
|
||||
{ AV_PIX_FMT_PAL8, 8 },
|
||||
{ AV_PIX_FMT_RGB555BE, 16 },
|
||||
{ AV_PIX_FMT_RGB24, 24 },
|
||||
{ AV_PIX_FMT_ARGB, 32 },
|
||||
{ AV_PIX_FMT_PAL8, 33 },
|
||||
{ AV_PIX_FMT_NONE, 0 },
|
||||
};
|
||||
47
media/ffvpx/libavcodec/raw.h
Normal file
47
media/ffvpx/libavcodec/raw.h
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Raw Video Codec
|
||||
* Copyright (c) 2001 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
* Raw Video Codec
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_RAW_H
|
||||
#define AVCODEC_RAW_H
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "libavutil/internal.h"
|
||||
|
||||
typedef struct PixelFormatTag {
|
||||
enum AVPixelFormat pix_fmt;
|
||||
unsigned int fourcc;
|
||||
} PixelFormatTag;
|
||||
|
||||
extern const PixelFormatTag ff_raw_pix_fmt_tags[]; // exposed through avpriv_get_raw_pix_fmt_tags()
|
||||
|
||||
const struct PixelFormatTag *avpriv_get_raw_pix_fmt_tags(void);
|
||||
|
||||
enum AVPixelFormat avpriv_find_pix_fmt(const PixelFormatTag *tags, unsigned int fourcc);
|
||||
|
||||
extern av_export const PixelFormatTag avpriv_pix_fmt_bps_avi[];
|
||||
extern av_export const PixelFormatTag avpriv_pix_fmt_bps_mov[];
|
||||
|
||||
#endif /* AVCODEC_RAW_H */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue