mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-03-15 15:11:29 +00:00
Merge pull request #417 from DanielGibson/libbinkdec
Integrate and use libbinkdec for video playback
This commit is contained in:
commit
fd9d0bbfed
38 changed files with 6671 additions and 15 deletions
33
README.txt
33
README.txt
|
@ -619,3 +619,36 @@ select the most convenient license for your needs from (1) the
|
|||
GNU GPL, (2) the GNU LGPL, or (3) the Perl Artistic License.
|
||||
|
||||
|
||||
libbinkdec
|
||||
---------------------------------------------------------------------------
|
||||
neo/libs/libbinkdec/*
|
||||
|
||||
Copyright (C) 2011 Barry Duncan
|
||||
|
||||
Based on Bink video decoder from FFmpeg
|
||||
|
||||
Copyright (C) 2009 Konstantin Shishkov
|
||||
Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
|
||||
And generic Code from FFmpeg
|
||||
|
||||
Copyright (C) 2000-2011 FFmpeg team, http://www.ffmpeg.org
|
||||
|
||||
libbinkdec and (the used parts of) FFmpeg are released under LGPL v2.1:
|
||||
|
||||
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
|
||||
|
||||
(You can find the whole license text on https://www.gnu.org/licenses/lgpl-2.1.html
|
||||
or in neo/libs/libbinkdec/COPYING)
|
||||
|
|
|
@ -19,7 +19,10 @@ option(OPENAL
|
|||
"Use OpenAL soft instead of XAudio2" OFF)
|
||||
|
||||
option(FFMPEG
|
||||
"Use FMPEG to render Bink videos" ON)
|
||||
"Use FMPEG to render Bink videos" OFF)
|
||||
|
||||
option(BINKDEC
|
||||
"Use included libbinkdec to render Bink videos" ON)
|
||||
|
||||
option(ONATIVE
|
||||
"Optimize for the host CPU" OFF)
|
||||
|
@ -48,6 +51,10 @@ set(CPU_OPTIMIZATION "-mmmx -msse -msse2" CACHE STRING "Which CPU specific optim
|
|||
|
||||
option(USE_INTRINSICS "Compile using intrinsics (e.g mmx, sse, msse2)" ON)
|
||||
|
||||
if(FFMPEG AND BINKDEC)
|
||||
message(FATAL_ERROR "Only one of FFMPEG and BINKDEC (or neither) can be enabled at a time")
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
set(OPENAL TRUE)
|
||||
endif()
|
||||
|
@ -97,25 +104,25 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
|||
add_definitions(-DUSE_EXCEPTIONS)
|
||||
#endif()
|
||||
|
||||
# the warnings are used for every profile anyway, so put them in a variable
|
||||
set(my_warn_flags "-Wno-pragmas -Wno-unused-variable -Wno-switch -Wno-unused-value -Winvalid-pch -Wno-multichar")
|
||||
|
||||
add_compile_options(-Wno-pragmas -Wno-unused-variable -Wno-switch -Wno-unused-value -Winvalid-pch -Wno-multichar)
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
# append clang-specific settings for warnings (the second one make sure clang doesn't complain
|
||||
# add clang-specific settings for warnings (the second one make sure clang doesn't complain
|
||||
# about unknown -W flags, like -Wno-unused-but-set-variable)
|
||||
set(my_warn_flags "${my_warn_flags} -Wno-local-type-template-args -Wno-unknown-warning-option -Wno-inline-new-delete -Wno-switch-enum")
|
||||
add_compile_options(-Wno-local-type-template-args -Wno-unknown-warning-option -Wno-inline-new-delete -Wno-switch-enum)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_CROSSCOMPILING AND ONATIVE)
|
||||
add_definitions(-march=native)
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0 -ggdb -fno-strict-aliasing ${my_warn_flags}")
|
||||
#set(CMAKE_C_FLAGS_DEBUGALL "${CMAKE_C_FLAGS_DEBUGALL} -g -ggdb -D_DEBUG -fno-strict-aliasing ${my_warn_flags}")
|
||||
#set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -g -ggdb -D_DEBUG -O1 -fno-omit-frame-pointer -fno-strict-aliasing ${my_warn_flags}")
|
||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}")
|
||||
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Os -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}")
|
||||
add_compile_options(-fno-strict-aliasing)
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0 -ggdb")
|
||||
#set(CMAKE_C_FLAGS_DEBUGALL "${CMAKE_C_FLAGS_DEBUGALL} -g -ggdb -D_DEBUG")
|
||||
#set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -g -ggdb -D_DEBUG -O1 -fno-omit-frame-pointer")
|
||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer")
|
||||
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Os -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer")
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
|
||||
#set(CMAKE_CXX_FLAGS_DEBUGALL ${CMAKE_C_FLAGS_DEBUGALL})
|
||||
|
@ -392,6 +399,12 @@ else (NOT ZLIB_FOUND)
|
|||
set(ZLIB_SOURCES "")
|
||||
endif (NOT ZLIB_FOUND)
|
||||
|
||||
if(BINKDEC)
|
||||
file(GLOB BINKDEC_INCLUDES libs/libbinkdec/include/*.h)
|
||||
file(GLOB BINKDEC_SOURCES libs/libbinkdec/src/*.c libs/libbinkdec/src/*.cpp)
|
||||
add_definitions(-DUSE_BINKDEC)
|
||||
include_directories("libs/libbinkdec/include")
|
||||
endif()
|
||||
|
||||
file(GLOB MINIZIP_INCLUDES libs/zlib/minizip/*.h)
|
||||
file(GLOB MINIZIP_SOURCES libs/zlib/minizip/*.c libs/zlib/minizip/*.cpp)
|
||||
|
@ -902,6 +915,9 @@ source_group("libs\\irrxml" FILES ${IRRXML_SOURCES})
|
|||
source_group("libs\\jpeg-6" FILES ${JPEG_INCLUDES})
|
||||
source_group("libs\\jpeg-6" FILES ${JPEG_SOURCES})
|
||||
|
||||
source_group("libs\\libbinkdec" FILES ${BINKDEC_INCLUDES})
|
||||
source_group("libs\\libbinkdec" FILES ${BINKDEC_SOURCES})
|
||||
|
||||
source_group("libs\\png" FILES ${PNG_INCLUDES})
|
||||
source_group("libs\\png" FILES ${PNG_SOURCES})
|
||||
|
||||
|
@ -1066,6 +1082,7 @@ set(RBDOOM3_INCLUDES
|
|||
${PNG_INCLUDES}
|
||||
${ZLIB_INCLUDES}
|
||||
${MINIZIP_INCLUDES}
|
||||
${BINKDEC_INCLUDES}
|
||||
${GLEW_INCLUDES}
|
||||
${RAPIDJSON_INCLUDES}
|
||||
#${FREETYPE_SOURCES}
|
||||
|
@ -1102,6 +1119,7 @@ set(RBDOOM3_SOURCES
|
|||
${PNG_SOURCES}
|
||||
${ZLIB_SOURCES}
|
||||
${MINIZIP_SOURCES}
|
||||
${BINKDEC_SOURCES}
|
||||
${GLEW_SOURCES}
|
||||
#${FREETYPE_SOURCES}
|
||||
${SOUND_SOURCES}
|
||||
|
@ -1293,7 +1311,7 @@ if(MSVC)
|
|||
|
||||
if(USE_PRECOMPILED_HEADERS)
|
||||
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES} ${BINKDEC_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
|
||||
|
@ -1428,7 +1446,7 @@ else()
|
|||
|
||||
if(USE_PRECOMPILED_HEADERS)
|
||||
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES} ${BINKDEC_SOURCES})
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
|
||||
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
|
||||
|
|
504
neo/libs/libbinkdec/COPYING
Normal file
504
neo/libs/libbinkdec/COPYING
Normal file
|
@ -0,0 +1,504 @@
|
|||
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!
|
||||
|
||||
|
98
neo/libs/libbinkdec/include/BinkAudio.h
Normal file
98
neo/libs/libbinkdec/include/BinkAudio.h
Normal file
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkAudio_h_
|
||||
#define _BinkAudio_h_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
|
||||
extern "C" {
|
||||
#include "rdft.h"
|
||||
#include "dct.h"
|
||||
}
|
||||
|
||||
// audio transform type
|
||||
enum eTransformType {
|
||||
kTransformTypeRDFT = 0,
|
||||
kTransformTypeDCT = 1
|
||||
};
|
||||
|
||||
const int kMaxChannels = 2;
|
||||
const int kBlockMaxSize = kMaxChannels << 11;
|
||||
|
||||
static const int kNumCriticalFrequencies = 25;
|
||||
static const uint16_t criticalFrequencies[kNumCriticalFrequencies] =
|
||||
{
|
||||
100, 200, 300, 400,
|
||||
510, 630, 770, 920,
|
||||
1080, 1270, 1480, 1720,
|
||||
2000, 2320, 2700, 3150,
|
||||
3700, 4400, 5300, 6400,
|
||||
7700, 9500, 12000, 15500,
|
||||
24500
|
||||
};
|
||||
|
||||
static const int kNumRLEentries = 16;
|
||||
static const uint8_t RLEentries[kNumRLEentries] =
|
||||
{
|
||||
2, 3, 4, 5,
|
||||
6, 8, 9, 10,
|
||||
11, 12, 13, 14,
|
||||
15, 16, 32, 64
|
||||
};
|
||||
|
||||
struct AudioTrack
|
||||
{
|
||||
uint32_t sampleRate;
|
||||
uint32_t nChannels; // internal use only
|
||||
uint32_t nChannelsReal; // number of channels you should pass to your audio API
|
||||
|
||||
eTransformType transformType;
|
||||
int frameLenBits;
|
||||
int frameLength; // transform size (samples)
|
||||
int overlapLength; // overlap size (samples)
|
||||
int blockSize;
|
||||
uint32_t sampleRateHalf;
|
||||
uint32_t nBands;
|
||||
bool first;
|
||||
float root;
|
||||
|
||||
union {
|
||||
RDFTContext rdft;
|
||||
DCTContext dct;
|
||||
} trans;
|
||||
|
||||
std::vector<uint32_t> bands;
|
||||
|
||||
float coeffs[kBlockMaxSize];
|
||||
int16_t previous[kBlockMaxSize / 16]; // coeffs from previous audio block
|
||||
|
||||
float *coeffsPtr[kMaxChannels]; // pointers to the coeffs arrays for float_to_int16_interleave
|
||||
|
||||
int16_t *blockBuffer;
|
||||
uint32_t blockBufferSize;
|
||||
|
||||
uint8_t *buffer;
|
||||
uint32_t bufferSize; // size in bytes
|
||||
|
||||
uint32_t bytesReadThisFrame;
|
||||
};
|
||||
|
||||
#endif
|
222
neo/libs/libbinkdec/include/BinkDecoder.h
Normal file
222
neo/libs/libbinkdec/include/BinkDecoder.h
Normal file
|
@ -0,0 +1,222 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* below is the license from FFmpeg
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (c) 2009 Konstantin Shishkov
|
||||
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
*
|
||||
* 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 _BinkDecoder_h_
|
||||
#define _BinkDecoder_h_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include "FileStream.h"
|
||||
#include "BinkAudio.h"
|
||||
#include "BinkVideo.h"
|
||||
#include "BitReader.h"
|
||||
|
||||
const int kBIKbID = 'BIKb'; // not supported
|
||||
const int kBIKfID = 'BIKf';
|
||||
const int kBIKgID = 'BIKg';
|
||||
const int kBIKhID = 'BIKh';
|
||||
const int kBIKiID = 'BIKi';
|
||||
|
||||
const int kFlagAlpha = 0x00100000;
|
||||
const int kFlagGray = 0x00020000;
|
||||
|
||||
const int kNumTrees = 16;
|
||||
|
||||
// exportable interface
|
||||
struct BinkHandle
|
||||
{
|
||||
bool isValid;
|
||||
int instanceIndex;
|
||||
};
|
||||
|
||||
struct AudioInfo
|
||||
{
|
||||
uint32_t sampleRate;
|
||||
uint32_t nChannels;
|
||||
|
||||
uint32_t idealBufferSize;
|
||||
};
|
||||
|
||||
struct ImagePlane
|
||||
{
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t pitch;
|
||||
uint8_t *data;
|
||||
};
|
||||
|
||||
typedef ImagePlane YUVbuffer[3];
|
||||
|
||||
BinkHandle Bink_Open (const char* fileName);
|
||||
void Bink_Close (BinkHandle &handle);
|
||||
uint32_t Bink_GetNumAudioTracks (BinkHandle &handle);
|
||||
void Bink_GetFrameSize (BinkHandle &handle, uint32_t &width, uint32_t &height);
|
||||
AudioInfo Bink_GetAudioTrackDetails (BinkHandle &handle, uint32_t trackIndex);
|
||||
uint32_t Bink_GetAudioData (BinkHandle &handle, uint32_t trackIndex, int16_t *data);
|
||||
float Bink_GetFrameRate (BinkHandle &handle);
|
||||
uint32_t Bink_GetNumFrames (BinkHandle &handle);
|
||||
uint32_t Bink_GetCurrentFrameNum (BinkHandle &handle);
|
||||
uint32_t Bink_GetNextFrame (BinkHandle &handle, YUVbuffer yuv);
|
||||
void Bink_GotoFrame (BinkHandle &handle, uint32_t frameNum);
|
||||
|
||||
// for internal use only
|
||||
struct Plane
|
||||
{
|
||||
uint8_t *current;
|
||||
uint8_t *last;
|
||||
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t pitch;
|
||||
|
||||
bool Init(uint32_t width, uint32_t height)
|
||||
{
|
||||
// align to 16 bytes
|
||||
width += width % 16;
|
||||
height += height % 16;
|
||||
|
||||
current = new uint8_t[width * height];
|
||||
last = new uint8_t[width * height];
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
this->pitch = width;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Swap()
|
||||
{
|
||||
std::swap(current, last);
|
||||
}
|
||||
};
|
||||
|
||||
class BinkDecoder
|
||||
{
|
||||
public:
|
||||
|
||||
uint32_t frameWidth;
|
||||
uint32_t frameHeight;
|
||||
|
||||
BinkDecoder();
|
||||
~BinkDecoder();
|
||||
|
||||
bool Open(const std::string &fileName);
|
||||
uint32_t GetNumFrames();
|
||||
uint32_t GetCurrentFrameNum();
|
||||
float GetFrameRate();
|
||||
void GetNextFrame(YUVbuffer yuv);
|
||||
void GotoFrame(uint32_t frameNum);
|
||||
|
||||
AudioInfo GetAudioTrackDetails(uint32_t trackIndex);
|
||||
uint32_t GetNumAudioTracks();
|
||||
uint32_t GetAudioData(uint32_t trackIndex, int16_t *audioBuffer);
|
||||
|
||||
private:
|
||||
|
||||
BinkCommon::FileStream file;
|
||||
|
||||
uint32_t signature;
|
||||
uint32_t fileSize;
|
||||
|
||||
uint32_t nFrames;
|
||||
uint32_t largestFrameSize;
|
||||
|
||||
uint32_t fpsDividend;
|
||||
uint32_t fpsDivider;
|
||||
uint32_t videoFlags;
|
||||
|
||||
bool hasAlpha;
|
||||
bool swapPlanes;
|
||||
|
||||
uint32_t currentFrame;
|
||||
|
||||
std::vector<Plane> planes;
|
||||
|
||||
Bundle bundle[BINK_NB_SRC];
|
||||
Tree col_high[kNumTrees]; // trees for decoding high nibble in "colours" data type
|
||||
int col_lastval; // value of last decoded high nibble in "colours" data type
|
||||
|
||||
std::vector<VideoFrame> frames;
|
||||
std::vector<AudioTrack*> audioTracks;
|
||||
uint32_t nAudioTracks;
|
||||
|
||||
// huffman tree functions
|
||||
void InitTrees();
|
||||
void Merge(BinkCommon::BitReader &bits, uint8_t *dst, uint8_t *src, int size);
|
||||
void ReadTree(BinkCommon::BitReader &bits, Tree *tree);
|
||||
uint8_t GetHuff(BinkCommon::BitReader &bits);
|
||||
uint8_t GetHuffSymbol(BinkCommon::BitReader &bits, Tree &tree);
|
||||
|
||||
// video related functions
|
||||
void InitBundles();
|
||||
void FreeBundles();
|
||||
void InitLengths(int width, int bw);
|
||||
void ReadBundle(BinkCommon::BitReader &bits, int bundle_num);
|
||||
int ReadRuns(BinkCommon::BitReader &bits, Bundle *b);
|
||||
int ReadMotionValues(BinkCommon::BitReader &bits, Bundle *b);
|
||||
int ReadBlockTypes(BinkCommon::BitReader &bits, Bundle *b);
|
||||
int ReadPatterns(BinkCommon::BitReader &bits, Bundle *b);
|
||||
int ReadColors(BinkCommon::BitReader &bits, Bundle *b);
|
||||
int ReadDCs(BinkCommon::BitReader &bits, Bundle *b, int start_bits, int has_sign);
|
||||
int GetValue(int bundle);
|
||||
int ReadDCTcoeffs(BinkCommon::BitReader &bits, int32_t block[64], const uint8_t *scan, const int32_t quant_matrices[16][64], int q);
|
||||
int ReadResidue(BinkCommon::BitReader &bits, DCTELEM block[64], int masks_count);
|
||||
void PutPixels8x8Overlapped(uint8_t *dst, uint8_t *src, int stride);
|
||||
int DecodePlane(BinkCommon::BitReader &bits, int plane_idx, int is_chroma);
|
||||
int DecodeFrame(BinkCommon::BitReader &bits);
|
||||
void PutPixelsTab(uint8_t *dest, uint8_t *prev, uint32_t pitch, uint32_t size);
|
||||
void FillBlockTab(uint8_t *dest, uint32_t value, uint32_t pitch, uint32_t size);
|
||||
void AddPixels8(uint8_t *dest, DCTELEM *block, uint32_t stride);
|
||||
void ClearBlock(DCTELEM *block);
|
||||
void VideoPacket(uint32_t packetSize);
|
||||
|
||||
// audio functions
|
||||
float GetAudioFloat(BinkCommon::BitReader &bits);
|
||||
bool CreateAudioTrack(uint32_t sampleRate, uint16_t flags);
|
||||
void AudioPacket(uint32_t trackIndex, uint32_t packetSize);
|
||||
void DecodeAudioBlock(uint32_t trackIndex, BinkCommon::BitReader &bits);
|
||||
};
|
||||
|
||||
#endif
|
119
neo/libs/libbinkdec/include/BinkVideo.h
Normal file
119
neo/libs/libbinkdec/include/BinkVideo.h
Normal file
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* below is the license from FFmpeg
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (c) 2009 Konstantin Shishkov
|
||||
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
*
|
||||
* 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 _BinkVideo_h_
|
||||
#define _BinkVideo_h_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "HuffmanVLC.h"
|
||||
|
||||
/** number of bits used to store first DC value in bundle */
|
||||
const int kDCstartBits = 11;
|
||||
|
||||
/**
|
||||
* IDs for different data types used in Bink video codec
|
||||
*/
|
||||
enum Sources {
|
||||
BINK_SRC_BLOCK_TYPES = 0, ///< 8x8 block types
|
||||
BINK_SRC_SUB_BLOCK_TYPES, ///< 16x16 block types (a subset of 8x8 block types)
|
||||
BINK_SRC_COLORS, ///< pixel values used for different block types
|
||||
BINK_SRC_PATTERN, ///< 8-bit values for 2-colour pattern fill
|
||||
BINK_SRC_X_OFF, ///< X components of motion value
|
||||
BINK_SRC_Y_OFF, ///< Y components of motion value
|
||||
BINK_SRC_INTRA_DC, ///< DC values for intrablocks with DCT
|
||||
BINK_SRC_INTER_DC, ///< DC values for interblocks with DCT
|
||||
BINK_SRC_RUN, ///< run lengths for special fill block
|
||||
|
||||
BINK_NB_SRC
|
||||
};
|
||||
|
||||
static BinkCommon::VLCtable bink_trees[16];
|
||||
|
||||
/**
|
||||
* data needed to decode 4-bit Huffman-coded value
|
||||
*/
|
||||
typedef struct Tree
|
||||
{
|
||||
int vlc_num; ///< tree number (in bink_trees[])
|
||||
uint8_t symbols[16]; ///< leaf value to symbol mapping
|
||||
} Tree;
|
||||
|
||||
/**
|
||||
* data structure used for decoding single Bink data type
|
||||
*/
|
||||
typedef struct Bundle
|
||||
{
|
||||
int len; ///< length of number of entries to decode (in bits)
|
||||
Tree tree; ///< Huffman tree-related data
|
||||
uint8_t *data; ///< buffer for decoded symbols
|
||||
uint8_t *data_end; ///< buffer end
|
||||
uint8_t *cur_dec; ///< pointer to the not yet decoded part of the buffer
|
||||
uint8_t *cur_ptr; ///< pointer to the data that is not read from buffer yet
|
||||
} Bundle;
|
||||
|
||||
/**
|
||||
* Bink video block types
|
||||
*/
|
||||
enum BlockTypes {
|
||||
SKIP_BLOCK = 0, ///< skipped block
|
||||
SCALED_BLOCK, ///< block has size 16x16
|
||||
MOTION_BLOCK, ///< block is copied from previous frame with some offset
|
||||
RUN_BLOCK, ///< block is composed from runs of colours with custom scan order
|
||||
RESIDUE_BLOCK, ///< motion block with some difference added
|
||||
INTRA_BLOCK, ///< intra DCT block
|
||||
FILL_BLOCK, ///< block is filled with single colour
|
||||
INTER_BLOCK, ///< motion block with DCT applied to the difference
|
||||
PATTERN_BLOCK, ///< block is filled with two colours following custom pattern
|
||||
RAW_BLOCK, ///< uncoded 8x8 block
|
||||
};
|
||||
|
||||
struct VideoFrame
|
||||
{
|
||||
uint32_t offset;
|
||||
uint32_t keyFrame;
|
||||
uint32_t size;
|
||||
};
|
||||
|
||||
#endif
|
55
neo/libs/libbinkdec/include/BitReader.h
Normal file
55
neo/libs/libbinkdec/include/BitReader.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkBitReader_h_
|
||||
#define _BinkBitReader_h_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "FileStream.h"
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
class BitReader
|
||||
{
|
||||
public:
|
||||
BitReader(BinkCommon::FileStream &file, uint32_t size);
|
||||
~BitReader();
|
||||
uint32_t GetBit();
|
||||
uint32_t GetBits(uint32_t n);
|
||||
void SkipBits(uint32_t n);
|
||||
|
||||
uint32_t GetSize();
|
||||
uint32_t GetPosition();
|
||||
|
||||
private:
|
||||
uint32_t totalSize;
|
||||
uint32_t currentOffset;
|
||||
uint32_t bytesRead;
|
||||
|
||||
BinkCommon::FileStream *file;
|
||||
|
||||
uint8_t cache;
|
||||
uint32_t nCachedBits;
|
||||
|
||||
void FillCache();
|
||||
};
|
||||
|
||||
} // close namespace BinkCommon
|
||||
|
||||
#endif
|
69
neo/libs/libbinkdec/include/FFmpeg_includes.h
Normal file
69
neo/libs/libbinkdec/include/FFmpeg_includes.h
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* below is the license from FFmpeg
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (c) 2009 Konstantin Shishkov
|
||||
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
*
|
||||
* 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 _FFmpeg_includes_h_
|
||||
#define _FFmpeg_includes_h_
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define av_cold
|
||||
|
||||
// taken from FFmpeg - mem.h
|
||||
#ifdef _MSC_VER
|
||||
#define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
|
||||
#else // DG: add alternative that should work with at least GCC and clang
|
||||
#define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
|
||||
#endif
|
||||
#define M_PI 3.14159265358979323846 /* pi */
|
||||
#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
|
||||
|
||||
#define HAVE_MMX 0
|
||||
#define ARCH_ARM 0
|
||||
#define HAVE_ALTIVEC 0
|
||||
#define CONFIG_MDCT 1
|
||||
|
||||
typedef short DCTELEM;
|
||||
|
||||
#endif
|
66
neo/libs/libbinkdec/include/FileStream.h
Normal file
66
neo/libs/libbinkdec/include/FileStream.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkFileStream_h_
|
||||
#define _BinkFileStream_h_
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <stdint.h>
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
class FileStream
|
||||
{
|
||||
public:
|
||||
|
||||
bool Open(const std::string &fileName);
|
||||
bool Is_Open();
|
||||
void Close();
|
||||
|
||||
int32_t ReadBytes(uint8_t *data, uint32_t nBytes);
|
||||
|
||||
uint32_t ReadUint32LE();
|
||||
uint32_t ReadUint32BE();
|
||||
|
||||
uint16_t ReadUint16LE();
|
||||
uint16_t ReadUint16BE();
|
||||
|
||||
uint8_t ReadByte();
|
||||
|
||||
enum SeekDirection{
|
||||
kSeekCurrent = 0,
|
||||
kSeekStart = 1,
|
||||
kSeekEnd = 2
|
||||
};
|
||||
|
||||
bool Seek(int32_t offset, SeekDirection = kSeekStart);
|
||||
bool Skip(int32_t offset);
|
||||
|
||||
int32_t GetPosition();
|
||||
bool Is_Eos();
|
||||
|
||||
private:
|
||||
std::ifstream file;
|
||||
};
|
||||
|
||||
} // close namespace BinkCommon
|
||||
|
||||
#endif
|
43
neo/libs/libbinkdec/include/HuffmanVLC.h
Normal file
43
neo/libs/libbinkdec/include/HuffmanVLC.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkHuffmanVLC_h_
|
||||
#define _BinkHuffmanVLC_h_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "BitReader.h"
|
||||
#include <vector>
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
struct VLC
|
||||
{
|
||||
uint8_t symbol;
|
||||
uint8_t code;
|
||||
};
|
||||
|
||||
typedef std::vector<std::vector<VLC> > VLCtable;
|
||||
|
||||
uint8_t VLC_GetCodeBits (BinkCommon::BitReader &bits, VLCtable &table);
|
||||
void VLC_InitTable (VLCtable &table, uint32_t maxLength, uint32_t size, const uint8_t *lengths, const uint8_t *bits);
|
||||
uint32_t VLC_GetSize (VLCtable &table);
|
||||
|
||||
} // close namespace BinkCommon
|
||||
|
||||
#endif
|
31
neo/libs/libbinkdec/include/LogError.h
Normal file
31
neo/libs/libbinkdec/include/LogError.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkLogError_h_
|
||||
#define _BinkLogError_h_
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
void LogError(const std::string &error);
|
||||
|
||||
} // close namespace BinkCommon
|
||||
|
||||
#endif
|
27
neo/libs/libbinkdec/include/Util.h
Normal file
27
neo/libs/libbinkdec/include/Util.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _BinkUtil_h_
|
||||
#define _BinkUtil_h_
|
||||
|
||||
#include <string.h> // DG: apparently memcpy(), memset() etc are used in several files including this one
|
||||
|
||||
const int av_log2_c(unsigned int v);
|
||||
|
||||
#endif
|
99
neo/libs/libbinkdec/include/avfft.h
Normal file
99
neo/libs/libbinkdec/include/avfft.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* 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_AVFFT_H
|
||||
#define AVCODEC_AVFFT_H
|
||||
|
||||
typedef float FFTSample;
|
||||
|
||||
typedef struct FFTComplex {
|
||||
FFTSample re, im;
|
||||
} FFTComplex;
|
||||
|
||||
typedef struct FFTContext FFTContext;
|
||||
|
||||
/**
|
||||
* Set up a complex FFT.
|
||||
* @param nbits log2 of the length of the input array
|
||||
* @param inverse if 0 perform the forward transform, if 1 perform the inverse
|
||||
*/
|
||||
FFTContext *av_fft_init(int nbits, int inverse);
|
||||
|
||||
/**
|
||||
* Do the permutation needed BEFORE calling ff_fft_calc().
|
||||
*/
|
||||
void av_fft_permute(FFTContext *s, FFTComplex *z);
|
||||
|
||||
/**
|
||||
* Do a complex FFT with the parameters defined in av_fft_init(). The
|
||||
* input data must be permuted before. No 1.0/sqrt(n) normalization is done.
|
||||
*/
|
||||
void av_fft_calc(FFTContext *s, FFTComplex *z);
|
||||
|
||||
void av_fft_end(FFTContext *s);
|
||||
|
||||
FFTContext *av_mdct_init(int nbits, int inverse, double scale);
|
||||
void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void av_mdct_end(FFTContext *s);
|
||||
|
||||
/* Real Discrete Fourier Transform */
|
||||
|
||||
enum RDFTransformType {
|
||||
DFT_R2C,
|
||||
IDFT_C2R,
|
||||
IDFT_R2C,
|
||||
DFT_C2R,
|
||||
};
|
||||
|
||||
typedef struct RDFTContext RDFTContext;
|
||||
|
||||
/**
|
||||
* Set up a real FFT.
|
||||
* @param nbits log2 of the length of the input array
|
||||
* @param trans the type of transform
|
||||
*/
|
||||
RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
|
||||
void av_rdft_calc(RDFTContext *s, FFTSample *data);
|
||||
void av_rdft_end(RDFTContext *s);
|
||||
|
||||
/* Discrete Cosine Transform */
|
||||
|
||||
typedef struct DCTContext DCTContext;
|
||||
|
||||
enum DCTTransformType {
|
||||
DCT_II = 0,
|
||||
DCT_III,
|
||||
DCT_I,
|
||||
DST_I,
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
|
||||
void av_dct_calc(DCTContext *s, FFTSample *data);
|
||||
void av_dct_end (DCTContext *s);
|
||||
|
||||
#endif /* AVCODEC_AVFFT_H */
|
655
neo/libs/libbinkdec/include/binkdata.h
Normal file
655
neo/libs/libbinkdec/include/binkdata.h
Normal file
|
@ -0,0 +1,655 @@
|
|||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (C) 2009 Kostya Shishkov
|
||||
*
|
||||
* 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_BINKDATA_H
|
||||
#define AVCODEC_BINKDATA_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** Bink DCT and residue 8x8 block scan order */
|
||||
static const uint8_t bink_scan[64] = {
|
||||
0, 1, 8, 9, 2, 3, 10, 11,
|
||||
4, 5, 12, 13, 6, 7, 14, 15,
|
||||
20, 21, 28, 29, 22, 23, 30, 31,
|
||||
16, 17, 24, 25, 32, 33, 40, 41,
|
||||
34, 35, 42, 43, 48, 49, 56, 57,
|
||||
50, 51, 58, 59, 18, 19, 26, 27,
|
||||
36, 37, 44, 45, 38, 39, 46, 47,
|
||||
52, 53, 60, 61, 54, 55, 62, 63
|
||||
};
|
||||
|
||||
static const uint8_t bink_tree_bits[16][16] = {
|
||||
{
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D,
|
||||
0x0F, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x01, 0x09, 0x05, 0x15, 0x0D, 0x1D,
|
||||
0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D, 0x1D,
|
||||
0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x04, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D,
|
||||
0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x04, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09,
|
||||
0x05, 0x0D, 0x03, 0x0B, 0x07, 0x17, 0x0F, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05,
|
||||
0x0D, 0x03, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x05, 0x03, 0x13, 0x0B, 0x1B, 0x3B,
|
||||
0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x03, 0x13, 0x0B, 0x2B, 0x1B, 0x3B,
|
||||
0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B,
|
||||
0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B,
|
||||
0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x13, 0x0B,
|
||||
0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x01, 0x03, 0x13, 0x0B, 0x1B, 0x3B,
|
||||
0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37,
|
||||
0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x05, 0x03, 0x07, 0x17, 0x37, 0x77,
|
||||
0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F,
|
||||
},
|
||||
{
|
||||
0x00, 0x02, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17,
|
||||
0x37, 0x0F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F,
|
||||
},
|
||||
};
|
||||
|
||||
static const uint8_t bink_tree_lens[16][16] = {
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
|
||||
{ 1, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
|
||||
{ 2, 2, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
|
||||
{ 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
|
||||
{ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 },
|
||||
{ 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5 },
|
||||
{ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5 },
|
||||
{ 1, 3, 3, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
|
||||
{ 1, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
|
||||
{ 1, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6 },
|
||||
{ 2, 2, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
|
||||
{ 1, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
|
||||
{ 2, 2, 2, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
|
||||
{ 1, 3, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 },
|
||||
{ 1, 3, 3, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
|
||||
{ 2, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 },
|
||||
};
|
||||
|
||||
static const uint8_t bink_patterns[16][64] = {
|
||||
{
|
||||
0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38,
|
||||
0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01,
|
||||
0x02, 0x0A, 0x12, 0x1A, 0x22, 0x2A, 0x32, 0x3A,
|
||||
0x3B, 0x33, 0x2B, 0x23, 0x1B, 0x13, 0x0B, 0x03,
|
||||
0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
|
||||
0x3D, 0x35, 0x2D, 0x25, 0x1D, 0x15, 0x0D, 0x05,
|
||||
0x06, 0x0E, 0x16, 0x1E, 0x26, 0x2E, 0x36, 0x3E,
|
||||
0x3F, 0x37, 0x2F, 0x27, 0x1F, 0x17, 0x0F, 0x07,
|
||||
},
|
||||
{
|
||||
0x3B, 0x3A, 0x39, 0x38, 0x30, 0x31, 0x32, 0x33,
|
||||
0x2B, 0x2A, 0x29, 0x28, 0x20, 0x21, 0x22, 0x23,
|
||||
0x1B, 0x1A, 0x19, 0x18, 0x10, 0x11, 0x12, 0x13,
|
||||
0x0B, 0x0A, 0x09, 0x08, 0x00, 0x01, 0x02, 0x03,
|
||||
0x04, 0x05, 0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x0C,
|
||||
0x14, 0x15, 0x16, 0x17, 0x1F, 0x1E, 0x1D, 0x1C,
|
||||
0x24, 0x25, 0x26, 0x27, 0x2F, 0x2E, 0x2D, 0x2C,
|
||||
0x34, 0x35, 0x36, 0x37, 0x3F, 0x3E, 0x3D, 0x3C,
|
||||
},
|
||||
{
|
||||
0x19, 0x11, 0x12, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
|
||||
0x02, 0x0A, 0x09, 0x01, 0x00, 0x08, 0x10, 0x18,
|
||||
0x20, 0x28, 0x30, 0x38, 0x39, 0x31, 0x29, 0x2A,
|
||||
0x32, 0x3A, 0x3B, 0x33, 0x2B, 0x23, 0x22, 0x21,
|
||||
0x1D, 0x15, 0x16, 0x1E, 0x1F, 0x17, 0x0F, 0x07,
|
||||
0x06, 0x0E, 0x0D, 0x05, 0x04, 0x0C, 0x14, 0x1C,
|
||||
0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x35, 0x2D, 0x2E,
|
||||
0x36, 0x3E, 0x3F, 0x37, 0x2F, 0x27, 0x26, 0x25,
|
||||
},
|
||||
{
|
||||
0x03, 0x0B, 0x02, 0x0A, 0x01, 0x09, 0x00, 0x08,
|
||||
0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
|
||||
0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
|
||||
0x30, 0x38, 0x31, 0x39, 0x32, 0x3A, 0x33, 0x3B,
|
||||
0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
|
||||
0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
|
||||
0x1C, 0x14, 0x1D, 0x15, 0x1E, 0x16, 0x1F, 0x17,
|
||||
0x0F, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04,
|
||||
},
|
||||
{
|
||||
0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
|
||||
0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
|
||||
0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
|
||||
0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
|
||||
0x27, 0x26, 0x2F, 0x2E, 0x37, 0x36, 0x3F, 0x3E,
|
||||
0x3D, 0x3C, 0x35, 0x34, 0x2D, 0x2C, 0x25, 0x24,
|
||||
0x23, 0x22, 0x2B, 0x2A, 0x33, 0x32, 0x3B, 0x3A,
|
||||
0x39, 0x38, 0x31, 0x30, 0x29, 0x28, 0x21, 0x20,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B,
|
||||
0x10, 0x11, 0x12, 0x13, 0x18, 0x19, 0x1A, 0x1B,
|
||||
0x20, 0x21, 0x22, 0x23, 0x28, 0x29, 0x2A, 0x2B,
|
||||
0x30, 0x31, 0x32, 0x33, 0x38, 0x39, 0x3A, 0x3B,
|
||||
0x04, 0x05, 0x06, 0x07, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||
0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F,
|
||||
0x24, 0x25, 0x26, 0x27, 0x2C, 0x2D, 0x2E, 0x2F,
|
||||
0x34, 0x35, 0x36, 0x37, 0x3C, 0x3D, 0x3E, 0x3F,
|
||||
},
|
||||
{
|
||||
0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x05, 0x0C, 0x04,
|
||||
0x03, 0x0B, 0x02, 0x0A, 0x09, 0x01, 0x00, 0x08,
|
||||
0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
|
||||
0x14, 0x1C, 0x15, 0x1D, 0x16, 0x1E, 0x17, 0x1F,
|
||||
0x27, 0x2F, 0x26, 0x2E, 0x25, 0x2D, 0x24, 0x2C,
|
||||
0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
|
||||
0x31, 0x30, 0x38, 0x39, 0x3A, 0x32, 0x3B, 0x33,
|
||||
0x3C, 0x34, 0x3D, 0x35, 0x36, 0x37, 0x3F, 0x3E,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
||||
0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18,
|
||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
|
||||
0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28,
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
|
||||
0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38,
|
||||
},
|
||||
{
|
||||
0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
|
||||
0x12, 0x13, 0x1B, 0x1A, 0x19, 0x11, 0x10, 0x18,
|
||||
0x20, 0x28, 0x29, 0x21, 0x22, 0x23, 0x2B, 0x2A,
|
||||
0x32, 0x31, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
|
||||
0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37, 0x36, 0x35,
|
||||
0x2D, 0x2C, 0x24, 0x25, 0x26, 0x2E, 0x2F, 0x27,
|
||||
0x1F, 0x17, 0x16, 0x1E, 0x1D, 0x1C, 0x14, 0x15,
|
||||
0x0D, 0x0C, 0x04, 0x05, 0x06, 0x0E, 0x0F, 0x07,
|
||||
},
|
||||
{
|
||||
0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
|
||||
0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
|
||||
0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
|
||||
0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
|
||||
0x26, 0x27, 0x2E, 0x2F, 0x36, 0x37, 0x3E, 0x3F,
|
||||
0x3C, 0x3D, 0x34, 0x35, 0x2C, 0x2D, 0x24, 0x25,
|
||||
0x22, 0x23, 0x2A, 0x2B, 0x32, 0x33, 0x3A, 0x3B,
|
||||
0x38, 0x39, 0x30, 0x31, 0x28, 0x29, 0x20, 0x21,
|
||||
},
|
||||
{
|
||||
0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B,
|
||||
0x13, 0x1B, 0x12, 0x1A, 0x11, 0x19, 0x10, 0x18,
|
||||
0x20, 0x28, 0x21, 0x29, 0x22, 0x2A, 0x23, 0x2B,
|
||||
0x33, 0x3B, 0x32, 0x3A, 0x31, 0x39, 0x30, 0x38,
|
||||
0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
|
||||
0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
|
||||
0x1F, 0x17, 0x1E, 0x16, 0x1D, 0x15, 0x1C, 0x14,
|
||||
0x0C, 0x04, 0x0D, 0x05, 0x0E, 0x06, 0x0F, 0x07,
|
||||
},
|
||||
{
|
||||
0x00, 0x08, 0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13,
|
||||
0x0B, 0x03, 0x02, 0x01, 0x09, 0x11, 0x12, 0x0A,
|
||||
0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F, 0x17,
|
||||
0x0F, 0x07, 0x06, 0x05, 0x0D, 0x15, 0x16, 0x0E,
|
||||
0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37,
|
||||
0x2F, 0x27, 0x26, 0x25, 0x2D, 0x35, 0x36, 0x2E,
|
||||
0x20, 0x28, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
|
||||
0x2B, 0x23, 0x22, 0x21, 0x29, 0x31, 0x32, 0x2A,
|
||||
},
|
||||
{
|
||||
0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
|
||||
0x13, 0x1B, 0x1A, 0x12, 0x11, 0x10, 0x18, 0x19,
|
||||
0x21, 0x20, 0x28, 0x29, 0x2A, 0x22, 0x23, 0x2B,
|
||||
0x33, 0x3B, 0x3A, 0x32, 0x31, 0x39, 0x38, 0x30,
|
||||
0x34, 0x3C, 0x3D, 0x35, 0x36, 0x3E, 0x3F, 0x37,
|
||||
0x2F, 0x27, 0x26, 0x2E, 0x2D, 0x2C, 0x24, 0x25,
|
||||
0x1D, 0x1C, 0x14, 0x15, 0x16, 0x1E, 0x1F, 0x17,
|
||||
0x0E, 0x0F, 0x07, 0x06, 0x05, 0x0D, 0x0C, 0x04,
|
||||
},
|
||||
{
|
||||
0x18, 0x10, 0x08, 0x00, 0x01, 0x02, 0x03, 0x0B,
|
||||
0x13, 0x1B, 0x1A, 0x19, 0x11, 0x0A, 0x09, 0x12,
|
||||
0x1C, 0x14, 0x0C, 0x04, 0x05, 0x06, 0x07, 0x0F,
|
||||
0x17, 0x1F, 0x1E, 0x1D, 0x15, 0x0E, 0x0D, 0x16,
|
||||
0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27, 0x2F,
|
||||
0x37, 0x3F, 0x3E, 0x3D, 0x35, 0x2E, 0x2D, 0x36,
|
||||
0x38, 0x30, 0x28, 0x20, 0x21, 0x22, 0x23, 0x2B,
|
||||
0x33, 0x3B, 0x3A, 0x39, 0x31, 0x2A, 0x29, 0x32,
|
||||
},
|
||||
{
|
||||
0x00, 0x08, 0x09, 0x01, 0x02, 0x0A, 0x12, 0x11,
|
||||
0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
|
||||
0x07, 0x06, 0x0E, 0x0F, 0x17, 0x16, 0x15, 0x0D,
|
||||
0x05, 0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F,
|
||||
0x3F, 0x3E, 0x36, 0x37, 0x2F, 0x2E, 0x2D, 0x35,
|
||||
0x3D, 0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27,
|
||||
0x38, 0x30, 0x31, 0x39, 0x3A, 0x32, 0x2A, 0x29,
|
||||
0x28, 0x20, 0x21, 0x22, 0x23, 0x2B, 0x33, 0x3B,
|
||||
},
|
||||
{
|
||||
0x00, 0x01, 0x08, 0x09, 0x10, 0x11, 0x18, 0x19,
|
||||
0x20, 0x21, 0x28, 0x29, 0x30, 0x31, 0x38, 0x39,
|
||||
0x3A, 0x3B, 0x32, 0x33, 0x2A, 0x2B, 0x22, 0x23,
|
||||
0x1A, 0x1B, 0x12, 0x13, 0x0A, 0x0B, 0x02, 0x03,
|
||||
0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
|
||||
0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x3C, 0x3D,
|
||||
0x3E, 0x3F, 0x36, 0x37, 0x2E, 0x2F, 0x26, 0x27,
|
||||
0x1E, 0x1F, 0x16, 0x17, 0x0E, 0x0F, 0x06, 0x07,
|
||||
}
|
||||
};
|
||||
|
||||
static const int32_t bink_intra_quant[16][64] = {
|
||||
{
|
||||
0x010000, 0x016315, 0x01E83D, 0x02A535, 0x014E7B, 0x016577, 0x02F1E6, 0x02724C,
|
||||
0x010000, 0x00EEDA, 0x024102, 0x017F9B, 0x00BE80, 0x00611E, 0x01083C, 0x00A552,
|
||||
0x021F88, 0x01DC53, 0x027FAD, 0x01F697, 0x014819, 0x00A743, 0x015A31, 0x009688,
|
||||
0x02346F, 0x030EE5, 0x01FBFA, 0x02C096, 0x01D000, 0x028396, 0x019247, 0x01F9AA,
|
||||
0x02346F, 0x01FBFA, 0x01DC53, 0x0231B8, 0x012F12, 0x01E06C, 0x00CB10, 0x0119A8,
|
||||
0x01C48C, 0x019748, 0x014E86, 0x0122AF, 0x02C628, 0x027F20, 0x0297B5, 0x023F32,
|
||||
0x025000, 0x01AB6B, 0x01D122, 0x0159B3, 0x012669, 0x008D43, 0x00EE1F, 0x0075ED,
|
||||
0x01490C, 0x010288, 0x00F735, 0x00EF51, 0x00E0F1, 0x0072AD, 0x00A4D8, 0x006517,
|
||||
},
|
||||
{
|
||||
0x015555, 0x01D971, 0x028AFC, 0x0386F1, 0x01BDF9, 0x01DC9F, 0x03ED33, 0x034311,
|
||||
0x015555, 0x013E78, 0x030158, 0x01FF7A, 0x00FE00, 0x00817D, 0x01604F, 0x00DC6D,
|
||||
0x02D4B5, 0x027B19, 0x0354E7, 0x029E1F, 0x01B577, 0x00DF04, 0x01CD96, 0x00C8B6,
|
||||
0x02F095, 0x0413DC, 0x02A54E, 0x03AB73, 0x026AAB, 0x035A1E, 0x02185E, 0x02A238,
|
||||
0x02F095, 0x02A54E, 0x027B19, 0x02ECF5, 0x019418, 0x028090, 0x010EC0, 0x01778A,
|
||||
0x025B66, 0x021F0B, 0x01BE09, 0x018394, 0x03B2E0, 0x03542A, 0x0374F1, 0x02FEEE,
|
||||
0x031555, 0x0239E4, 0x026C2D, 0x01CCEE, 0x01888C, 0x00BC59, 0x013D7E, 0x009D3C,
|
||||
0x01B6BB, 0x0158B5, 0x01499C, 0x013F17, 0x012BEC, 0x0098E6, 0x00DBCB, 0x0086C9,
|
||||
},
|
||||
{
|
||||
0x01AAAB, 0x024FCE, 0x032DBB, 0x0468AD, 0x022D78, 0x0253C7, 0x04E87F, 0x0413D5,
|
||||
0x01AAAB, 0x018E16, 0x03C1AE, 0x027F58, 0x013D80, 0x00A1DC, 0x01B863, 0x011388,
|
||||
0x0389E2, 0x0319DF, 0x042A21, 0x0345A7, 0x0222D4, 0x0116C5, 0x0240FC, 0x00FAE3,
|
||||
0x03ACBA, 0x0518D3, 0x034EA1, 0x04964F, 0x030555, 0x0430A5, 0x029E76, 0x034AC5,
|
||||
0x03ACBA, 0x034EA1, 0x0319DF, 0x03A833, 0x01F91E, 0x0320B4, 0x015270, 0x01D56D,
|
||||
0x02F23F, 0x02A6CE, 0x022D8B, 0x01E479, 0x049F98, 0x042935, 0x04522D, 0x03BEA9,
|
||||
0x03DAAB, 0x02C85D, 0x030738, 0x02402A, 0x01EAAF, 0x00EB6F, 0x018CDE, 0x00C48A,
|
||||
0x022469, 0x01AEE2, 0x019C02, 0x018EDD, 0x0176E7, 0x00BF20, 0x0112BE, 0x00A87B,
|
||||
},
|
||||
{
|
||||
0x020000, 0x02C62A, 0x03D07A, 0x054A69, 0x029CF6, 0x02CAEF, 0x05E3CC, 0x04E499,
|
||||
0x020000, 0x01DDB4, 0x048204, 0x02FF36, 0x017D01, 0x00C23C, 0x021077, 0x014AA3,
|
||||
0x043F0F, 0x03B8A6, 0x04FF5A, 0x03ED2E, 0x029032, 0x014E86, 0x02B461, 0x012D11,
|
||||
0x0468DF, 0x061DCA, 0x03F7F5, 0x05812C, 0x03A000, 0x05072C, 0x03248D, 0x03F353,
|
||||
0x0468DF, 0x03F7F5, 0x03B8A6, 0x046370, 0x025E24, 0x03C0D8, 0x019620, 0x02334F,
|
||||
0x038919, 0x032E91, 0x029D0D, 0x02455E, 0x058C50, 0x04FE3F, 0x052F69, 0x047E65,
|
||||
0x04A000, 0x0356D6, 0x03A243, 0x02B365, 0x024CD2, 0x011A85, 0x01DC3E, 0x00EBD9,
|
||||
0x029218, 0x020510, 0x01EE69, 0x01DEA2, 0x01C1E2, 0x00E559, 0x0149B0, 0x00CA2D,
|
||||
},
|
||||
{
|
||||
0x02AAAB, 0x03B2E3, 0x0515F8, 0x070DE2, 0x037BF2, 0x03B93E, 0x07DA65, 0x068621,
|
||||
0x02AAAB, 0x027CF0, 0x0602B1, 0x03FEF3, 0x01FC01, 0x0102FA, 0x02C09F, 0x01B8DA,
|
||||
0x05A96A, 0x04F632, 0x06A9CE, 0x053C3E, 0x036AED, 0x01BE09, 0x039B2D, 0x01916B,
|
||||
0x05E129, 0x0827B8, 0x054A9C, 0x0756E5, 0x04D555, 0x06B43B, 0x0430BC, 0x05446F,
|
||||
0x05E129, 0x054A9C, 0x04F632, 0x05D9EB, 0x032830, 0x050121, 0x021D80, 0x02EF14,
|
||||
0x04B6CC, 0x043E16, 0x037C11, 0x030728, 0x0765C0, 0x06A855, 0x06E9E2, 0x05FDDB,
|
||||
0x062AAB, 0x0473C8, 0x04D85A, 0x0399DC, 0x031118, 0x0178B2, 0x027AFD, 0x013A77,
|
||||
0x036D76, 0x02B16A, 0x029337, 0x027E2E, 0x0257D8, 0x0131CC, 0x01B796, 0x010D91,
|
||||
},
|
||||
{
|
||||
0x038000, 0x04DACA, 0x06ACD5, 0x094238, 0x0492AE, 0x04E322, 0x0A4EA5, 0x08900C,
|
||||
0x038000, 0x0343FB, 0x07E388, 0x053E9F, 0x029AC1, 0x0153E8, 0x039CD0, 0x02429E,
|
||||
0x076E5B, 0x068322, 0x08BEDE, 0x06DF11, 0x047C57, 0x02496B, 0x04BBAB, 0x020EDD,
|
||||
0x07B786, 0x0AB421, 0x06F1ED, 0x09A20D, 0x065800, 0x08CC8E, 0x057FF7, 0x06E9D2,
|
||||
0x07B786, 0x06F1ED, 0x068322, 0x07AE04, 0x0424BF, 0x06917B, 0x02C6B8, 0x03D9CB,
|
||||
0x062FEB, 0x05917D, 0x0492D7, 0x03F964, 0x09B58C, 0x08BCEF, 0x0912F8, 0x07DD30,
|
||||
0x081800, 0x05D7F7, 0x065BF6, 0x04B9F1, 0x040670, 0x01EE69, 0x03416C, 0x019CBC,
|
||||
0x047FAA, 0x0388DC, 0x036138, 0x03459C, 0x03134C, 0x01915C, 0x0240F5, 0x0161CF,
|
||||
},
|
||||
{
|
||||
0x040000, 0x058C54, 0x07A0F4, 0x0A94D3, 0x0539EC, 0x0595DD, 0x0BC798, 0x09C932,
|
||||
0x040000, 0x03BB68, 0x090409, 0x05FE6D, 0x02FA01, 0x018477, 0x0420EE, 0x029547,
|
||||
0x087E1F, 0x07714C, 0x09FEB5, 0x07DA5D, 0x052064, 0x029D0D, 0x0568C3, 0x025A21,
|
||||
0x08D1BE, 0x0C3B94, 0x07EFEA, 0x0B0258, 0x074000, 0x0A0E59, 0x06491A, 0x07E6A7,
|
||||
0x08D1BE, 0x07EFEA, 0x07714C, 0x08C6E0, 0x04BC48, 0x0781B1, 0x032C3F, 0x04669F,
|
||||
0x071232, 0x065D22, 0x053A1A, 0x048ABC, 0x0B18A0, 0x09FC7F, 0x0A5ED3, 0x08FCC9,
|
||||
0x094000, 0x06ADAC, 0x074487, 0x0566CA, 0x0499A5, 0x02350B, 0x03B87B, 0x01D7B3,
|
||||
0x052430, 0x040A20, 0x03DCD3, 0x03BD45, 0x0383C5, 0x01CAB3, 0x029361, 0x01945A,
|
||||
},
|
||||
{
|
||||
0x050000, 0x06EF69, 0x098931, 0x0D3A07, 0x068867, 0x06FB55, 0x0EB97E, 0x0C3B7E,
|
||||
0x050000, 0x04AA42, 0x0B450B, 0x077E08, 0x03B881, 0x01E595, 0x05292A, 0x033A99,
|
||||
0x0A9DA7, 0x094D9F, 0x0C7E62, 0x09D0F4, 0x06687D, 0x034450, 0x06C2F4, 0x02F0AA,
|
||||
0x0B062D, 0x0F4A78, 0x09EBE4, 0x0DC2EE, 0x091000, 0x0C91EF, 0x07DB61, 0x09E050,
|
||||
0x0B062D, 0x09EBE4, 0x094D9F, 0x0AF898, 0x05EB59, 0x09621D, 0x03F74F, 0x058046,
|
||||
0x08D6BE, 0x07F46A, 0x0688A0, 0x05AD6B, 0x0DDEC8, 0x0C7B9F, 0x0CF687, 0x0B3BFB,
|
||||
0x0B9000, 0x085917, 0x0915A8, 0x06C07D, 0x05C00E, 0x02C24D, 0x04A69A, 0x024D9F,
|
||||
0x066D3C, 0x050CA7, 0x04D407, 0x04AC96, 0x0464B6, 0x023D5F, 0x033839, 0x01F971,
|
||||
},
|
||||
{
|
||||
0x060000, 0x08527E, 0x0B716E, 0x0FDF3C, 0x07D6E1, 0x0860CC, 0x11AB63, 0x0EADCB,
|
||||
0x060000, 0x05991C, 0x0D860D, 0x08FDA3, 0x047702, 0x0246B3, 0x063165, 0x03DFEA,
|
||||
0x0CBD2E, 0x0B29F1, 0x0EFE0F, 0x0BC78B, 0x07B096, 0x03EB93, 0x081D24, 0x038732,
|
||||
0x0D3A9C, 0x12595D, 0x0BE7DF, 0x108384, 0x0AE000, 0x0F1585, 0x096DA8, 0x0BD9FA,
|
||||
0x0D3A9C, 0x0BE7DF, 0x0B29F1, 0x0D2A50, 0x071A6B, 0x0B4289, 0x04C25F, 0x0699EE,
|
||||
0x0A9B4A, 0x098BB2, 0x07D727, 0x06D01A, 0x10A4F0, 0x0EFABE, 0x0F8E3C, 0x0D7B2E,
|
||||
0x0DE000, 0x0A0482, 0x0AE6CA, 0x081A2F, 0x06E677, 0x034F90, 0x0594B9, 0x02C38C,
|
||||
0x07B649, 0x060F2F, 0x05CB3C, 0x059BE7, 0x0545A7, 0x02B00C, 0x03DD11, 0x025E87,
|
||||
},
|
||||
{
|
||||
0x080000, 0x0B18A8, 0x0F41E8, 0x1529A5, 0x0A73D7, 0x0B2BBB, 0x178F2F, 0x139264,
|
||||
0x080000, 0x0776CF, 0x120812, 0x0BFCD9, 0x05F402, 0x0308EF, 0x0841DC, 0x052A8E,
|
||||
0x10FC3E, 0x0EE297, 0x13FD69, 0x0FB4B9, 0x0A40C8, 0x053A1A, 0x0AD186, 0x04B442,
|
||||
0x11A37B, 0x187727, 0x0FDFD4, 0x1604B0, 0x0E8000, 0x141CB1, 0x0C9235, 0x0FCD4D,
|
||||
0x11A37B, 0x0FDFD4, 0x0EE297, 0x118DC0, 0x09788F, 0x0F0362, 0x06587F, 0x08CD3D,
|
||||
0x0E2463, 0x0CBA43, 0x0A7434, 0x091577, 0x163140, 0x13F8FE, 0x14BDA5, 0x11F992,
|
||||
0x128000, 0x0D5B58, 0x0E890D, 0x0ACD94, 0x093349, 0x046A15, 0x0770F7, 0x03AF65,
|
||||
0x0A4861, 0x08143F, 0x07B9A6, 0x077A89, 0x070789, 0x039565, 0x0526C2, 0x0328B4,
|
||||
},
|
||||
{
|
||||
0x0C0000, 0x10A4FD, 0x16E2DB, 0x1FBE78, 0x0FADC3, 0x10C198, 0x2356C7, 0x1D5B96,
|
||||
0x0C0000, 0x0B3237, 0x1B0C1A, 0x11FB46, 0x08EE03, 0x048D66, 0x0C62CA, 0x07BFD5,
|
||||
0x197A5D, 0x1653E3, 0x1DFC1E, 0x178F16, 0x0F612C, 0x07D727, 0x103A49, 0x070E64,
|
||||
0x1A7539, 0x24B2BB, 0x17CFBD, 0x210709, 0x15C000, 0x1E2B0A, 0x12DB4F, 0x17B3F4,
|
||||
0x1A7539, 0x17CFBD, 0x1653E3, 0x1A54A0, 0x0E34D7, 0x168513, 0x0984BE, 0x0D33DC,
|
||||
0x153695, 0x131765, 0x0FAE4E, 0x0DA033, 0x2149E1, 0x1DF57D, 0x1F1C78, 0x1AF65B,
|
||||
0x1BC000, 0x140904, 0x15CD94, 0x10345E, 0x0DCCEE, 0x069F20, 0x0B2972, 0x058718,
|
||||
0x0F6C91, 0x0C1E5E, 0x0B9678, 0x0B37CE, 0x0A8B4E, 0x056018, 0x07BA22, 0x04BD0E,
|
||||
},
|
||||
{
|
||||
0x110000, 0x179466, 0x206C0C, 0x2CF87F, 0x16362A, 0x17BCED, 0x321044, 0x299714,
|
||||
0x110000, 0x0FDC79, 0x265125, 0x19794E, 0x0CA685, 0x0672FB, 0x118BF4, 0x0AFA6D,
|
||||
0x241804, 0x1FA181, 0x2A7A80, 0x21600A, 0x15C9A9, 0x0B1B77, 0x16FD3C, 0x09FF0D,
|
||||
0x257B66, 0x33FD33, 0x21BBA2, 0x2EC9F7, 0x1ED000, 0x2ABCF9, 0x1AB6B0, 0x219444,
|
||||
0x257B66, 0x21BBA2, 0x1FA181, 0x254D38, 0x142030, 0x1FE730, 0x0D7C0E, 0x12B423,
|
||||
0x1E0D52, 0x1B0BCF, 0x1636EE, 0x134D9E, 0x2F28A9, 0x2A711B, 0x2C12FF, 0x263256,
|
||||
0x275000, 0x1C621B, 0x1EE33C, 0x16F4DB, 0x138CFB, 0x09616E, 0x0FD00C, 0x07D4B7,
|
||||
0x15D9CE, 0x112B06, 0x106A80, 0x0FE464, 0x0EF004, 0x079D77, 0x0AF25B, 0x06B67F,
|
||||
},
|
||||
{
|
||||
0x160000, 0x1E83CF, 0x29F53D, 0x3A3286, 0x1CBE90, 0x1EB842, 0x40C9C2, 0x35D293,
|
||||
0x160000, 0x1486BA, 0x319630, 0x20F756, 0x105F06, 0x085891, 0x16B51E, 0x0E3506,
|
||||
0x2EB5AA, 0x28EF20, 0x36F8E1, 0x2B30FE, 0x1C3225, 0x0E5FC7, 0x1DC030, 0x0CEFB7,
|
||||
0x308193, 0x4347AC, 0x2BA786, 0x3C8CE5, 0x27E000, 0x374EE7, 0x229212, 0x2B7494,
|
||||
0x308193, 0x2BA786, 0x28EF20, 0x3045D0, 0x1A0B89, 0x29494D, 0x11735D, 0x183469,
|
||||
0x26E410, 0x230039, 0x1CBF8F, 0x18FB09, 0x3D0771, 0x36ECBA, 0x390986, 0x316E52,
|
||||
0x32E000, 0x24BB33, 0x27F8E4, 0x1DB557, 0x194D09, 0x0C23BB, 0x1476A6, 0x0A2256,
|
||||
0x1C470A, 0x1637AD, 0x153E87, 0x1490FA, 0x1354B9, 0x09DAD6, 0x0E2A94, 0x08AFF0,
|
||||
},
|
||||
{
|
||||
0x1C0000, 0x26D64D, 0x3566AA, 0x4A11C2, 0x249572, 0x27190E, 0x527525, 0x44805E,
|
||||
0x1C0000, 0x1A1FD6, 0x3F1C3E, 0x29F4F9, 0x14D607, 0x0A9F44, 0x1CE683, 0x1214F0,
|
||||
0x3B72D9, 0x341911, 0x45F6F0, 0x36F889, 0x23E2BB, 0x124B5B, 0x25DD54, 0x1076E9,
|
||||
0x3DBC30, 0x55A109, 0x378F64, 0x4D1069, 0x32C000, 0x46646C, 0x2BFFB9, 0x374E8E,
|
||||
0x3DBC30, 0x378F64, 0x341911, 0x3D7020, 0x2125F5, 0x348BD6, 0x1635BC, 0x1ECE57,
|
||||
0x317F5B, 0x2C8BEB, 0x2496B6, 0x1FCB22, 0x4DAC61, 0x45E778, 0x4897C2, 0x3EE97F,
|
||||
0x40C000, 0x2EBFB5, 0x32DFAE, 0x25CF86, 0x203380, 0x0F734B, 0x1A0B5F, 0x0CE5E2,
|
||||
0x23FD53, 0x1C46DC, 0x1B09C4, 0x1A2CE1, 0x189A60, 0x0C8AE2, 0x1207A5, 0x0B0E77,
|
||||
},
|
||||
{
|
||||
0x220000, 0x2F28CC, 0x40D818, 0x59F0FE, 0x2C6C53, 0x2F79DA, 0x642089, 0x532E29,
|
||||
0x220000, 0x1FB8F1, 0x4CA24B, 0x32F29C, 0x194D09, 0x0CE5F7, 0x2317E8, 0x15F4DB,
|
||||
0x483007, 0x3F4303, 0x54F4FF, 0x42C014, 0x2B9351, 0x1636EE, 0x2DFA79, 0x13FE1A,
|
||||
0x4AF6CC, 0x67FA67, 0x437743, 0x5D93EE, 0x3DA000, 0x5579F1, 0x356D61, 0x432888,
|
||||
0x4AF6CC, 0x437743, 0x3F4303, 0x4A9A70, 0x284060, 0x3FCE60, 0x1AF81B, 0x256845,
|
||||
0x3C1AA5, 0x36179D, 0x2C6DDD, 0x269B3C, 0x5E5152, 0x54E237, 0x5825FE, 0x4C64AD,
|
||||
0x4EA000, 0x38C437, 0x3DC678, 0x2DE9B5, 0x2719F7, 0x12C2DB, 0x1FA018, 0x0FA96E,
|
||||
0x2BB39B, 0x22560C, 0x20D500, 0x1FC8C8, 0x1DE007, 0x0F3AEE, 0x15E4B7, 0x0D6CFE,
|
||||
},
|
||||
{
|
||||
0x2C0000, 0x3D079E, 0x53EA79, 0x74650C, 0x397D20, 0x3D7083, 0x819383, 0x6BA525,
|
||||
0x2C0000, 0x290D75, 0x632C61, 0x41EEAC, 0x20BE0C, 0x10B121, 0x2D6A3B, 0x1C6A0C,
|
||||
0x5D6B54, 0x51DE40, 0x6DF1C2, 0x5661FB, 0x38644B, 0x1CBF8F, 0x3B8060, 0x19DF6D,
|
||||
0x610326, 0x868F57, 0x574F0B, 0x7919CA, 0x4FC000, 0x6E9DCE, 0x452423, 0x56E928,
|
||||
0x610326, 0x574F0B, 0x51DE40, 0x608BA0, 0x341713, 0x52929A, 0x22E6BA, 0x3068D2,
|
||||
0x4DC821, 0x460071, 0x397F1E, 0x31F611, 0x7A0EE2, 0x6DD974, 0x72130C, 0x62DCA3,
|
||||
0x65C000, 0x497665, 0x4FF1C9, 0x3B6AAE, 0x329A12, 0x184776, 0x28ED4D, 0x1444AC,
|
||||
0x388E14, 0x2C6F5A, 0x2A7D0F, 0x2921F4, 0x26A973, 0x13B5AD, 0x1C5528, 0x115FDF,
|
||||
},
|
||||
};
|
||||
|
||||
static const int32_t bink_inter_quant[16][64] = {
|
||||
{
|
||||
0x010000, 0x017946, 0x01A5A9, 0x0248DC, 0x016363, 0x0152A7, 0x0243EC, 0x0209EA,
|
||||
0x012000, 0x00E248, 0x01BBDA, 0x015CBC, 0x00A486, 0x0053E0, 0x00F036, 0x008095,
|
||||
0x01B701, 0x016959, 0x01B0B9, 0x0153FD, 0x00F8E7, 0x007EE4, 0x00EA30, 0x007763,
|
||||
0x01B701, 0x0260EB, 0x019DE9, 0x023E1B, 0x017000, 0x01FE6E, 0x012DB5, 0x01A27B,
|
||||
0x01E0D1, 0x01B0B9, 0x018A33, 0x01718D, 0x00D87A, 0x014449, 0x007B9A, 0x00AB71,
|
||||
0x013178, 0x0112EA, 0x00AD08, 0x009BB9, 0x023D97, 0x020437, 0x021CCC, 0x01E6B4,
|
||||
0x018000, 0x012DB5, 0x0146D9, 0x0100CE, 0x00CFD2, 0x006E5C, 0x00B0E4, 0x005A2D,
|
||||
0x00E9CC, 0x00B7B1, 0x00846F, 0x006B85, 0x008337, 0x0042E5, 0x004A10, 0x002831,
|
||||
},
|
||||
{
|
||||
0x015555, 0x01F708, 0x023237, 0x030BD0, 0x01D9D9, 0x01C389, 0x03053B, 0x02B7E3,
|
||||
0x018000, 0x012DB5, 0x024FCE, 0x01D0FA, 0x00DB5D, 0x006FD5, 0x014048, 0x00AB71,
|
||||
0x024957, 0x01E1CC, 0x0240F7, 0x01C551, 0x014BDE, 0x00A92F, 0x013840, 0x009F2F,
|
||||
0x024957, 0x032BE4, 0x0227E1, 0x02FD7A, 0x01EAAB, 0x02A893, 0x019247, 0x022DF9,
|
||||
0x028116, 0x0240F7, 0x020D99, 0x01ECBC, 0x0120A3, 0x01B061, 0x00A4CE, 0x00E497,
|
||||
0x01974B, 0x016E8E, 0x00E6B5, 0x00CFA2, 0x02FCC9, 0x02B04A, 0x02D110, 0x0288F1,
|
||||
0x020000, 0x019247, 0x01B3CC, 0x015668, 0x011518, 0x009325, 0x00EBDA, 0x00783D,
|
||||
0x0137BB, 0x00F4ED, 0x00B093, 0x008F5C, 0x00AEF4, 0x005931, 0x0062BF, 0x003597,
|
||||
},
|
||||
{
|
||||
0x01AAAB, 0x0274CB, 0x02BEC4, 0x03CEC4, 0x02504F, 0x02346C, 0x03C689, 0x0365DC,
|
||||
0x01E000, 0x017922, 0x02E3C1, 0x024539, 0x011235, 0x008BCA, 0x01905A, 0x00D64D,
|
||||
0x02DBAD, 0x025A40, 0x02D134, 0x0236A5, 0x019ED6, 0x00D37B, 0x018650, 0x00C6FB,
|
||||
0x02DBAD, 0x03F6DD, 0x02B1D9, 0x03BCD8, 0x026555, 0x0352B8, 0x01F6D8, 0x02B977,
|
||||
0x03215C, 0x02D134, 0x029100, 0x0267EB, 0x0168CC, 0x021C7A, 0x00CE01, 0x011DBD,
|
||||
0x01FD1E, 0x01CA31, 0x012062, 0x01038A, 0x03BBFB, 0x035C5C, 0x038554, 0x032B2D,
|
||||
0x028000, 0x01F6D8, 0x0220C0, 0x01AC02, 0x015A5E, 0x00B7EF, 0x0126D1, 0x00964C,
|
||||
0x0185A9, 0x013228, 0x00DCB8, 0x00B333, 0x00DAB2, 0x006F7D, 0x007B6F, 0x0042FC,
|
||||
},
|
||||
{
|
||||
0x020000, 0x02F28D, 0x034B52, 0x0491B8, 0x02C6C5, 0x02A54E, 0x0487D8, 0x0413D5,
|
||||
0x024000, 0x01C48F, 0x0377B5, 0x02B977, 0x01490C, 0x00A7BF, 0x01E06C, 0x01012A,
|
||||
0x036E03, 0x02D2B3, 0x036172, 0x02A7FA, 0x01F1CE, 0x00FDC7, 0x01D460, 0x00EEC7,
|
||||
0x036E03, 0x04C1D6, 0x033BD1, 0x047C37, 0x02E000, 0x03FCDD, 0x025B6A, 0x0344F5,
|
||||
0x03C1A1, 0x036172, 0x031466, 0x02E31B, 0x01B0F5, 0x028892, 0x00F735, 0x0156E2,
|
||||
0x0262F1, 0x0225D5, 0x015A10, 0x013772, 0x047B2D, 0x04086E, 0x043998, 0x03CD69,
|
||||
0x030000, 0x025B6A, 0x028DB3, 0x02019B, 0x019FA3, 0x00DCB8, 0x0161C7, 0x00B45B,
|
||||
0x01D398, 0x016F63, 0x0108DD, 0x00D70A, 0x01066F, 0x0085C9, 0x00941F, 0x005062,
|
||||
},
|
||||
{
|
||||
0x02AAAB, 0x03EE11, 0x04646D, 0x0617A0, 0x03B3B2, 0x038713, 0x060A75, 0x056FC6,
|
||||
0x030000, 0x025B6A, 0x049F9B, 0x03A1F4, 0x01B6BB, 0x00DFAA, 0x028090, 0x0156E2,
|
||||
0x0492AE, 0x03C399, 0x0481ED, 0x038AA2, 0x0297BD, 0x01525F, 0x027080, 0x013E5E,
|
||||
0x0492AE, 0x0657C8, 0x044FC1, 0x05FAF4, 0x03D555, 0x055126, 0x03248D, 0x045BF2,
|
||||
0x05022D, 0x0481ED, 0x041B33, 0x03D979, 0x024147, 0x0360C3, 0x01499C, 0x01C92E,
|
||||
0x032E96, 0x02DD1C, 0x01CD6A, 0x019F43, 0x05F991, 0x056093, 0x05A220, 0x0511E1,
|
||||
0x040000, 0x03248D, 0x036799, 0x02ACCF, 0x022A2F, 0x01264B, 0x01D7B5, 0x00F079,
|
||||
0x026F75, 0x01E9D9, 0x016127, 0x011EB8, 0x015DE9, 0x00B262, 0x00C57F, 0x006B2D,
|
||||
},
|
||||
{
|
||||
0x038000, 0x052876, 0x05C3CF, 0x07FF02, 0x04DBD9, 0x04A148, 0x07EDBA, 0x0722B4,
|
||||
0x03F000, 0x0317FB, 0x06117C, 0x04C491, 0x023FD5, 0x01258F, 0x0348BD, 0x01C209,
|
||||
0x060085, 0x04F0B9, 0x05EA87, 0x04A5F5, 0x036728, 0x01BC1C, 0x0333A8, 0x01A1DB,
|
||||
0x060085, 0x085336, 0x05A8AE, 0x07D960, 0x050800, 0x06FA82, 0x041FF9, 0x05B8AE,
|
||||
0x0692DA, 0x05EA87, 0x0563B2, 0x050D6E, 0x02F5AD, 0x046F00, 0x01B09C, 0x02580C,
|
||||
0x042D25, 0x03C235, 0x025D9B, 0x022108, 0x07D78F, 0x070EC1, 0x0764CA, 0x06A777,
|
||||
0x054000, 0x041FF9, 0x0477F9, 0x0382D0, 0x02D75E, 0x018242, 0x026B1D, 0x013B9F,
|
||||
0x03324A, 0x0282ED, 0x01CF83, 0x017851, 0x01CB42, 0x00EA21, 0x010336, 0x008CAC,
|
||||
},
|
||||
{
|
||||
0x040000, 0x05E519, 0x0696A4, 0x092370, 0x058D8A, 0x054A9C, 0x090FB0, 0x0827AA,
|
||||
0x048000, 0x03891F, 0x06EF69, 0x0572EE, 0x029218, 0x014F7E, 0x03C0D8, 0x020254,
|
||||
0x06DC05, 0x05A565, 0x06C2E4, 0x054FF3, 0x03E39B, 0x01FB8E, 0x03A8C0, 0x01DD8D,
|
||||
0x06DC05, 0x0983AC, 0x0677A2, 0x08F86E, 0x05C000, 0x07F9B9, 0x04B6D4, 0x0689EB,
|
||||
0x078343, 0x06C2E4, 0x0628CC, 0x05C635, 0x0361EA, 0x051124, 0x01EE69, 0x02ADC5,
|
||||
0x04C5E1, 0x044BAA, 0x02B41F, 0x026EE5, 0x08F65A, 0x0810DD, 0x087330, 0x079AD1,
|
||||
0x060000, 0x04B6D4, 0x051B65, 0x040337, 0x033F47, 0x01B970, 0x02C38F, 0x0168B6,
|
||||
0x03A730, 0x02DEC6, 0x0211BA, 0x01AE14, 0x020CDD, 0x010B93, 0x01283E, 0x00A0C4,
|
||||
},
|
||||
{
|
||||
0x050000, 0x075E60, 0x083C4D, 0x0B6C4C, 0x06F0ED, 0x069D43, 0x0B539C, 0x0A3194,
|
||||
0x05A000, 0x046B67, 0x08AB44, 0x06CFAA, 0x03369E, 0x01A35E, 0x04B10F, 0x0282E8,
|
||||
0x089307, 0x070EBF, 0x08739C, 0x06A3F0, 0x04DC82, 0x027A72, 0x0492F0, 0x0254F0,
|
||||
0x089307, 0x0BE497, 0x08158B, 0x0B3689, 0x073000, 0x09F827, 0x05E489, 0x082C66,
|
||||
0x096413, 0x08739C, 0x07B2FF, 0x0737C2, 0x043A64, 0x06556D, 0x026A04, 0x035936,
|
||||
0x05F75A, 0x055E94, 0x036127, 0x030A9E, 0x0B33F1, 0x0A1514, 0x0A8FFC, 0x098186,
|
||||
0x078000, 0x05E489, 0x06623F, 0x050405, 0x040F19, 0x0227CC, 0x037473, 0x01C2E3,
|
||||
0x0490FC, 0x039677, 0x029629, 0x021999, 0x029015, 0x014E78, 0x01724E, 0x00C8F5,
|
||||
},
|
||||
{
|
||||
0x060000, 0x08D7A6, 0x09E1F6, 0x0DB528, 0x085450, 0x07EFEA, 0x0D9788, 0x0C3B7E,
|
||||
0x06C000, 0x054DAE, 0x0A671E, 0x082C66, 0x03DB24, 0x01F73E, 0x05A145, 0x03037D,
|
||||
0x0A4A08, 0x087818, 0x0A2455, 0x07F7ED, 0x05D569, 0x02F955, 0x057D20, 0x02CC54,
|
||||
0x0A4A08, 0x0E4582, 0x09B373, 0x0D74A5, 0x08A000, 0x0BF696, 0x07123E, 0x09CEE0,
|
||||
0x0B44E4, 0x0A2455, 0x093D32, 0x08A950, 0x0512DF, 0x0799B6, 0x02E59E, 0x0404A7,
|
||||
0x0728D2, 0x06717F, 0x040E2F, 0x03A657, 0x0D7187, 0x0C194B, 0x0CACC8, 0x0B683A,
|
||||
0x090000, 0x07123E, 0x07A918, 0x0604D2, 0x04DEEA, 0x029629, 0x042556, 0x021D11,
|
||||
0x057AC8, 0x044E28, 0x031A97, 0x02851E, 0x03134C, 0x01915C, 0x01BC5D, 0x00F126,
|
||||
},
|
||||
{
|
||||
0x080000, 0x0BCA33, 0x0D2D48, 0x1246E0, 0x0B1B15, 0x0A9538, 0x121F5F, 0x104F53,
|
||||
0x090000, 0x07123E, 0x0DDED2, 0x0AE5DD, 0x052430, 0x029EFD, 0x0781B1, 0x0404A7,
|
||||
0x0DB80B, 0x0B4ACB, 0x0D85C7, 0x0A9FE7, 0x07C736, 0x03F71D, 0x075180, 0x03BB1A,
|
||||
0x0DB80B, 0x130757, 0x0CEF44, 0x11F0DC, 0x0B8000, 0x0FF372, 0x096DA8, 0x0D13D6,
|
||||
0x0F0686, 0x0D85C7, 0x0C5198, 0x0B8C6A, 0x06C3D4, 0x0A2248, 0x03DCD3, 0x055B8A,
|
||||
0x098BC3, 0x089754, 0x05683E, 0x04DDC9, 0x11ECB4, 0x1021B9, 0x10E661, 0x0F35A3,
|
||||
0x0C0000, 0x096DA8, 0x0A36CB, 0x08066E, 0x067E8E, 0x0372E1, 0x05871E, 0x02D16B,
|
||||
0x074E60, 0x05BD8B, 0x042374, 0x035C28, 0x0419BB, 0x021726, 0x02507C, 0x014188,
|
||||
},
|
||||
{
|
||||
0x0C0000, 0x11AF4C, 0x13C3EC, 0x1B6A50, 0x10A89F, 0x0FDFD4, 0x1B2F0F, 0x1876FD,
|
||||
0x0D8000, 0x0A9B5D, 0x14CE3C, 0x1058CB, 0x07B649, 0x03EE7B, 0x0B4289, 0x0606FB,
|
||||
0x149410, 0x10F030, 0x1448AB, 0x0FEFDA, 0x0BAAD2, 0x05F2AB, 0x0AFA40, 0x0598A7,
|
||||
0x149410, 0x1C8B03, 0x1366E6, 0x1AE949, 0x114000, 0x17ED2B, 0x0E247C, 0x139DC1,
|
||||
0x1689C8, 0x1448AB, 0x127A63, 0x11529F, 0x0A25BE, 0x0F336D, 0x05CB3C, 0x08094E,
|
||||
0x0E51A4, 0x0CE2FE, 0x081C5D, 0x074CAE, 0x1AE30E, 0x183296, 0x195991, 0x16D074,
|
||||
0x120000, 0x0E247C, 0x0F5230, 0x0C09A5, 0x09BDD5, 0x052C51, 0x084AAC, 0x043A21,
|
||||
0x0AF590, 0x089C51, 0x06352E, 0x050A3B, 0x062698, 0x0322B9, 0x0378BA, 0x01E24D,
|
||||
},
|
||||
{
|
||||
0x110000, 0x190DAC, 0x1C0039, 0x26D69C, 0x17998C, 0x167D16, 0x2682AB, 0x22A891,
|
||||
0x132000, 0x0F06C3, 0x1D797F, 0x172876, 0x0AECE7, 0x0591D9, 0x0FF398, 0x0889E3,
|
||||
0x1D2717, 0x17FEEF, 0x1CBC47, 0x1693CA, 0x108754, 0x086D1D, 0x0F8D30, 0x07ED98,
|
||||
0x1D2717, 0x286F9A, 0x1B7C71, 0x261FD3, 0x187000, 0x21E552, 0x140904, 0x1BCA27,
|
||||
0x1FEDDC, 0x1CBC47, 0x1A2D62, 0x188A62, 0x0E6022, 0x1588DA, 0x083540, 0x0B6284,
|
||||
0x1448FE, 0x124192, 0x0B7D84, 0x0A574B, 0x2616FF, 0x2247AA, 0x23E98D, 0x2051FA,
|
||||
0x198000, 0x140904, 0x15B46F, 0x110DAA, 0x0DCCEE, 0x07541E, 0x0BBF1F, 0x05FD04,
|
||||
0x0F868B, 0x0C32C8, 0x08CB57, 0x0723D4, 0x08B6AD, 0x047130, 0x04EB08, 0x02AB42,
|
||||
},
|
||||
{
|
||||
0x160000, 0x206C0C, 0x243C86, 0x3242E8, 0x1E8A79, 0x1D1A59, 0x31D646, 0x2CDA25,
|
||||
0x18C000, 0x13722A, 0x2624C3, 0x1DF820, 0x0E2385, 0x073537, 0x14A4A7, 0x0B0CCC,
|
||||
0x25BA1D, 0x1F0DAE, 0x252FE4, 0x1D37BB, 0x1563D6, 0x0AE78E, 0x142021, 0x0A4288,
|
||||
0x25BA1D, 0x345430, 0x2391FB, 0x31565C, 0x1FA000, 0x2BDD7A, 0x19ED8D, 0x23F68C,
|
||||
0x2951EF, 0x252FE4, 0x21E061, 0x1FC224, 0x129A87, 0x1BDE47, 0x0A9F44, 0x0EBBBA,
|
||||
0x1A4058, 0x17A026, 0x0EDEAB, 0x0D61E9, 0x314AEF, 0x2C5CBE, 0x2E798A, 0x29D380,
|
||||
0x210000, 0x19ED8D, 0x1C16AE, 0x1611AE, 0x11DC06, 0x097BEA, 0x0F3391, 0x07BFE7,
|
||||
0x141787, 0x0FC93E, 0x0B617F, 0x093D6D, 0x0B46C1, 0x05BFA8, 0x065D55, 0x037437,
|
||||
},
|
||||
{
|
||||
0x1C0000, 0x2943B2, 0x2E1E7C, 0x3FF810, 0x26DEC9, 0x250A43, 0x3F6DCE, 0x3915A3,
|
||||
0x1F8000, 0x18BFD8, 0x308BE1, 0x262485, 0x11FEA9, 0x092C75, 0x1A45EB, 0x0E1049,
|
||||
0x300425, 0x2785C6, 0x2F5439, 0x252FA8, 0x1B393F, 0x0DE0E4, 0x199D41, 0x0D0EDC,
|
||||
0x300425, 0x4299B2, 0x2D456E, 0x3ECB00, 0x284000, 0x37D40F, 0x20FFCB, 0x2DC56D,
|
||||
0x3496D3, 0x2F5439, 0x2B1D93, 0x286B74, 0x17AD66, 0x2377FE, 0x0D84E2, 0x12C062,
|
||||
0x21692A, 0x1E11A5, 0x12ECDA, 0x110840, 0x3EBC76, 0x387608, 0x3B2652, 0x353BBA,
|
||||
0x2A0000, 0x20FFCB, 0x23BFC6, 0x1C1681, 0x16BAF1, 0x0C1213, 0x1358E8, 0x09DCF8,
|
||||
0x19924F, 0x141767, 0x0E7C16, 0x0BC28A, 0x0E5A0D, 0x075104, 0x0819B2, 0x04655D,
|
||||
},
|
||||
{
|
||||
0x220000, 0x321B58, 0x380072, 0x4DAD38, 0x2F3318, 0x2CFA2D, 0x4D0556, 0x455122,
|
||||
0x264000, 0x1E0D86, 0x3AF2FE, 0x2E50EB, 0x15D9CE, 0x0B23B2, 0x1FE730, 0x1113C7,
|
||||
0x3A4E2D, 0x2FFDDF, 0x39788E, 0x2D2795, 0x210EA8, 0x10DA39, 0x1F1A61, 0x0FDB2F,
|
||||
0x3A4E2D, 0x50DF33, 0x36F8E1, 0x4C3FA5, 0x30E000, 0x43CAA5, 0x281209, 0x37944D,
|
||||
0x3FDBB7, 0x39788E, 0x345AC4, 0x3114C3, 0x1CC044, 0x2B11B4, 0x106A80, 0x16C509,
|
||||
0x2891FC, 0x248324, 0x16FB08, 0x14AE97, 0x4C2DFD, 0x448F54, 0x47D31B, 0x40A3F5,
|
||||
0x330000, 0x281209, 0x2B68DF, 0x221B53, 0x1B99DB, 0x0EA83B, 0x177E3E, 0x0BFA09,
|
||||
0x1F0D17, 0x18658F, 0x1196AE, 0x0E47A8, 0x116D5A, 0x08E260, 0x09D60F, 0x055684,
|
||||
},
|
||||
{
|
||||
0x2C0000, 0x40D818, 0x48790C, 0x6485D0, 0x3D14F2, 0x3A34B2, 0x63AC8D, 0x59B44A,
|
||||
0x318000, 0x26E454, 0x4C4986, 0x3BF03F, 0x1C470A, 0x0E6A6E, 0x29494D, 0x161998,
|
||||
0x4B743A, 0x3E1B5C, 0x4A5FC7, 0x3A6F75, 0x2AC7AC, 0x15CF1D, 0x284041, 0x148510,
|
||||
0x4B743A, 0x68A861, 0x4723F6, 0x62ACB8, 0x3F4000, 0x57BAF3, 0x33DB1A, 0x47ED19,
|
||||
0x52A3DE, 0x4A5FC7, 0x43C0C2, 0x3F8448, 0x25350D, 0x37BC8E, 0x153E87, 0x1D7775,
|
||||
0x3480B0, 0x2F404C, 0x1DBD56, 0x1AC3D2, 0x6295DE, 0x58B97B, 0x5CF313, 0x53A701,
|
||||
0x420000, 0x33DB1A, 0x382D5C, 0x2C235D, 0x23B80D, 0x12F7D4, 0x1E6723, 0x0F7FCF,
|
||||
0x282F0E, 0x1F927D, 0x16C2FF, 0x127AD9, 0x168D83, 0x0B7F50, 0x0CBAAA, 0x06E86E,
|
||||
},
|
||||
};
|
||||
|
||||
static const uint8_t binkb_runbits[64] = {
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
4, 4, 4, 4, 4, 4, 4, 4,
|
||||
3, 3, 3, 3, 2, 2, 1, 0,
|
||||
};
|
||||
|
||||
static const uint8_t binkb_intra_seed[64] = {
|
||||
16, 16, 16, 19, 16, 19, 22, 22,
|
||||
22, 22, 26, 24, 26, 22, 22, 27,
|
||||
27, 27, 26, 26, 26, 29, 29, 29,
|
||||
27, 27, 27, 26, 34, 34, 34, 29,
|
||||
29, 29, 27, 27, 37, 34, 34, 32,
|
||||
32, 29, 29, 38, 37, 35, 35, 34,
|
||||
35, 40, 40, 40, 38, 38, 48, 48,
|
||||
46, 46, 58, 56, 56, 69, 69, 83,
|
||||
};
|
||||
|
||||
static const uint8_t binkb_inter_seed[64] = {
|
||||
16, 17, 17, 18, 18, 18, 19, 19,
|
||||
19, 19, 20, 20, 20, 20, 20, 21,
|
||||
21, 21, 21, 21, 21, 22, 22, 22,
|
||||
22, 22, 22, 22, 23, 23, 23, 23,
|
||||
23, 23, 23, 23, 24, 24, 24, 25,
|
||||
24, 24, 24, 25, 26, 26, 26, 26,
|
||||
25, 27, 27, 27, 27, 27, 28, 28,
|
||||
28, 28, 30, 30, 30, 31, 31, 33,
|
||||
};
|
||||
|
||||
static const uint8_t binkb_num[16] = {
|
||||
1, 4, 5, 2, 7, 8, 3, 7, 4, 9, 5, 6, 7, 8, 9, 10
|
||||
};
|
||||
|
||||
static const uint8_t binkb_den[16] = {
|
||||
1, 3, 3, 1, 3, 3, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_BINKDATA_H */
|
52
neo/libs/libbinkdec/include/dct.h
Normal file
52
neo/libs/libbinkdec/include/dct.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* (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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_DCT_H
|
||||
#define AVCODEC_DCT_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_mmx(DCTContext *s);
|
||||
|
||||
#endif /* AVCODEC_DCT_H */
|
25
neo/libs/libbinkdec/include/dct32.h
Normal file
25
neo/libs/libbinkdec/include/dct32.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* This file is part of Libav.
|
||||
*
|
||||
* Libav 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.
|
||||
*
|
||||
* Libav 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 Libav; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_DCT32_H
|
||||
#define AVCODEC_DCT32_H
|
||||
|
||||
void ff_dct32_float(float *dst, const float *src);
|
||||
void ff_dct32_fixed(int *dst, const int *src);
|
||||
|
||||
#endif
|
75
neo/libs/libbinkdec/include/fft-internal.h
Normal file
75
neo/libs/libbinkdec/include/fft-internal.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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_FFT_INTERNAL_H
|
||||
#define AVCODEC_FFT_INTERNAL_H
|
||||
|
||||
#if CONFIG_FFT_FLOAT
|
||||
|
||||
#define FIX15(v) (v)
|
||||
#define sqrthalf (float)M_SQRT1_2
|
||||
|
||||
#define BF(x, y, a, b) do { \
|
||||
x = a - b; \
|
||||
y = a + b; \
|
||||
} while (0)
|
||||
|
||||
#define CMUL(dre, dim, are, aim, bre, bim) do { \
|
||||
(dre) = (are) * (bre) - (aim) * (bim); \
|
||||
(dim) = (are) * (bim) + (aim) * (bre); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#include "libavutil/intmath.h"
|
||||
#include "mathops.h"
|
||||
|
||||
void ff_mdct_calcw_c(FFTContext *s, FFTDouble *output, const FFTSample *input);
|
||||
|
||||
#define SCALE_FLOAT(a, bits) lrint((a) * (double)(1 << (bits)))
|
||||
#define FIX15(a) av_clip(SCALE_FLOAT(a, 15), -32767, 32767)
|
||||
|
||||
#define sqrthalf ((int16_t)((1<<15)*M_SQRT1_2))
|
||||
|
||||
#define BF(x, y, a, b) do { \
|
||||
x = (a - b) >> 1; \
|
||||
y = (a + b) >> 1; \
|
||||
} while (0)
|
||||
|
||||
#define CMULS(dre, dim, are, aim, bre, bim, sh) do { \
|
||||
(dre) = (MUL16(are, bre) - MUL16(aim, bim)) >> sh; \
|
||||
(dim) = (MUL16(are, bim) + MUL16(aim, bre)) >> sh; \
|
||||
} while (0)
|
||||
|
||||
#define CMUL(dre, dim, are, aim, bre, bim) \
|
||||
CMULS(dre, dim, are, aim, bre, bim, 15)
|
||||
|
||||
#define CMULL(dre, dim, are, aim, bre, bim) \
|
||||
CMULS(dre, dim, are, aim, bre, bim, 0)
|
||||
|
||||
#endif /* CONFIG_FFT_FLOAT */
|
||||
|
||||
#define ff_imdct_calc_c FFT_NAME(ff_imdct_calc_c)
|
||||
#define ff_imdct_half_c FFT_NAME(ff_imdct_half_c)
|
||||
#define ff_mdct_calc_c FFT_NAME(ff_mdct_calc_c)
|
||||
|
||||
void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void ff_mdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
|
||||
#endif /* AVCODEC_FFT_INTERNAL_H */
|
160
neo/libs/libbinkdec/include/fft.h
Normal file
160
neo/libs/libbinkdec/include/fft.h
Normal file
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out header includes for
|
||||
* 'config.h' and 'libavutil/mem.h', which are both part of FFmpeg but are not present in this project. This
|
||||
* file has also been modified to add an include for 'FFmpeg_includes.h' which includes the functionality from
|
||||
* the removed header files this file is otherwise identical to the FFmpeg release.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_FFT_H
|
||||
#define AVCODEC_FFT_H
|
||||
|
||||
#ifndef CONFIG_FFT_FLOAT
|
||||
#define CONFIG_FFT_FLOAT 1
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
//#include "config.h"
|
||||
//#include "libavutil/mem.h"
|
||||
#include "FFmpeg_includes.h"
|
||||
|
||||
#if CONFIG_FFT_FLOAT
|
||||
|
||||
#include "avfft.h"
|
||||
|
||||
#define FFT_NAME(x) x
|
||||
|
||||
typedef float FFTDouble;
|
||||
|
||||
#else
|
||||
|
||||
#define FFT_NAME(x) x ## _fixed
|
||||
|
||||
typedef int16_t FFTSample;
|
||||
typedef int FFTDouble;
|
||||
|
||||
typedef struct FFTComplex {
|
||||
int16_t re, im;
|
||||
} FFTComplex;
|
||||
|
||||
typedef struct FFTContext FFTContext;
|
||||
|
||||
#endif /* CONFIG_FFT_FLOAT */
|
||||
|
||||
typedef struct FFTDComplex {
|
||||
FFTDouble re, im;
|
||||
} FFTDComplex;
|
||||
|
||||
/* FFT computation */
|
||||
|
||||
struct FFTContext {
|
||||
int nbits;
|
||||
int inverse;
|
||||
uint16_t *revtab;
|
||||
FFTComplex *tmp_buf;
|
||||
int mdct_size; /* size of MDCT (i.e. number of input data * 2) */
|
||||
int mdct_bits; /* n = 2^nbits */
|
||||
/* pre/post rotation tables */
|
||||
FFTSample *tcos;
|
||||
FFTSample *tsin;
|
||||
/**
|
||||
* Do the permutation needed BEFORE calling fft_calc().
|
||||
*/
|
||||
void (*fft_permute)(struct FFTContext *s, FFTComplex *z);
|
||||
/**
|
||||
* Do a complex FFT with the parameters defined in ff_fft_init(). The
|
||||
* input data must be permuted before. No 1.0/sqrt(n) normalization is done.
|
||||
*/
|
||||
void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
|
||||
void (*imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void (*imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void (*mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||
void (*mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input);
|
||||
int fft_permutation;
|
||||
#define FF_FFT_PERM_DEFAULT 0
|
||||
#define FF_FFT_PERM_SWAP_LSBS 1
|
||||
#define FF_FFT_PERM_AVX 2
|
||||
int mdct_permutation;
|
||||
#define FF_MDCT_PERM_NONE 0
|
||||
#define FF_MDCT_PERM_INTERLEAVE 1
|
||||
};
|
||||
|
||||
#if CONFIG_HARDCODED_TABLES
|
||||
#define COSTABLE_CONST const
|
||||
#else
|
||||
#define COSTABLE_CONST
|
||||
#endif
|
||||
|
||||
#define COSTABLE(size) \
|
||||
COSTABLE_CONST DECLARE_ALIGNED(32, FFTSample, FFT_NAME(ff_cos_##size))[size/2]
|
||||
|
||||
extern COSTABLE(16);
|
||||
extern COSTABLE(32);
|
||||
extern COSTABLE(64);
|
||||
extern COSTABLE(128);
|
||||
extern COSTABLE(256);
|
||||
extern COSTABLE(512);
|
||||
extern COSTABLE(1024);
|
||||
extern COSTABLE(2048);
|
||||
extern COSTABLE(4096);
|
||||
extern COSTABLE(8192);
|
||||
extern COSTABLE(16384);
|
||||
extern COSTABLE(32768);
|
||||
extern COSTABLE(65536);
|
||||
extern COSTABLE_CONST FFTSample* const FFT_NAME(ff_cos_tabs)[17];
|
||||
|
||||
#define ff_init_ff_cos_tabs FFT_NAME(ff_init_ff_cos_tabs)
|
||||
|
||||
/**
|
||||
* Initialize the cosine table in ff_cos_tabs[index]
|
||||
* @param index index in ff_cos_tabs array of the table to initialize
|
||||
*/
|
||||
void ff_init_ff_cos_tabs(int index);
|
||||
|
||||
#define ff_fft_init FFT_NAME(ff_fft_init)
|
||||
#define ff_fft_end FFT_NAME(ff_fft_end)
|
||||
|
||||
/**
|
||||
* Set up a complex FFT.
|
||||
* @param nbits log2 of the length of the input array
|
||||
* @param inverse if 0 perform the forward transform, if 1 perform the inverse
|
||||
*/
|
||||
int ff_fft_init(FFTContext *s, int nbits, int inverse);
|
||||
|
||||
#if CONFIG_FFT_FLOAT
|
||||
void ff_fft_init_altivec(FFTContext *s);
|
||||
void ff_fft_init_mmx(FFTContext *s);
|
||||
void ff_fft_init_arm(FFTContext *s);
|
||||
#else
|
||||
void ff_fft_fixed_init_arm(FFTContext *s);
|
||||
#endif
|
||||
|
||||
void ff_fft_end(FFTContext *s);
|
||||
|
||||
#define ff_mdct_init FFT_NAME(ff_mdct_init)
|
||||
#define ff_mdct_end FFT_NAME(ff_mdct_end)
|
||||
|
||||
int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
|
||||
void ff_mdct_end(FFTContext *s);
|
||||
|
||||
#endif /* AVCODEC_FFT_H */
|
80
neo/libs/libbinkdec/include/rdft.h
Normal file
80
neo/libs/libbinkdec/include/rdft.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out an include for header 'config.h' which
|
||||
* is part of the FFmpeg project. This file is not available in this project and has therefore been unreferenced. This file is
|
||||
* identical to the original FFmpeg release otherwise.
|
||||
*/
|
||||
|
||||
/*
|
||||
* (I)RDFT transforms
|
||||
* Copyright (c) 2009 Alex Converse <alex dot converse at gmail dot 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_RDFT_H
|
||||
#define AVCODEC_RDFT_H
|
||||
|
||||
//#include "config.h"
|
||||
#include "fft.h"
|
||||
|
||||
#if CONFIG_HARDCODED_TABLES
|
||||
# define SINTABLE_CONST const
|
||||
#else
|
||||
# define SINTABLE_CONST
|
||||
#endif
|
||||
|
||||
#define SINTABLE(size) \
|
||||
SINTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_sin_##size)[size/2]
|
||||
|
||||
extern SINTABLE(16);
|
||||
extern SINTABLE(32);
|
||||
extern SINTABLE(64);
|
||||
extern SINTABLE(128);
|
||||
extern SINTABLE(256);
|
||||
extern SINTABLE(512);
|
||||
extern SINTABLE(1024);
|
||||
extern SINTABLE(2048);
|
||||
extern SINTABLE(4096);
|
||||
extern SINTABLE(8192);
|
||||
extern SINTABLE(16384);
|
||||
extern SINTABLE(32768);
|
||||
extern SINTABLE(65536);
|
||||
|
||||
struct RDFTContext {
|
||||
int nbits;
|
||||
int inverse;
|
||||
int sign_convention;
|
||||
|
||||
/* pre/post rotation tables */
|
||||
const FFTSample *tcos;
|
||||
SINTABLE_CONST FFTSample *tsin;
|
||||
FFTContext fft;
|
||||
void (*rdft_calc)(struct RDFTContext *s, FFTSample *z);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set up a real FFT.
|
||||
* @param nbits log2 of the length of the input array
|
||||
* @param trans the type of transform
|
||||
*/
|
||||
int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans);
|
||||
void ff_rdft_end(RDFTContext *s);
|
||||
|
||||
void ff_rdft_init_arm(RDFTContext *s);
|
||||
|
||||
|
||||
#endif /* AVCODEC_RDFT_H */
|
379
neo/libs/libbinkdec/src/BinkAudio.cpp
Normal file
379
neo/libs/libbinkdec/src/BinkAudio.cpp
Normal file
|
@ -0,0 +1,379 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* below is the license from FFmpeg
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (c) 2009 Konstantin Shishkov
|
||||
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
*
|
||||
* 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 "BinkDecoder.h"
|
||||
#include "BinkAudio.h"
|
||||
#include "Util.h"
|
||||
#include <algorithm> // DG: for std::min/max
|
||||
|
||||
const int kAudio16Bits = 0x4000;
|
||||
const int kAudioStereo = 0x2000;
|
||||
const int kAudioUseDCT = 0x1000;
|
||||
|
||||
const int kNumBands = 25;
|
||||
|
||||
/**
|
||||
* Clip a signed integer value into the -32768,32767 range.
|
||||
* @param a value to clip
|
||||
* @return clipped value
|
||||
*/
|
||||
static /*av_always_inline*/ const int16_t av_clip_int16_c(int a)
|
||||
{
|
||||
if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
|
||||
else return a;
|
||||
}
|
||||
|
||||
static /*av_always_inline*/ int float_to_int16_one(const float *src){
|
||||
return av_clip_int16_c((int)(*src));
|
||||
}
|
||||
|
||||
// from fmtconvert.c
|
||||
static void float_to_int16_interleave_c(int16_t *dst, const float **src, long len, int channels)
|
||||
{
|
||||
if (channels==2)
|
||||
{
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
dst[2*i] = float_to_int16_one(src[0] + i);
|
||||
dst[2*i+1] = float_to_int16_one(src[1] + i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int c = 0; c < channels; c++)
|
||||
{
|
||||
for (int i = 0, j = c; i < len; i++, j += channels)
|
||||
dst[j] = float_to_int16_one(src[c] + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float BinkDecoder::GetAudioFloat(BinkCommon::BitReader &bits)
|
||||
{
|
||||
int power = bits.GetBits(5);
|
||||
float f = ldexpf((float)bits.GetBits(23), power - 23);
|
||||
if (bits.GetBit())
|
||||
f = -f;
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
bool BinkDecoder::CreateAudioTrack(uint32_t sampleRate, uint16_t flags)
|
||||
{
|
||||
AudioTrack *track = new AudioTrack;
|
||||
|
||||
// determine frame length
|
||||
uint32_t frameLenBits, nChannels;
|
||||
|
||||
if (sampleRate < 22050) {
|
||||
frameLenBits = 9;
|
||||
}
|
||||
else if (sampleRate < 44100) {
|
||||
frameLenBits = 10;
|
||||
}
|
||||
else {
|
||||
frameLenBits = 11;
|
||||
}
|
||||
|
||||
// check nunber of channels
|
||||
if (flags & kAudioStereo) {
|
||||
nChannels = 2;
|
||||
}
|
||||
else {
|
||||
nChannels = 1;
|
||||
}
|
||||
|
||||
track->nChannelsReal = nChannels;
|
||||
|
||||
if (flags & kAudioUseDCT)
|
||||
{
|
||||
track->transformType = kTransformTypeDCT;
|
||||
}
|
||||
else
|
||||
{
|
||||
track->transformType = kTransformTypeRDFT;
|
||||
|
||||
// audio is already interleaved for the RDFT format variant
|
||||
sampleRate *= nChannels;
|
||||
frameLenBits += av_log2_c(nChannels);
|
||||
nChannels = 1;
|
||||
}
|
||||
|
||||
int frameLength = 1 << frameLenBits;
|
||||
int overlapLength = frameLength / 16;
|
||||
int blockSize = (frameLength - overlapLength) * nChannels;
|
||||
|
||||
int sampleRateHalf = (sampleRate + 1) / 2;
|
||||
float root = 2.0f / sqrt((float)frameLength);
|
||||
|
||||
uint32_t nBands = 0;
|
||||
|
||||
// calculate number of bands
|
||||
for (nBands = 1; nBands < kNumBands; nBands++)
|
||||
{
|
||||
if (sampleRateHalf <= criticalFrequencies[nBands - 1])
|
||||
break;
|
||||
}
|
||||
|
||||
track->bands.resize(nBands + 1);
|
||||
|
||||
// populate bands data
|
||||
track->bands[0] = 2;
|
||||
|
||||
for (uint32_t i = 1; i < nBands; i++)
|
||||
{
|
||||
track->bands[i] = (criticalFrequencies[i - 1] * frameLength / sampleRateHalf) & ~1;
|
||||
}
|
||||
|
||||
track->bands[nBands] = frameLength;
|
||||
|
||||
// initialise coefficients pointer array
|
||||
for (uint32_t i = 0; i < nChannels; i++)
|
||||
{
|
||||
track->coeffsPtr[i] = track->coeffs + i * frameLength;
|
||||
}
|
||||
|
||||
if (kTransformTypeRDFT == track->transformType)
|
||||
ff_rdft_init(&track->trans.rdft, frameLenBits, DFT_C2R);
|
||||
else if (kTransformTypeDCT == track->transformType)
|
||||
ff_dct_init(&track->trans.dct, frameLenBits, DCT_III);
|
||||
else
|
||||
return false;
|
||||
|
||||
track->blockBufferSize = frameLength * nChannels * sizeof(int16_t);
|
||||
track->blockBuffer = new int16_t[track->blockBufferSize];
|
||||
|
||||
track->blockSize = blockSize;
|
||||
track->frameLenBits = frameLenBits;
|
||||
track->frameLength = frameLength;
|
||||
track->nBands = nBands;
|
||||
track->nChannels = nChannels;
|
||||
track->overlapLength = overlapLength;
|
||||
track->root = root;
|
||||
track->sampleRate = sampleRate;
|
||||
track->sampleRateHalf = sampleRateHalf;
|
||||
track->first = true;
|
||||
|
||||
// should contain entire frames worth of audio when frame is decoded
|
||||
track->bufferSize = 0;
|
||||
track->buffer = 0;
|
||||
track->bytesReadThisFrame = 0;
|
||||
|
||||
// add the track to the track vector
|
||||
audioTracks.push_back(track);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void BinkDecoder::AudioPacket(uint32_t trackIndex, uint32_t packetSize)
|
||||
{
|
||||
// create a temp bit reader for this packet
|
||||
BinkCommon::BitReader bits(file, packetSize);
|
||||
|
||||
AudioTrack *track = audioTracks[trackIndex];
|
||||
|
||||
uint8_t *bufferPtr = track->buffer;
|
||||
|
||||
// each call to DecodeAudioBlock should produce this many bytes
|
||||
uint32_t bytesDone = track->blockSize * 2;
|
||||
|
||||
while (bits.GetPosition() < bits.GetSize())
|
||||
{
|
||||
DecodeAudioBlock(trackIndex, bits);
|
||||
|
||||
memcpy(bufferPtr, track->blockBuffer, std::min(track->bufferSize - track->bytesReadThisFrame, bytesDone));
|
||||
bufferPtr += bytesDone;
|
||||
|
||||
track->bytesReadThisFrame += bytesDone;
|
||||
|
||||
// align to a 32 bit boundary
|
||||
int n = (-(int)bits.GetPosition()) & 31;
|
||||
if (n) bits.SkipBits(n);
|
||||
}
|
||||
}
|
||||
|
||||
void BinkDecoder::DecodeAudioBlock(uint32_t trackIndex, BinkCommon::BitReader &bits)
|
||||
{
|
||||
int i, j, k;
|
||||
float q, quant[25];
|
||||
int width, coeff;
|
||||
|
||||
AudioTrack *track = audioTracks[trackIndex];
|
||||
|
||||
int16_t *out = track->blockBuffer;
|
||||
|
||||
if (kTransformTypeDCT == track->transformType)
|
||||
bits.SkipBits(2);
|
||||
|
||||
for (uint32_t ch = 0; ch < track->nChannels; ch++)
|
||||
{
|
||||
float *coeffs = track->coeffsPtr[ch];
|
||||
|
||||
coeffs[0] = GetAudioFloat(bits) * track->root;
|
||||
coeffs[1] = GetAudioFloat(bits) * track->root;
|
||||
|
||||
for (uint32_t b = 0; b < track->nBands; b++)
|
||||
{
|
||||
/* constant is result of 0.066399999/log10(M_E) */
|
||||
int value = bits.GetBits(8);
|
||||
quant[b] = expf(std::min(value, (int)95) * 0.15289164787221953823f) * track->root;
|
||||
}
|
||||
|
||||
k = 0;
|
||||
q = quant[0];
|
||||
|
||||
// parse coefficients
|
||||
i = 2;
|
||||
while (i < track->frameLength)
|
||||
{
|
||||
if (bits.GetBit())
|
||||
{
|
||||
j = i + RLEentries[bits.GetBits(4)] * 8;
|
||||
} else {
|
||||
j = i + 8;
|
||||
}
|
||||
|
||||
j = std::min(j, track->frameLength);
|
||||
|
||||
width = bits.GetBits(4);
|
||||
if (width == 0)
|
||||
{
|
||||
memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
|
||||
i = j;
|
||||
while (track->bands[k] < i)
|
||||
q = quant[k++];
|
||||
}
|
||||
else
|
||||
{
|
||||
while (i < j)
|
||||
{
|
||||
if (track->bands[k] == i)
|
||||
q = quant[k++];
|
||||
coeff = bits.GetBits(width);
|
||||
if (coeff)
|
||||
{
|
||||
if (bits.GetBit())
|
||||
coeffs[i] = -q * coeff;
|
||||
else
|
||||
coeffs[i] = q * coeff;
|
||||
}
|
||||
else
|
||||
{
|
||||
coeffs[i] = 0.0f;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (kTransformTypeRDFT == track->transformType)
|
||||
{
|
||||
track->trans.rdft.rdft_calc(&track->trans.rdft, coeffs);
|
||||
}
|
||||
else if (kTransformTypeDCT == track->transformType)
|
||||
{
|
||||
coeffs[0] /= 0.5f;
|
||||
track->trans.dct.dct_calc(&track->trans.dct, coeffs);
|
||||
|
||||
float mul = track->frameLength;
|
||||
|
||||
// vector_fmul_scalar()
|
||||
for (int i = 0; i < track->frameLength; i++)
|
||||
coeffs[i] = coeffs[i] * mul;
|
||||
}
|
||||
}
|
||||
|
||||
float_to_int16_interleave_c(out, (const float **)track->coeffsPtr, track->frameLength, track->nChannels);
|
||||
|
||||
if (!track->first) {
|
||||
int count = track->overlapLength * track->nChannels;
|
||||
int shift = av_log2_c(count);
|
||||
for (i = 0; i < count; i++) {
|
||||
out[i] = (track->previous[i] * (count - i) + out[i] * i) >> shift;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(track->previous, out + track->blockSize, track->overlapLength * track->nChannels * sizeof(*out));
|
||||
|
||||
track->first = false;
|
||||
}
|
||||
|
||||
uint32_t BinkDecoder::GetNumAudioTracks()
|
||||
{
|
||||
return audioTracks.size();
|
||||
}
|
||||
|
||||
AudioInfo BinkDecoder::GetAudioTrackDetails(uint32_t trackIndex)
|
||||
{
|
||||
AudioInfo info;
|
||||
AudioTrack *track = audioTracks[trackIndex];
|
||||
|
||||
info.sampleRate = track->sampleRate;
|
||||
info.nChannels = track->nChannelsReal;
|
||||
|
||||
// undo sample rate adjustment we do internally for RDFT audio
|
||||
if (kTransformTypeRDFT == track->transformType)
|
||||
{
|
||||
info.sampleRate /= track->nChannelsReal;
|
||||
}
|
||||
|
||||
// audio buffer size in bytes
|
||||
info.idealBufferSize = track->bufferSize;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
uint32_t BinkDecoder::GetAudioData(uint32_t trackIndex, int16_t *audioBuffer)
|
||||
{
|
||||
if (!audioBuffer)
|
||||
return 0;
|
||||
|
||||
AudioTrack *track = audioTracks[trackIndex];
|
||||
|
||||
if (track->bytesReadThisFrame)
|
||||
memcpy(audioBuffer, track->buffer, std::min(track->bufferSize, track->bytesReadThisFrame));
|
||||
|
||||
return track->bytesReadThisFrame;
|
||||
}
|
420
neo/libs/libbinkdec/src/BinkDecoder.cpp
Normal file
420
neo/libs/libbinkdec/src/BinkDecoder.cpp
Normal file
|
@ -0,0 +1,420 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* below is the license from FFmpeg
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* Bink video decoder
|
||||
* Copyright (c) 2009 Konstantin Shishkov
|
||||
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
|
||||
*
|
||||
* 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 "BinkDecoder.h"
|
||||
#include "LogError.h"
|
||||
#include "FFmpeg_includes.h"
|
||||
|
||||
std::vector<class BinkDecoder*> classInstances;
|
||||
|
||||
BinkHandle Bink_Open(const char* fileName)
|
||||
{
|
||||
BinkHandle newHandle;
|
||||
newHandle.isValid = false;
|
||||
newHandle.instanceIndex = -1;
|
||||
|
||||
BinkDecoder *newDecoder = new BinkDecoder();
|
||||
if (!newDecoder->Open(fileName))
|
||||
{
|
||||
delete newDecoder;
|
||||
return newHandle;
|
||||
}
|
||||
|
||||
// loaded ok, make handle valid
|
||||
newHandle.isValid = true;
|
||||
#if 0
|
||||
// find a free slot if available
|
||||
for (int i = 0; i < classInstances.size(); i++)
|
||||
{
|
||||
if (!classInstances[i])
|
||||
{
|
||||
class
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// add instance to global instance vector
|
||||
classInstances.push_back(newDecoder);
|
||||
|
||||
// get a handle ID
|
||||
newHandle.instanceIndex = classInstances.size() - 1;
|
||||
|
||||
return newHandle;
|
||||
}
|
||||
|
||||
void Bink_Close(BinkHandle &handle)
|
||||
{
|
||||
if (!classInstances.at(handle.instanceIndex))
|
||||
{
|
||||
// invalid handle
|
||||
return;
|
||||
}
|
||||
|
||||
// close bink decoder
|
||||
delete classInstances[handle.instanceIndex];
|
||||
classInstances[handle.instanceIndex] = 0;
|
||||
|
||||
handle.instanceIndex = -1;
|
||||
handle.isValid = false;
|
||||
}
|
||||
|
||||
uint32_t Bink_GetNumAudioTracks(BinkHandle &handle)
|
||||
{
|
||||
if (handle.instanceIndex == -1)
|
||||
return 0;
|
||||
else
|
||||
return classInstances[handle.instanceIndex]->GetNumAudioTracks();
|
||||
}
|
||||
|
||||
AudioInfo Bink_GetAudioTrackDetails(BinkHandle &handle, uint32_t trackIndex)
|
||||
{
|
||||
return classInstances[handle.instanceIndex]->GetAudioTrackDetails(trackIndex);
|
||||
}
|
||||
|
||||
/* Get a frame's worth of audio data.
|
||||
*
|
||||
* 'data' needs to be a pointer to allocated memory that this function will fill.
|
||||
* You can find the size (in bytes) to make this buffer by calling Bink_GetAudioTrackDetails()
|
||||
* and checking the 'idealBufferSize' member in the returned AudioInfo struct
|
||||
*/
|
||||
uint32_t Bink_GetAudioData(BinkHandle &handle, uint32_t trackIndex, int16_t *data)
|
||||
{
|
||||
return classInstances[handle.instanceIndex]->GetAudioData(trackIndex, data);
|
||||
}
|
||||
|
||||
uint32_t Bink_GetNumFrames(BinkHandle &handle)
|
||||
{
|
||||
return classInstances[handle.instanceIndex]->GetNumFrames();
|
||||
}
|
||||
|
||||
void Bink_GetFrameSize(BinkHandle &handle, uint32_t &width, uint32_t &height)
|
||||
{
|
||||
width = classInstances[handle.instanceIndex]->frameWidth;
|
||||
height = classInstances[handle.instanceIndex]->frameHeight;
|
||||
}
|
||||
|
||||
uint32_t Bink_GetCurrentFrameNum(BinkHandle &handle)
|
||||
{
|
||||
return classInstances[handle.instanceIndex]->GetCurrentFrameNum();
|
||||
}
|
||||
|
||||
uint32_t Bink_GetNextFrame(BinkHandle &handle, YUVbuffer yuv)
|
||||
{
|
||||
BinkDecoder *decoder = classInstances[handle.instanceIndex];
|
||||
|
||||
uint32_t frameIndex = decoder->GetCurrentFrameNum();
|
||||
|
||||
decoder->GetNextFrame(yuv);
|
||||
|
||||
return frameIndex;
|
||||
}
|
||||
|
||||
float Bink_GetFrameRate(BinkHandle &handle)
|
||||
{
|
||||
return classInstances[handle.instanceIndex]->GetFrameRate();
|
||||
}
|
||||
|
||||
void Bink_GotoFrame(BinkHandle &handle, uint32_t frameNum)
|
||||
{
|
||||
classInstances[handle.instanceIndex]->GotoFrame(frameNum);
|
||||
}
|
||||
|
||||
BinkDecoder::BinkDecoder()
|
||||
{
|
||||
nFrames = 0;
|
||||
currentFrame = 0;
|
||||
}
|
||||
|
||||
BinkDecoder::~BinkDecoder()
|
||||
{
|
||||
for (uint32_t i = 0; i < planes.size(); i++)
|
||||
{
|
||||
delete[] planes[i].current;
|
||||
delete[] planes[i].last;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < audioTracks.size(); i++)
|
||||
{
|
||||
delete[] audioTracks[i]->buffer;
|
||||
delete[] audioTracks[i]->blockBuffer;
|
||||
|
||||
if (kTransformTypeRDFT == audioTracks[i]->transformType)
|
||||
ff_rdft_end(&audioTracks[i]->trans.rdft);
|
||||
else if (kTransformTypeDCT == audioTracks[i]->transformType)
|
||||
ff_dct_end(&audioTracks[i]->trans.dct);
|
||||
|
||||
delete audioTracks[i];
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t BinkDecoder::GetNumFrames()
|
||||
{
|
||||
return nFrames;
|
||||
}
|
||||
|
||||
uint32_t BinkDecoder::GetCurrentFrameNum()
|
||||
{
|
||||
return currentFrame;
|
||||
}
|
||||
|
||||
float BinkDecoder::GetFrameRate()
|
||||
{
|
||||
return (float)fpsDividend / (float)fpsDivider;
|
||||
}
|
||||
|
||||
void BinkDecoder::GotoFrame(uint32_t frameNum)
|
||||
{
|
||||
// seek to the desired frame (just set currentFrame)
|
||||
currentFrame = frameNum;
|
||||
|
||||
// what else? (memset some stuff?)
|
||||
}
|
||||
|
||||
bool BinkDecoder::Open(const std::string &fileName)
|
||||
{
|
||||
// open the file (read only)
|
||||
file.Open(fileName);
|
||||
if (!file.Is_Open())
|
||||
{
|
||||
BinkCommon::LogError("Can't open file " + fileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
// check the file signature
|
||||
signature = file.ReadUint32BE();
|
||||
if ((signature != kBIKfID)
|
||||
&& (signature != kBIKgID)
|
||||
&& (signature != kBIKhID)
|
||||
&& (signature != kBIKiID))
|
||||
{
|
||||
BinkCommon::LogError("Unknown Bink signature");
|
||||
return false;
|
||||
}
|
||||
|
||||
fileSize = file.ReadUint32LE() + 8;
|
||||
|
||||
nFrames = file.ReadUint32LE();
|
||||
|
||||
if (nFrames > 1000000)
|
||||
{
|
||||
BinkCommon::LogError("Invalid header, more than 1000000 frames");
|
||||
return false;
|
||||
}
|
||||
|
||||
largestFrameSize = file.ReadUint32LE();
|
||||
if (largestFrameSize > fileSize)
|
||||
{
|
||||
BinkCommon::LogError("Largest frame size is greater than file size");
|
||||
return false;
|
||||
}
|
||||
|
||||
// skip some unknown data
|
||||
file.Skip(4);
|
||||
|
||||
frameWidth = file.ReadUint32LE();
|
||||
frameHeight = file.ReadUint32LE();
|
||||
fpsDividend = file.ReadUint32LE();
|
||||
fpsDivider = file.ReadUint32LE();
|
||||
videoFlags = file.ReadUint32LE();
|
||||
|
||||
nAudioTracks = file.ReadUint32LE();
|
||||
|
||||
// audio is available
|
||||
if (nAudioTracks)
|
||||
{
|
||||
// skip some useless values (unknown and audio channels)
|
||||
file.Skip(4 * nAudioTracks);
|
||||
|
||||
for (uint32_t i = 0; i < nAudioTracks; i++)
|
||||
{
|
||||
uint16_t sampleRate = file.ReadUint16LE();
|
||||
uint16_t flags = file.ReadUint16LE();
|
||||
|
||||
CreateAudioTrack(sampleRate, flags);
|
||||
}
|
||||
|
||||
// skip the audio track IDs
|
||||
file.Skip(4 * nAudioTracks);
|
||||
}
|
||||
|
||||
// read the video frames
|
||||
frames.resize(nFrames);
|
||||
|
||||
uint32_t pos, nextPos;
|
||||
|
||||
nextPos = file.ReadUint32LE();
|
||||
|
||||
for (uint32_t i = 0; i < nFrames; i++)
|
||||
{
|
||||
pos = nextPos;
|
||||
if (i == nFrames - 1)
|
||||
{
|
||||
nextPos = fileSize;
|
||||
frames[i].keyFrame = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
nextPos = file.ReadUint32LE();
|
||||
frames[i].keyFrame = pos & 1;
|
||||
}
|
||||
|
||||
pos &= ~1;
|
||||
nextPos &= ~1;
|
||||
|
||||
frames[i].offset = pos;
|
||||
frames[i].size = nextPos - pos;
|
||||
}
|
||||
|
||||
// determine buffer sizes for audio tracks
|
||||
file.Seek(frames[0].offset);
|
||||
|
||||
for (uint32_t trackIndex = 0; trackIndex < audioTracks.size(); trackIndex++)
|
||||
{
|
||||
// check for audio
|
||||
uint32_t audioPacketSize = file.ReadUint32LE();
|
||||
|
||||
if (audioPacketSize >= 4)
|
||||
{
|
||||
// size in bytes of largest decoded audio
|
||||
uint32_t reportedSize = file.ReadUint32LE();
|
||||
|
||||
AudioTrack *track = audioTracks[trackIndex];
|
||||
|
||||
// size in bytes
|
||||
track->bufferSize = reportedSize;
|
||||
track->buffer = new uint8_t[reportedSize];
|
||||
|
||||
// skip to next audio track (and -4 for reportedSize int we read)
|
||||
file.Skip(audioPacketSize-4);
|
||||
}
|
||||
else
|
||||
{
|
||||
file.Skip(audioPacketSize);
|
||||
}
|
||||
}
|
||||
|
||||
hasAlpha = videoFlags & kFlagAlpha;
|
||||
swapPlanes = signature >= kBIKhID;
|
||||
|
||||
InitBundles();
|
||||
InitTrees();
|
||||
|
||||
uint32_t width = frameWidth;
|
||||
uint32_t height = frameHeight;
|
||||
|
||||
// init plane memory
|
||||
Plane newPlane;
|
||||
planes.push_back(newPlane);
|
||||
|
||||
// luma plane
|
||||
planes.back().Init(width, height);
|
||||
|
||||
// chroma planes
|
||||
width /= 2;
|
||||
height /= 2;
|
||||
|
||||
// 1
|
||||
planes.push_back(newPlane);
|
||||
planes.back().Init(width, height);
|
||||
|
||||
// 2
|
||||
planes.push_back(newPlane);
|
||||
planes.back().Init(width, height);
|
||||
|
||||
// alpha plane
|
||||
if (hasAlpha)
|
||||
{
|
||||
width *= 2;
|
||||
height *= 2;
|
||||
|
||||
planes.push_back(newPlane);
|
||||
planes.back().Init(width, height);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void BinkDecoder::GetNextFrame(YUVbuffer yuv)
|
||||
{
|
||||
// seek to fame offset
|
||||
file.Seek(frames[currentFrame].offset);
|
||||
uint32_t frameSize = frames[currentFrame].size;
|
||||
|
||||
for (uint32_t trackIndex = 0; trackIndex < audioTracks.size(); trackIndex++)
|
||||
{
|
||||
// reset bytes read per frame (we might not get any audio for this frame)
|
||||
audioTracks[trackIndex]->bytesReadThisFrame = 0;
|
||||
|
||||
// check for audio
|
||||
uint32_t audioPacketSize = file.ReadUint32LE();
|
||||
|
||||
frameSize -= 4 + audioPacketSize;
|
||||
|
||||
if (audioPacketSize >= 4)
|
||||
{
|
||||
uint32_t nSamples = file.ReadUint32LE();
|
||||
|
||||
AudioPacket(trackIndex, audioPacketSize-4);
|
||||
}
|
||||
else
|
||||
{
|
||||
file.Skip(audioPacketSize);
|
||||
}
|
||||
}
|
||||
|
||||
// get video packet
|
||||
VideoPacket(frameSize);
|
||||
|
||||
// set planes data
|
||||
for (uint32_t i = 0; i < planes.size(); i++)
|
||||
{
|
||||
yuv[i].width = planes[i].width;
|
||||
yuv[i].height = planes[i].height;
|
||||
yuv[i].pitch = planes[i].pitch;
|
||||
yuv[i].data = planes[i].last;
|
||||
}
|
||||
|
||||
// frame done
|
||||
currentFrame++;
|
||||
}
|
1173
neo/libs/libbinkdec/src/BinkVideo.cpp
Normal file
1173
neo/libs/libbinkdec/src/BinkVideo.cpp
Normal file
File diff suppressed because it is too large
Load diff
110
neo/libs/libbinkdec/src/BitReader.cpp
Normal file
110
neo/libs/libbinkdec/src/BitReader.cpp
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* libbinkdec - decode Bink video and audio
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include "BitReader.h"
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
BitReader::BitReader(BinkCommon::FileStream &file, uint32_t size)
|
||||
{
|
||||
this->file = &file;
|
||||
this->totalSize = size;
|
||||
this->nCachedBits = 0;
|
||||
this->currentOffset = 0;
|
||||
this->bytesRead = 0;
|
||||
|
||||
FillCache();
|
||||
}
|
||||
|
||||
BitReader::~BitReader()
|
||||
{
|
||||
// file->Skip(totalSize - (currentOffset/8));
|
||||
}
|
||||
|
||||
void BitReader::FillCache()
|
||||
{
|
||||
if (bytesRead < totalSize)
|
||||
{
|
||||
this->cache = this->file->ReadByte();
|
||||
nCachedBits = 8;
|
||||
bytesRead++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: handle this case?
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t BitReader::GetSize()
|
||||
{
|
||||
return totalSize * 8;
|
||||
}
|
||||
|
||||
uint32_t BitReader::GetPosition()
|
||||
{
|
||||
return currentOffset + (8 - nCachedBits);
|
||||
}
|
||||
|
||||
uint32_t BitReader::GetBit()
|
||||
{
|
||||
if (nCachedBits == 0)
|
||||
{
|
||||
FillCache();
|
||||
currentOffset += 8;
|
||||
}
|
||||
|
||||
uint32_t ret = cache & 1;
|
||||
|
||||
cache >>= 1;
|
||||
nCachedBits--;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint32_t BitReader::GetBits(uint32_t n)
|
||||
{
|
||||
uint32_t ret = 0;
|
||||
|
||||
int bitsTodo = n;
|
||||
|
||||
uint32_t theShift = 0;
|
||||
|
||||
while (bitsTodo)
|
||||
{
|
||||
uint32_t bit = GetBit();
|
||||
bit <<= theShift;
|
||||
|
||||
theShift++;
|
||||
|
||||
ret |= bit;
|
||||
|
||||
bitsTodo--;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void BitReader::SkipBits(uint32_t n)
|
||||
{
|
||||
GetBits(n);
|
||||
}
|
||||
|
||||
} // close namespace BinkCommon
|
148
neo/libs/libbinkdec/src/FileStream.cpp
Normal file
148
neo/libs/libbinkdec/src/FileStream.cpp
Normal file
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "FileStream.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
bool FileStream::Open(const std::string &fileName)
|
||||
{
|
||||
file.open(fileName.c_str(), std::ifstream::in | std::ifstream::binary);
|
||||
if (!file.is_open())
|
||||
{
|
||||
// log error
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FileStream::Is_Open()
|
||||
{
|
||||
return file.is_open();
|
||||
}
|
||||
|
||||
void FileStream::Close()
|
||||
{
|
||||
file.close();
|
||||
}
|
||||
|
||||
int32_t FileStream::ReadBytes(uint8_t *data, uint32_t nBytes)
|
||||
{
|
||||
file.read(reinterpret_cast<char*>(data), nBytes);
|
||||
|
||||
if (file.eof()) {
|
||||
return 0;
|
||||
}
|
||||
else if (file.fail()) {
|
||||
return 0;
|
||||
}
|
||||
else if (file.bad()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return static_cast<int32_t>(file.gcount());
|
||||
}
|
||||
|
||||
uint32_t FileStream::ReadUint32LE()
|
||||
{
|
||||
uint32_t value;
|
||||
file.read(reinterpret_cast<char*>(&value), 4);
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t FileStream::ReadUint32BE()
|
||||
{
|
||||
uint32_t value;
|
||||
file.read(reinterpret_cast<char*>(&value), 4);
|
||||
#ifdef _MSC_VER
|
||||
return _byteswap_ulong(value);
|
||||
#else // DG: provide alternative for GCC/clang
|
||||
return __builtin_bswap32(value);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t FileStream::ReadUint16LE()
|
||||
{
|
||||
uint16_t value;
|
||||
file.read(reinterpret_cast<char*>(&value), 2);
|
||||
return value;
|
||||
}
|
||||
|
||||
uint16_t FileStream::ReadUint16BE()
|
||||
{
|
||||
uint16_t value;
|
||||
file.read(reinterpret_cast<char*>(&value), 2);
|
||||
#ifdef _MSC_VER
|
||||
return _byteswap_ushort(value);
|
||||
#else // DG: provide alternative for GCC/clang
|
||||
return __builtin_bswap16(value);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t FileStream::ReadByte()
|
||||
{
|
||||
uint8_t value;
|
||||
file.read(reinterpret_cast<char*>(&value), 1);
|
||||
return value;
|
||||
}
|
||||
|
||||
bool FileStream::Seek(int32_t offset, SeekDirection direction)
|
||||
{
|
||||
if (kSeekStart == direction) {
|
||||
file.seekg(offset, std::ios::beg);
|
||||
}
|
||||
else if (kSeekCurrent == direction) {
|
||||
file.seekg(offset, std::ios::cur);
|
||||
}
|
||||
|
||||
// TODO - end seek
|
||||
|
||||
if (file.bad())
|
||||
{
|
||||
// todo
|
||||
return false;
|
||||
}
|
||||
if (file.fail())
|
||||
{
|
||||
// todo
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FileStream::Skip(int32_t offset)
|
||||
{
|
||||
return Seek(offset, kSeekCurrent);
|
||||
}
|
||||
|
||||
bool FileStream::Is_Eos()
|
||||
{
|
||||
return file.eof();
|
||||
}
|
||||
|
||||
int32_t FileStream::GetPosition()
|
||||
{
|
||||
return static_cast<int32_t>(file.tellg());
|
||||
}
|
||||
|
||||
} // close namespace BinkCommon
|
||||
|
71
neo/libs/libbinkdec/src/HuffmanVLC.cpp
Normal file
71
neo/libs/libbinkdec/src/HuffmanVLC.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <HuffmanVLC.h>
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
uint8_t VLC_GetCodeBits(BitReader &bits, VLCtable &table)
|
||||
{
|
||||
uint8_t codeBits = 0;
|
||||
|
||||
// search each length array
|
||||
for (uint32_t i = 0; i < table.size(); i++)
|
||||
{
|
||||
// get and add a new bit to codeBits
|
||||
uint8_t theBit = bits.GetBit() << i;
|
||||
codeBits |= theBit;
|
||||
|
||||
// search for a code match
|
||||
for (uint32_t j = 0; j < table[i].size(); j++)
|
||||
{
|
||||
if (codeBits == table[i][j].code)
|
||||
{
|
||||
return table[i][j].symbol;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// shouldn't get here..
|
||||
return 0;
|
||||
}
|
||||
|
||||
void VLC_InitTable(VLCtable &table, uint32_t maxLength, uint32_t size, const uint8_t *lengths, const uint8_t *bits)
|
||||
{
|
||||
table.resize(maxLength);
|
||||
|
||||
for (uint32_t i = 0; i < size; i++)
|
||||
{
|
||||
VLC newCode;
|
||||
newCode.symbol = i;
|
||||
newCode.code = bits[i];
|
||||
|
||||
uint8_t codeLength = lengths[i];
|
||||
|
||||
// add the code to the array corresponding to the length
|
||||
table[codeLength - 1].push_back(newCode);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t VLC_GetSize(VLCtable &table)
|
||||
{
|
||||
return table.size();
|
||||
}
|
||||
|
||||
} // close namespace BinkCommon
|
31
neo/libs/libbinkdec/src/LogError.cpp
Normal file
31
neo/libs/libbinkdec/src/LogError.cpp
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "LogError.h"
|
||||
|
||||
namespace BinkCommon {
|
||||
|
||||
static std::string LastError;
|
||||
|
||||
void LogError(const std::string &error)
|
||||
{
|
||||
LastError = error;
|
||||
}
|
||||
|
||||
} // close namespace BinkCommon
|
53
neo/libs/libbinkdec/src/Util.cpp
Normal file
53
neo/libs/libbinkdec/src/Util.cpp
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* libbinkdec - Bink video decoder
|
||||
* Copyright (C) 2011 Barry Duncan
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* This code is based on the Bink decoder from the FFmpeg project which can be obtained from http://www.ffmpeg.org/
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#include "Util.h"
|
||||
#include <stdint.h>
|
||||
|
||||
// from FFmpeg - mathematics.c
|
||||
const uint8_t ff_log2_tab[256]={
|
||||
0,0,1,1,2,2,2,2,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,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,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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
|
||||
};
|
||||
|
||||
// from FFmpeg - common.h
|
||||
/*static av_always_inline av_const*/const int av_log2_c(unsigned int v)
|
||||
{
|
||||
int n = 0;
|
||||
if (v & 0xffff0000) {
|
||||
v >>= 16;
|
||||
n += 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
v >>= 8;
|
||||
n += 8;
|
||||
}
|
||||
n += ff_log2_tab[v];
|
||||
|
||||
return n;
|
||||
}
|
158
neo/libs/libbinkdec/src/avfft.c
Normal file
158
neo/libs/libbinkdec/src/avfft.c
Normal file
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out header a header include for
|
||||
* 'libavutil/mem.h' which is part of FFmpeg but is not present in this project. This code has also been modified to include
|
||||
* 'stdlib.h' to provide similar functionality in its place. All uses of the function 'av_malloc' from FFmpeg have been replaced
|
||||
* with a standard 'malloc' function call. All uses of the function 'av_freep' from FFmpeg have been replaced with a standard 'free'
|
||||
* function call. This file is otherwise identical to the FFmpeg original.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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/mem.h"
|
||||
#include "avfft.h"
|
||||
#include "fft.h"
|
||||
#include "rdft.h"
|
||||
#include "dct.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/* FFT */
|
||||
|
||||
FFTContext *av_fft_init(int nbits, int inverse)
|
||||
{
|
||||
FFTContext *s = (FFTContext*)malloc(sizeof(*s));
|
||||
|
||||
if (s && ff_fft_init(s, nbits, inverse)) {
|
||||
free(s);
|
||||
s = 0;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void av_fft_permute(FFTContext *s, FFTComplex *z)
|
||||
{
|
||||
s->fft_permute(s, z);
|
||||
}
|
||||
|
||||
void av_fft_calc(FFTContext *s, FFTComplex *z)
|
||||
{
|
||||
s->fft_calc(s, z);
|
||||
}
|
||||
|
||||
void av_fft_end(FFTContext *s)
|
||||
{
|
||||
if (s) {
|
||||
ff_fft_end(s);
|
||||
free(s);
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_MDCT
|
||||
|
||||
FFTContext *av_mdct_init(int nbits, int inverse, double scale)
|
||||
{
|
||||
FFTContext *s = (FFTContext*)malloc(sizeof(*s));
|
||||
|
||||
if (s && ff_mdct_init(s, nbits, inverse, scale)) {
|
||||
free(s);
|
||||
s = 0;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
|
||||
{
|
||||
s->imdct_calc(s, output, input);
|
||||
}
|
||||
|
||||
void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input)
|
||||
{
|
||||
s->imdct_half(s, output, input);
|
||||
}
|
||||
|
||||
void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input)
|
||||
{
|
||||
s->mdct_calc(s, output, input);
|
||||
}
|
||||
|
||||
void av_mdct_end(FFTContext *s)
|
||||
{
|
||||
if (s) {
|
||||
ff_mdct_end(s);
|
||||
free(s);
|
||||
s = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MDCT */
|
||||
|
||||
#if CONFIG_RDFT
|
||||
|
||||
RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans)
|
||||
{
|
||||
RDFTContext *s = av_malloc(sizeof(*s));
|
||||
|
||||
if (s && ff_rdft_init(s, nbits, trans))
|
||||
av_freep(&s);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void av_rdft_calc(RDFTContext *s, FFTSample *data)
|
||||
{
|
||||
s->rdft_calc(s, data);
|
||||
}
|
||||
|
||||
void av_rdft_end(RDFTContext *s)
|
||||
{
|
||||
if (s) {
|
||||
ff_rdft_end(s);
|
||||
av_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_RDFT */
|
||||
|
||||
#if CONFIG_DCT
|
||||
|
||||
DCTContext *av_dct_init(int nbits, enum DCTTransformType inverse)
|
||||
{
|
||||
DCTContext *s = av_malloc(sizeof(*s));
|
||||
|
||||
if (s && ff_dct_init(s, nbits, inverse))
|
||||
av_freep(&s);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void av_dct_calc(DCTContext *s, FFTSample *data)
|
||||
{
|
||||
s->dct_calc(s, data);
|
||||
}
|
||||
|
||||
void av_dct_end(DCTContext *s)
|
||||
{
|
||||
if (s) {
|
||||
ff_dct_end(s);
|
||||
av_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DCT */
|
236
neo/libs/libbinkdec/src/dct.c
Normal file
236
neo/libs/libbinkdec/src/dct.c
Normal file
|
@ -0,0 +1,236 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out an include for header
|
||||
* 'libavutil/mathematics.h' which is part of the FFmpeg project. This file is not available in this project
|
||||
* and has therefore been unreferenced. Two includes for 'string.h' and 'stdlib.h' have been added to provide
|
||||
* the functionality that was available from this FFmpeg header. All uses of the function 'av_malloc' from FFmpeg have been replaced
|
||||
* with a standard 'malloc' function call. All uses of the function 'av_freep' from FFmpeg have been replaced with a standard 'free'
|
||||
* function call. The line which checks 'HAVE_MMX' has been commented out. Fixed some warnings for conversion from double to float for
|
||||
* some constant numbers by adding 'f' (eg 0.05 to 0.5f).
|
||||
* This file is otherwise identical to the FFmpeg original.
|
||||
*/
|
||||
|
||||
/*
|
||||
* (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
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* (Inverse) Discrete Cosine Transforms. These are also known as the
|
||||
* type II and type III DCTs respectively.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
//#include "libavutil/mathematics.h"
|
||||
#include "dct.h"
|
||||
#include "dct32.h"
|
||||
|
||||
/* sin((M_PI * x / (2*n)) */
|
||||
#define SIN(s,n,x) (s->costab[(n) - (x)])
|
||||
|
||||
/* cos((M_PI * x / (2*n)) */
|
||||
#define COS(s,n,x) (s->costab[x])
|
||||
|
||||
static void ff_dst_calc_I_c(DCTContext *ctx, FFTSample *data)
|
||||
{
|
||||
int n = 1 << ctx->nbits;
|
||||
int i;
|
||||
|
||||
data[0] = 0;
|
||||
for(i = 1; i < n/2; i++) {
|
||||
float tmp1 = data[i ];
|
||||
float tmp2 = data[n - i];
|
||||
float s = SIN(ctx, n, 2*i);
|
||||
|
||||
s *= tmp1 + tmp2;
|
||||
tmp1 = (tmp1 - tmp2) * 0.5f;
|
||||
data[i ] = s + tmp1;
|
||||
data[n - i] = s - tmp1;
|
||||
}
|
||||
|
||||
data[n/2] *= 2;
|
||||
ctx->rdft.rdft_calc(&ctx->rdft, data);
|
||||
|
||||
data[0] *= 0.5f;
|
||||
|
||||
for(i = 1; i < n-2; i += 2) {
|
||||
data[i + 1] += data[i - 1];
|
||||
data[i ] = -data[i + 2];
|
||||
}
|
||||
|
||||
data[n-1] = 0;
|
||||
}
|
||||
|
||||
static void ff_dct_calc_I_c(DCTContext *ctx, FFTSample *data)
|
||||
{
|
||||
int n = 1 << ctx->nbits;
|
||||
int i;
|
||||
float next = -0.5f * (data[0] - data[n]);
|
||||
|
||||
for(i = 0; i < n/2; i++) {
|
||||
float tmp1 = data[i ];
|
||||
float tmp2 = data[n - i];
|
||||
float s = SIN(ctx, n, 2*i);
|
||||
float c = COS(ctx, n, 2*i);
|
||||
|
||||
c *= tmp1 - tmp2;
|
||||
s *= tmp1 - tmp2;
|
||||
|
||||
next += c;
|
||||
|
||||
tmp1 = (tmp1 + tmp2) * 0.5f;
|
||||
data[i ] = tmp1 - s;
|
||||
data[n - i] = tmp1 + s;
|
||||
}
|
||||
|
||||
ctx->rdft.rdft_calc(&ctx->rdft, data);
|
||||
data[n] = data[1];
|
||||
data[1] = next;
|
||||
|
||||
for(i = 3; i <= n; i += 2)
|
||||
data[i] = data[i - 2] - data[i];
|
||||
}
|
||||
|
||||
static void ff_dct_calc_III_c(DCTContext *ctx, FFTSample *data)
|
||||
{
|
||||
int n = 1 << ctx->nbits;
|
||||
int i;
|
||||
|
||||
float next = data[n - 1];
|
||||
float inv_n = 1.0f / n;
|
||||
|
||||
for (i = n - 2; i >= 2; i -= 2) {
|
||||
float val1 = data[i ];
|
||||
float val2 = data[i - 1] - data[i + 1];
|
||||
float c = COS(ctx, n, i);
|
||||
float s = SIN(ctx, n, i);
|
||||
|
||||
data[i ] = c * val1 + s * val2;
|
||||
data[i + 1] = s * val1 - c * val2;
|
||||
}
|
||||
|
||||
data[1] = 2 * next;
|
||||
|
||||
ctx->rdft.rdft_calc(&ctx->rdft, data);
|
||||
|
||||
for (i = 0; i < n / 2; i++) {
|
||||
float tmp1 = data[i ] * inv_n;
|
||||
float tmp2 = data[n - i - 1] * inv_n;
|
||||
float csc = ctx->csc2[i] * (tmp1 - tmp2);
|
||||
|
||||
tmp1 += tmp2;
|
||||
data[i ] = tmp1 + csc;
|
||||
data[n - i - 1] = tmp1 - csc;
|
||||
}
|
||||
}
|
||||
|
||||
static void ff_dct_calc_II_c(DCTContext *ctx, FFTSample *data)
|
||||
{
|
||||
int n = 1 << ctx->nbits;
|
||||
int i;
|
||||
float next;
|
||||
|
||||
for (i=0; i < n/2; i++) {
|
||||
float tmp1 = data[i ];
|
||||
float tmp2 = data[n - i - 1];
|
||||
float s = SIN(ctx, n, 2*i + 1);
|
||||
|
||||
s *= tmp1 - tmp2;
|
||||
tmp1 = (tmp1 + tmp2) * 0.5f;
|
||||
|
||||
data[i ] = tmp1 + s;
|
||||
data[n-i-1] = tmp1 - s;
|
||||
}
|
||||
|
||||
ctx->rdft.rdft_calc(&ctx->rdft, data);
|
||||
|
||||
next = data[1] * 0.5f;
|
||||
data[1] *= -1;
|
||||
|
||||
for (i = n - 2; i >= 0; i -= 2) {
|
||||
float inr = data[i ];
|
||||
float ini = data[i + 1];
|
||||
float c = COS(ctx, n, i);
|
||||
float s = SIN(ctx, n, i);
|
||||
|
||||
data[i ] = c * inr + s * ini;
|
||||
|
||||
data[i+1] = next;
|
||||
|
||||
next += s * inr - c * ini;
|
||||
}
|
||||
}
|
||||
|
||||
static void dct32_func(DCTContext *ctx, FFTSample *data)
|
||||
{
|
||||
ctx->dct32(data, data);
|
||||
}
|
||||
|
||||
av_cold int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType inverse)
|
||||
{
|
||||
int n = 1 << nbits;
|
||||
int i;
|
||||
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
||||
s->nbits = nbits;
|
||||
s->inverse = inverse;
|
||||
|
||||
if (inverse == DCT_II && nbits == 5) {
|
||||
s->dct_calc = dct32_func;
|
||||
} else {
|
||||
ff_init_ff_cos_tabs(nbits+2);
|
||||
|
||||
s->costab = ff_cos_tabs[nbits+2];
|
||||
|
||||
s->csc2 = (FFTSample*)malloc(n/2 * sizeof(FFTSample));
|
||||
|
||||
if (ff_rdft_init(&s->rdft, nbits, inverse == DCT_III) < 0) {
|
||||
free(s->csc2);
|
||||
s->csc2 = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < n/2; i++)
|
||||
s->csc2[i] = 0.5f / sin((M_PI / (2*n) * (2*i + 1)));
|
||||
|
||||
switch(inverse) {
|
||||
case DCT_I : s->dct_calc = ff_dct_calc_I_c; break;
|
||||
case DCT_II : s->dct_calc = ff_dct_calc_II_c ; break;
|
||||
case DCT_III: s->dct_calc = ff_dct_calc_III_c; break;
|
||||
case DST_I : s->dct_calc = ff_dst_calc_I_c; break;
|
||||
}
|
||||
}
|
||||
|
||||
s->dct32 = ff_dct32_float;
|
||||
// if (HAVE_MMX) ff_dct_init_mmx(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
av_cold void ff_dct_end(DCTContext *s)
|
||||
{
|
||||
ff_rdft_end(&s->rdft);
|
||||
free(s->csc2);
|
||||
s->csc2 = 0;
|
||||
}
|
284
neo/libs/libbinkdec/src/dct32.c
Normal file
284
neo/libs/libbinkdec/src/dct32.c
Normal file
|
@ -0,0 +1,284 @@
|
|||
/*
|
||||
* This file has been modified by Barry Duncan to comment out a header include for 'mathops.h' which is part of FFmpeg
|
||||
* and not available in this project. 'DCT32_FLOAT' has also been defined as 1. This file is otherwise identical to the
|
||||
* FFmpeg original
|
||||
*/
|
||||
|
||||
/*
|
||||
* Template for the Discrete Cosine Transform for 32 samples
|
||||
* Copyright (c) 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 "dct32.h"
|
||||
//#include "mathops.h"
|
||||
|
||||
#define DCT32_FLOAT 1
|
||||
|
||||
#if DCT32_FLOAT
|
||||
# define dct32 ff_dct32_float
|
||||
# define FIXHR(x) ((float)(x))
|
||||
# define MULH3(x, y, s) ((s)*(y)*(x))
|
||||
# define INTFLOAT float
|
||||
#else
|
||||
# define dct32 ff_dct32_fixed
|
||||
# define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))
|
||||
# define MULH3(x, y, s) MULH((s)*(x), y)
|
||||
# define INTFLOAT int
|
||||
#endif
|
||||
|
||||
|
||||
/* tab[i][j] = 1.0 / (2.0 * cos(pi*(2*k+1) / 2^(6 - j))) */
|
||||
|
||||
/* cos(i*pi/64) */
|
||||
|
||||
#define COS0_0 FIXHR(0.50060299823519630134/2)
|
||||
#define COS0_1 FIXHR(0.50547095989754365998/2)
|
||||
#define COS0_2 FIXHR(0.51544730992262454697/2)
|
||||
#define COS0_3 FIXHR(0.53104259108978417447/2)
|
||||
#define COS0_4 FIXHR(0.55310389603444452782/2)
|
||||
#define COS0_5 FIXHR(0.58293496820613387367/2)
|
||||
#define COS0_6 FIXHR(0.62250412303566481615/2)
|
||||
#define COS0_7 FIXHR(0.67480834145500574602/2)
|
||||
#define COS0_8 FIXHR(0.74453627100229844977/2)
|
||||
#define COS0_9 FIXHR(0.83934964541552703873/2)
|
||||
#define COS0_10 FIXHR(0.97256823786196069369/2)
|
||||
#define COS0_11 FIXHR(1.16943993343288495515/4)
|
||||
#define COS0_12 FIXHR(1.48416461631416627724/4)
|
||||
#define COS0_13 FIXHR(2.05778100995341155085/8)
|
||||
#define COS0_14 FIXHR(3.40760841846871878570/8)
|
||||
#define COS0_15 FIXHR(10.19000812354805681150/32)
|
||||
|
||||
#define COS1_0 FIXHR(0.50241928618815570551/2)
|
||||
#define COS1_1 FIXHR(0.52249861493968888062/2)
|
||||
#define COS1_2 FIXHR(0.56694403481635770368/2)
|
||||
#define COS1_3 FIXHR(0.64682178335999012954/2)
|
||||
#define COS1_4 FIXHR(0.78815462345125022473/2)
|
||||
#define COS1_5 FIXHR(1.06067768599034747134/4)
|
||||
#define COS1_6 FIXHR(1.72244709823833392782/4)
|
||||
#define COS1_7 FIXHR(5.10114861868916385802/16)
|
||||
|
||||
#define COS2_0 FIXHR(0.50979557910415916894/2)
|
||||
#define COS2_1 FIXHR(0.60134488693504528054/2)
|
||||
#define COS2_2 FIXHR(0.89997622313641570463/2)
|
||||
#define COS2_3 FIXHR(2.56291544774150617881/8)
|
||||
|
||||
#define COS3_0 FIXHR(0.54119610014619698439/2)
|
||||
#define COS3_1 FIXHR(1.30656296487637652785/4)
|
||||
|
||||
#define COS4_0 FIXHR(0.70710678118654752439/2)
|
||||
|
||||
/* butterfly operator */
|
||||
#define BF(a, b, c, s)\
|
||||
{\
|
||||
tmp0 = val##a + val##b;\
|
||||
tmp1 = val##a - val##b;\
|
||||
val##a = tmp0;\
|
||||
val##b = MULH3(tmp1, c, 1<<(s));\
|
||||
}
|
||||
|
||||
#define BF0(a, b, c, s)\
|
||||
{\
|
||||
tmp0 = tab[a] + tab[b];\
|
||||
tmp1 = tab[a] - tab[b];\
|
||||
val##a = tmp0;\
|
||||
val##b = MULH3(tmp1, c, 1<<(s));\
|
||||
}
|
||||
|
||||
#define BF1(a, b, c, d)\
|
||||
{\
|
||||
BF(a, b, COS4_0, 1);\
|
||||
BF(c, d,-COS4_0, 1);\
|
||||
val##c += val##d;\
|
||||
}
|
||||
|
||||
#define BF2(a, b, c, d)\
|
||||
{\
|
||||
BF(a, b, COS4_0, 1);\
|
||||
BF(c, d,-COS4_0, 1);\
|
||||
val##c += val##d;\
|
||||
val##a += val##c;\
|
||||
val##c += val##b;\
|
||||
val##b += val##d;\
|
||||
}
|
||||
|
||||
#define ADD(a, b) val##a += val##b
|
||||
|
||||
/* DCT32 without 1/sqrt(2) coef zero scaling. */
|
||||
void dct32(INTFLOAT *out, const INTFLOAT *tab)
|
||||
{
|
||||
INTFLOAT tmp0, tmp1;
|
||||
|
||||
INTFLOAT val0 , val1 , val2 , val3 , val4 , val5 , val6 , val7 ,
|
||||
val8 , val9 , val10, val11, val12, val13, val14, val15,
|
||||
val16, val17, val18, val19, val20, val21, val22, val23,
|
||||
val24, val25, val26, val27, val28, val29, val30, val31;
|
||||
|
||||
/* pass 1 */
|
||||
BF0( 0, 31, COS0_0 , 1);
|
||||
BF0(15, 16, COS0_15, 5);
|
||||
/* pass 2 */
|
||||
BF( 0, 15, COS1_0 , 1);
|
||||
BF(16, 31,-COS1_0 , 1);
|
||||
/* pass 1 */
|
||||
BF0( 7, 24, COS0_7 , 1);
|
||||
BF0( 8, 23, COS0_8 , 1);
|
||||
/* pass 2 */
|
||||
BF( 7, 8, COS1_7 , 4);
|
||||
BF(23, 24,-COS1_7 , 4);
|
||||
/* pass 3 */
|
||||
BF( 0, 7, COS2_0 , 1);
|
||||
BF( 8, 15,-COS2_0 , 1);
|
||||
BF(16, 23, COS2_0 , 1);
|
||||
BF(24, 31,-COS2_0 , 1);
|
||||
/* pass 1 */
|
||||
BF0( 3, 28, COS0_3 , 1);
|
||||
BF0(12, 19, COS0_12, 2);
|
||||
/* pass 2 */
|
||||
BF( 3, 12, COS1_3 , 1);
|
||||
BF(19, 28,-COS1_3 , 1);
|
||||
/* pass 1 */
|
||||
BF0( 4, 27, COS0_4 , 1);
|
||||
BF0(11, 20, COS0_11, 2);
|
||||
/* pass 2 */
|
||||
BF( 4, 11, COS1_4 , 1);
|
||||
BF(20, 27,-COS1_4 , 1);
|
||||
/* pass 3 */
|
||||
BF( 3, 4, COS2_3 , 3);
|
||||
BF(11, 12,-COS2_3 , 3);
|
||||
BF(19, 20, COS2_3 , 3);
|
||||
BF(27, 28,-COS2_3 , 3);
|
||||
/* pass 4 */
|
||||
BF( 0, 3, COS3_0 , 1);
|
||||
BF( 4, 7,-COS3_0 , 1);
|
||||
BF( 8, 11, COS3_0 , 1);
|
||||
BF(12, 15,-COS3_0 , 1);
|
||||
BF(16, 19, COS3_0 , 1);
|
||||
BF(20, 23,-COS3_0 , 1);
|
||||
BF(24, 27, COS3_0 , 1);
|
||||
BF(28, 31,-COS3_0 , 1);
|
||||
|
||||
|
||||
|
||||
/* pass 1 */
|
||||
BF0( 1, 30, COS0_1 , 1);
|
||||
BF0(14, 17, COS0_14, 3);
|
||||
/* pass 2 */
|
||||
BF( 1, 14, COS1_1 , 1);
|
||||
BF(17, 30,-COS1_1 , 1);
|
||||
/* pass 1 */
|
||||
BF0( 6, 25, COS0_6 , 1);
|
||||
BF0( 9, 22, COS0_9 , 1);
|
||||
/* pass 2 */
|
||||
BF( 6, 9, COS1_6 , 2);
|
||||
BF(22, 25,-COS1_6 , 2);
|
||||
/* pass 3 */
|
||||
BF( 1, 6, COS2_1 , 1);
|
||||
BF( 9, 14,-COS2_1 , 1);
|
||||
BF(17, 22, COS2_1 , 1);
|
||||
BF(25, 30,-COS2_1 , 1);
|
||||
|
||||
/* pass 1 */
|
||||
BF0( 2, 29, COS0_2 , 1);
|
||||
BF0(13, 18, COS0_13, 3);
|
||||
/* pass 2 */
|
||||
BF( 2, 13, COS1_2 , 1);
|
||||
BF(18, 29,-COS1_2 , 1);
|
||||
/* pass 1 */
|
||||
BF0( 5, 26, COS0_5 , 1);
|
||||
BF0(10, 21, COS0_10, 1);
|
||||
/* pass 2 */
|
||||
BF( 5, 10, COS1_5 , 2);
|
||||
BF(21, 26,-COS1_5 , 2);
|
||||
/* pass 3 */
|
||||
BF( 2, 5, COS2_2 , 1);
|
||||
BF(10, 13,-COS2_2 , 1);
|
||||
BF(18, 21, COS2_2 , 1);
|
||||
BF(26, 29,-COS2_2 , 1);
|
||||
/* pass 4 */
|
||||
BF( 1, 2, COS3_1 , 2);
|
||||
BF( 5, 6,-COS3_1 , 2);
|
||||
BF( 9, 10, COS3_1 , 2);
|
||||
BF(13, 14,-COS3_1 , 2);
|
||||
BF(17, 18, COS3_1 , 2);
|
||||
BF(21, 22,-COS3_1 , 2);
|
||||
BF(25, 26, COS3_1 , 2);
|
||||
BF(29, 30,-COS3_1 , 2);
|
||||
|
||||
/* pass 5 */
|
||||
BF1( 0, 1, 2, 3);
|
||||
BF2( 4, 5, 6, 7);
|
||||
BF1( 8, 9, 10, 11);
|
||||
BF2(12, 13, 14, 15);
|
||||
BF1(16, 17, 18, 19);
|
||||
BF2(20, 21, 22, 23);
|
||||
BF1(24, 25, 26, 27);
|
||||
BF2(28, 29, 30, 31);
|
||||
|
||||
/* pass 6 */
|
||||
|
||||
ADD( 8, 12);
|
||||
ADD(12, 10);
|
||||
ADD(10, 14);
|
||||
ADD(14, 9);
|
||||
ADD( 9, 13);
|
||||
ADD(13, 11);
|
||||
ADD(11, 15);
|
||||
|
||||
out[ 0] = val0;
|
||||
out[16] = val1;
|
||||
out[ 8] = val2;
|
||||
out[24] = val3;
|
||||
out[ 4] = val4;
|
||||
out[20] = val5;
|
||||
out[12] = val6;
|
||||
out[28] = val7;
|
||||
out[ 2] = val8;
|
||||
out[18] = val9;
|
||||
out[10] = val10;
|
||||
out[26] = val11;
|
||||
out[ 6] = val12;
|
||||
out[22] = val13;
|
||||
out[14] = val14;
|
||||
out[30] = val15;
|
||||
|
||||
ADD(24, 28);
|
||||
ADD(28, 26);
|
||||
ADD(26, 30);
|
||||
ADD(30, 25);
|
||||
ADD(25, 29);
|
||||
ADD(29, 27);
|
||||
ADD(27, 31);
|
||||
|
||||
out[ 1] = val16 + val24;
|
||||
out[17] = val17 + val25;
|
||||
out[ 9] = val18 + val26;
|
||||
out[25] = val19 + val27;
|
||||
out[ 5] = val20 + val28;
|
||||
out[21] = val21 + val29;
|
||||
out[13] = val22 + val30;
|
||||
out[29] = val23 + val31;
|
||||
out[ 3] = val24 + val20;
|
||||
out[19] = val25 + val21;
|
||||
out[11] = val26 + val22;
|
||||
out[27] = val27 + val23;
|
||||
out[ 7] = val28 + val18;
|
||||
out[23] = val29 + val19;
|
||||
out[15] = val30 + val17;
|
||||
out[31] = val31;
|
||||
}
|
368
neo/libs/libbinkdec/src/fft.c
Normal file
368
neo/libs/libbinkdec/src/fft.c
Normal file
|
@ -0,0 +1,368 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out an include for header
|
||||
* 'libavutil/mathematics.h' which is part of the FFmpeg project. This file is not available in this project
|
||||
* and has therefore been unreferenced. All uses of the function 'av_malloc' from FFmpeg have been replaced
|
||||
* with a standard 'malloc' function call. All uses of the function 'av_freep' from FFmpeg have been replaced
|
||||
* with a standard 'free' function call. Three lines where 'ARCH_ARM', 'HAVE_ALTIVEC' and 'HAVE_MMX' have
|
||||
* been commented out. A usage of 'av_cold' has also been commented out. This file is otherwise identical to the
|
||||
* FFmpeg original.
|
||||
*/
|
||||
|
||||
/*
|
||||
* FFT/IFFT transforms
|
||||
* Copyright (c) 2008 Loren Merritt
|
||||
* Copyright (c) 2002 Fabrice Bellard
|
||||
* Partly based on libdjbfft by D. J. Bernstein
|
||||
*
|
||||
* 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
|
||||
* FFT/IFFT transforms.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
//#include "libavutil/mathematics.h"
|
||||
#include "fft.h"
|
||||
#include "fft-internal.h"
|
||||
|
||||
/* cos(2*pi*x/n) for 0<=x<=n/4, followed by its reverse */
|
||||
#if !CONFIG_HARDCODED_TABLES
|
||||
COSTABLE(16);
|
||||
COSTABLE(32);
|
||||
COSTABLE(64);
|
||||
COSTABLE(128);
|
||||
COSTABLE(256);
|
||||
COSTABLE(512);
|
||||
COSTABLE(1024);
|
||||
COSTABLE(2048);
|
||||
COSTABLE(4096);
|
||||
COSTABLE(8192);
|
||||
COSTABLE(16384);
|
||||
COSTABLE(32768);
|
||||
COSTABLE(65536);
|
||||
#endif
|
||||
COSTABLE_CONST FFTSample * const FFT_NAME(ff_cos_tabs)[] = {
|
||||
NULL, NULL, NULL, NULL,
|
||||
FFT_NAME(ff_cos_16),
|
||||
FFT_NAME(ff_cos_32),
|
||||
FFT_NAME(ff_cos_64),
|
||||
FFT_NAME(ff_cos_128),
|
||||
FFT_NAME(ff_cos_256),
|
||||
FFT_NAME(ff_cos_512),
|
||||
FFT_NAME(ff_cos_1024),
|
||||
FFT_NAME(ff_cos_2048),
|
||||
FFT_NAME(ff_cos_4096),
|
||||
FFT_NAME(ff_cos_8192),
|
||||
FFT_NAME(ff_cos_16384),
|
||||
FFT_NAME(ff_cos_32768),
|
||||
FFT_NAME(ff_cos_65536),
|
||||
};
|
||||
|
||||
static void ff_fft_permute_c(FFTContext *s, FFTComplex *z);
|
||||
static void ff_fft_calc_c(FFTContext *s, FFTComplex *z);
|
||||
|
||||
static int split_radix_permutation(int i, int n, int inverse)
|
||||
{
|
||||
int m;
|
||||
if(n <= 2) return i&1;
|
||||
m = n >> 1;
|
||||
if(!(i&m)) return split_radix_permutation(i, m, inverse)*2;
|
||||
m >>= 1;
|
||||
if(inverse == !(i&m)) return split_radix_permutation(i, m, inverse)*4 + 1;
|
||||
else return split_radix_permutation(i, m, inverse)*4 - 1;
|
||||
}
|
||||
|
||||
av_cold void ff_init_ff_cos_tabs(int index)
|
||||
{
|
||||
#if !CONFIG_HARDCODED_TABLES
|
||||
int i;
|
||||
int m = 1<<index;
|
||||
double freq = 2*M_PI/m;
|
||||
FFTSample *tab = FFT_NAME(ff_cos_tabs)[index];
|
||||
for(i=0; i<=m/4; i++)
|
||||
tab[i] = FIX15(cos(i*freq));
|
||||
for(i=1; i<m/4; i++)
|
||||
tab[m/2-i] = tab[i];
|
||||
#endif
|
||||
}
|
||||
|
||||
static const int avx_tab[] = {
|
||||
0, 4, 1, 5, 8, 12, 9, 13, 2, 6, 3, 7, 10, 14, 11, 15
|
||||
};
|
||||
|
||||
static int is_second_half_of_fft32(int i, int n)
|
||||
{
|
||||
if (n <= 32)
|
||||
return i >= 16;
|
||||
else if (i < n/2)
|
||||
return is_second_half_of_fft32(i, n/2);
|
||||
else if (i < 3*n/4)
|
||||
return is_second_half_of_fft32(i - n/2, n/4);
|
||||
else
|
||||
return is_second_half_of_fft32(i - 3*n/4, n/4);
|
||||
}
|
||||
|
||||
static av_cold void fft_perm_avx(FFTContext *s)
|
||||
{
|
||||
int i;
|
||||
int n = 1 << s->nbits;
|
||||
|
||||
for (i = 0; i < n; i += 16) {
|
||||
int k;
|
||||
if (is_second_half_of_fft32(i, n)) {
|
||||
for (k = 0; k < 16; k++)
|
||||
s->revtab[-split_radix_permutation(i + k, n, s->inverse) & (n - 1)] =
|
||||
i + avx_tab[k];
|
||||
|
||||
} else {
|
||||
for (k = 0; k < 16; k++) {
|
||||
int j = i + k;
|
||||
j = (j & ~7) | ((j >> 1) & 3) | ((j << 2) & 4);
|
||||
s->revtab[-split_radix_permutation(i + k, n, s->inverse) & (n - 1)] = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
|
||||
{
|
||||
int i, j, n;
|
||||
|
||||
if (nbits < 2 || nbits > 16)
|
||||
goto fail;
|
||||
s->nbits = nbits;
|
||||
n = 1 << nbits;
|
||||
|
||||
s->revtab = (uint16_t*)malloc(n * sizeof(uint16_t));
|
||||
if (!s->revtab)
|
||||
goto fail;
|
||||
s->tmp_buf = (FFTComplex*)malloc(n * sizeof(FFTComplex));
|
||||
if (!s->tmp_buf)
|
||||
goto fail;
|
||||
s->inverse = inverse;
|
||||
s->fft_permutation = FF_FFT_PERM_DEFAULT;
|
||||
|
||||
s->fft_permute = ff_fft_permute_c;
|
||||
s->fft_calc = ff_fft_calc_c;
|
||||
#if CONFIG_MDCT
|
||||
s->imdct_calc = ff_imdct_calc_c;
|
||||
s->imdct_half = ff_imdct_half_c;
|
||||
s->mdct_calc = ff_mdct_calc_c;
|
||||
#endif
|
||||
|
||||
#if CONFIG_FFT_FLOAT
|
||||
|
||||
// if (ARCH_ARM) ff_fft_init_arm(s);
|
||||
// if (HAVE_ALTIVEC) ff_fft_init_altivec(s);
|
||||
// if (HAVE_MMX) ff_fft_init_mmx(s);
|
||||
if (CONFIG_MDCT) s->mdct_calcw = s->mdct_calc;
|
||||
#else
|
||||
if (CONFIG_MDCT) s->mdct_calcw = ff_mdct_calcw_c;
|
||||
if (ARCH_ARM) ff_fft_fixed_init_arm(s);
|
||||
#endif
|
||||
|
||||
for(j=4; j<=nbits; j++) {
|
||||
ff_init_ff_cos_tabs(j);
|
||||
}
|
||||
|
||||
if (s->fft_permutation == FF_FFT_PERM_AVX) {
|
||||
fft_perm_avx(s);
|
||||
} else {
|
||||
for(i=0; i<n; i++) {
|
||||
int j = i;
|
||||
if (s->fft_permutation == FF_FFT_PERM_SWAP_LSBS)
|
||||
j = (j&~3) | ((j>>1)&1) | ((j<<1)&2);
|
||||
s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = j;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
free(s->revtab);
|
||||
s->revtab = 0;
|
||||
free(s->tmp_buf);
|
||||
s->tmp_buf = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
|
||||
{
|
||||
int j, np;
|
||||
const uint16_t *revtab = s->revtab;
|
||||
np = 1 << s->nbits;
|
||||
/* TODO: handle split-radix permute in a more optimal way, probably in-place */
|
||||
for(j=0;j<np;j++) s->tmp_buf[revtab[j]] = z[j];
|
||||
memcpy(z, s->tmp_buf, np * sizeof(FFTComplex));
|
||||
}
|
||||
|
||||
/*av_cold*/ void ff_fft_end(FFTContext *s)
|
||||
{
|
||||
free(s->revtab);
|
||||
s->revtab = 0;
|
||||
free(s->tmp_buf);
|
||||
s->tmp_buf = 0;
|
||||
}
|
||||
|
||||
#define BUTTERFLIES(a0,a1,a2,a3) {\
|
||||
BF(t3, t5, t5, t1);\
|
||||
BF(a2.re, a0.re, a0.re, t5);\
|
||||
BF(a3.im, a1.im, a1.im, t3);\
|
||||
BF(t4, t6, t2, t6);\
|
||||
BF(a3.re, a1.re, a1.re, t4);\
|
||||
BF(a2.im, a0.im, a0.im, t6);\
|
||||
}
|
||||
|
||||
// force loading all the inputs before storing any.
|
||||
// this is slightly slower for small data, but avoids store->load aliasing
|
||||
// for addresses separated by large powers of 2.
|
||||
#define BUTTERFLIES_BIG(a0,a1,a2,a3) {\
|
||||
FFTSample r0=a0.re, i0=a0.im, r1=a1.re, i1=a1.im;\
|
||||
BF(t3, t5, t5, t1);\
|
||||
BF(a2.re, a0.re, r0, t5);\
|
||||
BF(a3.im, a1.im, i1, t3);\
|
||||
BF(t4, t6, t2, t6);\
|
||||
BF(a3.re, a1.re, r1, t4);\
|
||||
BF(a2.im, a0.im, i0, t6);\
|
||||
}
|
||||
|
||||
#define TRANSFORM(a0,a1,a2,a3,wre,wim) {\
|
||||
CMUL(t1, t2, a2.re, a2.im, wre, -wim);\
|
||||
CMUL(t5, t6, a3.re, a3.im, wre, wim);\
|
||||
BUTTERFLIES(a0,a1,a2,a3)\
|
||||
}
|
||||
|
||||
#define TRANSFORM_ZERO(a0,a1,a2,a3) {\
|
||||
t1 = a2.re;\
|
||||
t2 = a2.im;\
|
||||
t5 = a3.re;\
|
||||
t6 = a3.im;\
|
||||
BUTTERFLIES(a0,a1,a2,a3)\
|
||||
}
|
||||
|
||||
/* z[0...8n-1], w[1...2n-1] */
|
||||
#define PASS(name)\
|
||||
static void name(FFTComplex *z, const FFTSample *wre, unsigned int n)\
|
||||
{\
|
||||
FFTDouble t1, t2, t3, t4, t5, t6;\
|
||||
int o1 = 2*n;\
|
||||
int o2 = 4*n;\
|
||||
int o3 = 6*n;\
|
||||
const FFTSample *wim = wre+o1;\
|
||||
n--;\
|
||||
\
|
||||
TRANSFORM_ZERO(z[0],z[o1],z[o2],z[o3]);\
|
||||
TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
|
||||
do {\
|
||||
z += 2;\
|
||||
wre += 2;\
|
||||
wim -= 2;\
|
||||
TRANSFORM(z[0],z[o1],z[o2],z[o3],wre[0],wim[0]);\
|
||||
TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
|
||||
} while(--n);\
|
||||
}
|
||||
|
||||
PASS(pass)
|
||||
#undef BUTTERFLIES
|
||||
#define BUTTERFLIES BUTTERFLIES_BIG
|
||||
PASS(pass_big)
|
||||
|
||||
#define DECL_FFT(n,n2,n4)\
|
||||
static void fft##n(FFTComplex *z)\
|
||||
{\
|
||||
fft##n2(z);\
|
||||
fft##n4(z+n4*2);\
|
||||
fft##n4(z+n4*3);\
|
||||
pass(z,FFT_NAME(ff_cos_##n),n4/2);\
|
||||
}
|
||||
|
||||
static void fft4(FFTComplex *z)
|
||||
{
|
||||
FFTDouble t1, t2, t3, t4, t5, t6, t7, t8;
|
||||
|
||||
BF(t3, t1, z[0].re, z[1].re);
|
||||
BF(t8, t6, z[3].re, z[2].re);
|
||||
BF(z[2].re, z[0].re, t1, t6);
|
||||
BF(t4, t2, z[0].im, z[1].im);
|
||||
BF(t7, t5, z[2].im, z[3].im);
|
||||
BF(z[3].im, z[1].im, t4, t8);
|
||||
BF(z[3].re, z[1].re, t3, t7);
|
||||
BF(z[2].im, z[0].im, t2, t5);
|
||||
}
|
||||
|
||||
static void fft8(FFTComplex *z)
|
||||
{
|
||||
FFTDouble t1, t2, t3, t4, t5, t6;
|
||||
|
||||
fft4(z);
|
||||
|
||||
BF(t1, z[5].re, z[4].re, -z[5].re);
|
||||
BF(t2, z[5].im, z[4].im, -z[5].im);
|
||||
BF(t5, z[7].re, z[6].re, -z[7].re);
|
||||
BF(t6, z[7].im, z[6].im, -z[7].im);
|
||||
|
||||
BUTTERFLIES(z[0],z[2],z[4],z[6]);
|
||||
TRANSFORM(z[1],z[3],z[5],z[7],sqrthalf,sqrthalf);
|
||||
}
|
||||
|
||||
#if !CONFIG_SMALL
|
||||
static void fft16(FFTComplex *z)
|
||||
{
|
||||
FFTDouble t1, t2, t3, t4, t5, t6;
|
||||
FFTSample cos_16_1 = FFT_NAME(ff_cos_16)[1];
|
||||
FFTSample cos_16_3 = FFT_NAME(ff_cos_16)[3];
|
||||
|
||||
fft8(z);
|
||||
fft4(z+8);
|
||||
fft4(z+12);
|
||||
|
||||
TRANSFORM_ZERO(z[0],z[4],z[8],z[12]);
|
||||
TRANSFORM(z[2],z[6],z[10],z[14],sqrthalf,sqrthalf);
|
||||
TRANSFORM(z[1],z[5],z[9],z[13],cos_16_1,cos_16_3);
|
||||
TRANSFORM(z[3],z[7],z[11],z[15],cos_16_3,cos_16_1);
|
||||
}
|
||||
#else
|
||||
DECL_FFT(16,8,4)
|
||||
#endif
|
||||
DECL_FFT(32,16,8)
|
||||
DECL_FFT(64,32,16)
|
||||
DECL_FFT(128,64,32)
|
||||
DECL_FFT(256,128,64)
|
||||
DECL_FFT(512,256,128)
|
||||
#if !CONFIG_SMALL
|
||||
#define pass pass_big
|
||||
#endif
|
||||
DECL_FFT(1024,512,256)
|
||||
DECL_FFT(2048,1024,512)
|
||||
DECL_FFT(4096,2048,1024)
|
||||
DECL_FFT(8192,4096,2048)
|
||||
DECL_FFT(16384,8192,4096)
|
||||
DECL_FFT(32768,16384,8192)
|
||||
DECL_FFT(65536,32768,16384)
|
||||
|
||||
static void (* const fft_dispatch[])(FFTComplex*) = {
|
||||
fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512, fft1024,
|
||||
fft2048, fft4096, fft8192, fft16384, fft32768, fft65536,
|
||||
};
|
||||
|
||||
static void ff_fft_calc_c(FFTContext *s, FFTComplex *z)
|
||||
{
|
||||
fft_dispatch[s->nbits-2](z);
|
||||
}
|
||||
|
213
neo/libs/libbinkdec/src/mdct.c
Normal file
213
neo/libs/libbinkdec/src/mdct.c
Normal file
|
@ -0,0 +1,213 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out includes for headers
|
||||
* 'libavutil/mathematics.h' and 'libavutil/common.h' which are part of the FFmpeg project. These files are
|
||||
* not available in this project and have therefore been unreferenced. All uses of the function 'av_malloc' from FFmpeg have been replaced
|
||||
* with a standard 'malloc' function call. All uses of the function 'av_freep' from FFmpeg have been replaced with a standard 'free'
|
||||
* function call. This file is otherwise identical to the FFmpeg original.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MDCT/IMDCT transforms
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
//#include "libavutil/common.h"
|
||||
//#include "libavutil/mathematics.h"
|
||||
#include "fft.h"
|
||||
#include "fft-internal.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* MDCT/IMDCT transforms.
|
||||
*/
|
||||
|
||||
#if CONFIG_FFT_FLOAT
|
||||
# define RSCALE(x) (x)
|
||||
#else
|
||||
# define RSCALE(x) ((x) >> 1)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* init MDCT or IMDCT computation.
|
||||
*/
|
||||
av_cold int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale)
|
||||
{
|
||||
int n, n4, i;
|
||||
double alpha, theta;
|
||||
int tstep;
|
||||
|
||||
memset(s, 0, sizeof(*s));
|
||||
n = 1 << nbits;
|
||||
s->mdct_bits = nbits;
|
||||
s->mdct_size = n;
|
||||
n4 = n >> 2;
|
||||
s->mdct_permutation = FF_MDCT_PERM_NONE;
|
||||
|
||||
if (ff_fft_init(s, s->mdct_bits - 2, inverse) < 0)
|
||||
goto fail;
|
||||
|
||||
s->tcos = (FFTSample*)malloc(n/2 * sizeof(FFTSample));
|
||||
|
||||
if (!s->tcos)
|
||||
goto fail;
|
||||
|
||||
switch (s->mdct_permutation) {
|
||||
case FF_MDCT_PERM_NONE:
|
||||
s->tsin = s->tcos + n4;
|
||||
tstep = 1;
|
||||
break;
|
||||
case FF_MDCT_PERM_INTERLEAVE:
|
||||
s->tsin = s->tcos + 1;
|
||||
tstep = 2;
|
||||
break;
|
||||
default:
|
||||
goto fail;
|
||||
}
|
||||
|
||||
theta = 1.0 / 8.0 + (scale < 0 ? n4 : 0);
|
||||
scale = sqrt(fabs(scale));
|
||||
for(i=0;i<n4;i++) {
|
||||
alpha = 2 * M_PI * (i + theta) / n;
|
||||
s->tcos[i*tstep] = FIX15(-cos(alpha) * scale);
|
||||
s->tsin[i*tstep] = FIX15(-sin(alpha) * scale);
|
||||
}
|
||||
return 0;
|
||||
fail:
|
||||
ff_mdct_end(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the middle half of the inverse MDCT of size N = 2^nbits,
|
||||
* thus excluding the parts that can be derived by symmetry
|
||||
* @param output N/2 samples
|
||||
* @param input N/2 samples
|
||||
*/
|
||||
void ff_imdct_half_c(FFTContext *s, FFTSample *output, const FFTSample *input)
|
||||
{
|
||||
int k, n8, n4, n2, n, j;
|
||||
const uint16_t *revtab = s->revtab;
|
||||
const FFTSample *tcos = s->tcos;
|
||||
const FFTSample *tsin = s->tsin;
|
||||
const FFTSample *in1, *in2;
|
||||
FFTComplex *z = (FFTComplex *)output;
|
||||
|
||||
n = 1 << s->mdct_bits;
|
||||
n2 = n >> 1;
|
||||
n4 = n >> 2;
|
||||
n8 = n >> 3;
|
||||
|
||||
/* pre rotation */
|
||||
in1 = input;
|
||||
in2 = input + n2 - 1;
|
||||
for(k = 0; k < n4; k++) {
|
||||
j=revtab[k];
|
||||
CMUL(z[j].re, z[j].im, *in2, *in1, tcos[k], tsin[k]);
|
||||
in1 += 2;
|
||||
in2 -= 2;
|
||||
}
|
||||
s->fft_calc(s, z);
|
||||
|
||||
/* post rotation + reordering */
|
||||
for(k = 0; k < n8; k++) {
|
||||
FFTSample r0, i0, r1, i1;
|
||||
CMUL(r0, i1, z[n8-k-1].im, z[n8-k-1].re, tsin[n8-k-1], tcos[n8-k-1]);
|
||||
CMUL(r1, i0, z[n8+k ].im, z[n8+k ].re, tsin[n8+k ], tcos[n8+k ]);
|
||||
z[n8-k-1].re = r0;
|
||||
z[n8-k-1].im = i0;
|
||||
z[n8+k ].re = r1;
|
||||
z[n8+k ].im = i1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute inverse MDCT of size N = 2^nbits
|
||||
* @param output N samples
|
||||
* @param input N/2 samples
|
||||
*/
|
||||
void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input)
|
||||
{
|
||||
int k;
|
||||
int n = 1 << s->mdct_bits;
|
||||
int n2 = n >> 1;
|
||||
int n4 = n >> 2;
|
||||
|
||||
ff_imdct_half_c(s, output+n4, input);
|
||||
|
||||
for(k = 0; k < n4; k++) {
|
||||
output[k] = -output[n2-k-1];
|
||||
output[n-k-1] = output[n2+k];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute MDCT of size N = 2^nbits
|
||||
* @param input N samples
|
||||
* @param out N/2 samples
|
||||
*/
|
||||
void ff_mdct_calc_c(FFTContext *s, FFTSample *out, const FFTSample *input)
|
||||
{
|
||||
int i, j, n, n8, n4, n2, n3;
|
||||
FFTDouble re, im;
|
||||
const uint16_t *revtab = s->revtab;
|
||||
const FFTSample *tcos = s->tcos;
|
||||
const FFTSample *tsin = s->tsin;
|
||||
FFTComplex *x = (FFTComplex *)out;
|
||||
|
||||
n = 1 << s->mdct_bits;
|
||||
n2 = n >> 1;
|
||||
n4 = n >> 2;
|
||||
n8 = n >> 3;
|
||||
n3 = 3 * n4;
|
||||
|
||||
/* pre rotation */
|
||||
for(i=0;i<n8;i++) {
|
||||
re = RSCALE(-input[2*i+n3] - input[n3-1-2*i]);
|
||||
im = RSCALE(-input[n4+2*i] + input[n4-1-2*i]);
|
||||
j = revtab[i];
|
||||
CMUL(x[j].re, x[j].im, re, im, -tcos[i], tsin[i]);
|
||||
|
||||
re = RSCALE( input[2*i] - input[n2-1-2*i]);
|
||||
im = RSCALE(-input[n2+2*i] - input[ n-1-2*i]);
|
||||
j = revtab[n8 + i];
|
||||
CMUL(x[j].re, x[j].im, re, im, -tcos[n8 + i], tsin[n8 + i]);
|
||||
}
|
||||
|
||||
s->fft_calc(s, x);
|
||||
|
||||
/* post rotation */
|
||||
for(i=0;i<n8;i++) {
|
||||
FFTSample r0, i0, r1, i1;
|
||||
CMUL(i1, r0, x[n8-i-1].re, x[n8-i-1].im, -tsin[n8-i-1], -tcos[n8-i-1]);
|
||||
CMUL(i0, r1, x[n8+i ].re, x[n8+i ].im, -tsin[n8+i ], -tcos[n8+i ]);
|
||||
x[n8-i-1].re = r0;
|
||||
x[n8-i-1].im = i0;
|
||||
x[n8+i ].re = r1;
|
||||
x[n8+i ].im = i1;
|
||||
}
|
||||
}
|
||||
|
||||
av_cold void ff_mdct_end(FFTContext *s)
|
||||
{
|
||||
free(s->tcos);
|
||||
s->tcos = 0;
|
||||
ff_fft_end(s);
|
||||
}
|
140
neo/libs/libbinkdec/src/rdft.c
Normal file
140
neo/libs/libbinkdec/src/rdft.c
Normal file
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
* This file has been modified from its original release by Barry Duncan to comment out an include for header
|
||||
* 'libavutil/mathematics.h' which is part of the FFmpeg project. This file is not available in this project
|
||||
* and has therefore been unreferenced. The line which checks 'HAVE_MMX' has been commented out.
|
||||
* This file is otherwise identical to the FFmpeg original.
|
||||
*/
|
||||
|
||||
/*
|
||||
* (I)RDFT transforms
|
||||
* Copyright (c) 2009 Alex Converse <alex dot converse at gmail dot 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 <stdlib.h>
|
||||
#include <math.h>
|
||||
//#include "libavutil/mathematics.h"
|
||||
#include "rdft.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* (Inverse) Real Discrete Fourier Transforms.
|
||||
*/
|
||||
|
||||
/* sin(2*pi*x/n) for 0<=x<n/4, followed by n/2<=x<3n/4 */
|
||||
#if !CONFIG_HARDCODED_TABLES
|
||||
SINTABLE(16);
|
||||
SINTABLE(32);
|
||||
SINTABLE(64);
|
||||
SINTABLE(128);
|
||||
SINTABLE(256);
|
||||
SINTABLE(512);
|
||||
SINTABLE(1024);
|
||||
SINTABLE(2048);
|
||||
SINTABLE(4096);
|
||||
SINTABLE(8192);
|
||||
SINTABLE(16384);
|
||||
SINTABLE(32768);
|
||||
SINTABLE(65536);
|
||||
#endif
|
||||
static SINTABLE_CONST FFTSample * const ff_sin_tabs[] = {
|
||||
NULL, NULL, NULL, NULL,
|
||||
ff_sin_16, ff_sin_32, ff_sin_64, ff_sin_128, ff_sin_256, ff_sin_512, ff_sin_1024,
|
||||
ff_sin_2048, ff_sin_4096, ff_sin_8192, ff_sin_16384, ff_sin_32768, ff_sin_65536,
|
||||
};
|
||||
|
||||
/** Map one real FFT into two parallel real even and odd FFTs. Then interleave
|
||||
* the two real FFTs into one complex FFT. Unmangle the results.
|
||||
* ref: http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM
|
||||
*/
|
||||
static void ff_rdft_calc_c(RDFTContext* s, FFTSample* data)
|
||||
{
|
||||
int i, i1, i2;
|
||||
FFTComplex ev, od;
|
||||
const int n = 1 << s->nbits;
|
||||
const float k1 = 0.5f;
|
||||
const float k2 = 0.5f - s->inverse;
|
||||
const FFTSample *tcos = s->tcos;
|
||||
const FFTSample *tsin = s->tsin;
|
||||
|
||||
if (!s->inverse) {
|
||||
s->fft.fft_permute(&s->fft, (FFTComplex*)data);
|
||||
s->fft.fft_calc(&s->fft, (FFTComplex*)data);
|
||||
}
|
||||
/* i=0 is a special case because of packing, the DC term is real, so we
|
||||
are going to throw the N/2 term (also real) in with it. */
|
||||
ev.re = data[0];
|
||||
data[0] = ev.re+data[1];
|
||||
data[1] = ev.re-data[1];
|
||||
for (i = 1; i < (n>>2); i++) {
|
||||
i1 = 2*i;
|
||||
i2 = n-i1;
|
||||
/* Separate even and odd FFTs */
|
||||
ev.re = k1*(data[i1 ]+data[i2 ]);
|
||||
od.im = -k2*(data[i1 ]-data[i2 ]);
|
||||
ev.im = k1*(data[i1+1]-data[i2+1]);
|
||||
od.re = k2*(data[i1+1]+data[i2+1]);
|
||||
/* Apply twiddle factors to the odd FFT and add to the even FFT */
|
||||
data[i1 ] = ev.re + od.re*tcos[i] - od.im*tsin[i];
|
||||
data[i1+1] = ev.im + od.im*tcos[i] + od.re*tsin[i];
|
||||
data[i2 ] = ev.re - od.re*tcos[i] + od.im*tsin[i];
|
||||
data[i2+1] = -ev.im + od.im*tcos[i] + od.re*tsin[i];
|
||||
}
|
||||
data[2*i+1]=s->sign_convention*data[2*i+1];
|
||||
if (s->inverse) {
|
||||
data[0] *= k1;
|
||||
data[1] *= k1;
|
||||
s->fft.fft_permute(&s->fft, (FFTComplex*)data);
|
||||
s->fft.fft_calc(&s->fft, (FFTComplex*)data);
|
||||
}
|
||||
}
|
||||
|
||||
av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
|
||||
{
|
||||
int n = 1 << nbits;
|
||||
int i;
|
||||
const double theta = (trans == DFT_R2C || trans == DFT_C2R ? -1 : 1)*2*M_PI/n;
|
||||
|
||||
s->nbits = nbits;
|
||||
s->inverse = trans == IDFT_C2R || trans == DFT_C2R;
|
||||
s->sign_convention = trans == IDFT_R2C || trans == DFT_C2R ? 1 : -1;
|
||||
|
||||
if (nbits < 4 || nbits > 16)
|
||||
return -1;
|
||||
|
||||
if (ff_fft_init(&s->fft, nbits-1, trans == IDFT_C2R || trans == IDFT_R2C) < 0)
|
||||
return -1;
|
||||
|
||||
ff_init_ff_cos_tabs(nbits);
|
||||
s->tcos = ff_cos_tabs[nbits];
|
||||
s->tsin = ff_sin_tabs[nbits]+(trans == DFT_R2C || trans == DFT_C2R)*(n>>2);
|
||||
#if !CONFIG_HARDCODED_TABLES
|
||||
for (i = 0; i < (n>>2); i++) {
|
||||
s->tsin[i] = sin(i*theta);
|
||||
}
|
||||
#endif
|
||||
s->rdft_calc = ff_rdft_calc_c;
|
||||
|
||||
// if (ARCH_ARM) ff_rdft_init_arm(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
av_cold void ff_rdft_end(RDFTContext *s)
|
||||
{
|
||||
ff_fft_end(&s->fft);
|
||||
}
|
20
neo/libs/libbinkdec/win32/VS2010/binkdec_dynamic.sln
Normal file
20
neo/libs/libbinkdec/win32/VS2010/binkdec_dynamic.sln
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual C++ Express 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "binkdec_dynamic", "binkdec_dynamic.vcxproj", "{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
120
neo/libs/libbinkdec/win32/VS2010/binkdec_dynamic.vcxproj
Normal file
120
neo/libs/libbinkdec/win32/VS2010/binkdec_dynamic.vcxproj
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E92ED1F6-64A1-43CF-BD8A-4D6B68CB7EEC}</ProjectGuid>
|
||||
<RootNamespace>binkdec_dynamic</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<TargetName>libbinkdec</TargetName>
|
||||
<IncludePath>C:\BinkW32;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>C:\BinkW32;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<TargetName>libbinkdec</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
||||
<SmallerTypeCheck>false</SmallerTypeCheck>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ModuleDefinitionFile>../binkdec.def</ModuleDefinitionFile>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Full</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<StringPooling>true</StringPooling>
|
||||
<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<ModuleDefinitionFile>../binkdec.def</ModuleDefinitionFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\avfft.h" />
|
||||
<ClInclude Include="..\..\include\BinkAudio.h" />
|
||||
<ClInclude Include="..\..\include\binkdata.h" />
|
||||
<ClInclude Include="..\..\include\BinkDecoder.h" />
|
||||
<ClInclude Include="..\..\include\BinkVideo.h" />
|
||||
<ClInclude Include="..\..\include\BitReader.h" />
|
||||
<ClInclude Include="..\..\include\dct.h" />
|
||||
<ClInclude Include="..\..\include\dct32.h" />
|
||||
<ClInclude Include="..\..\include\FFmpeg_includes.h" />
|
||||
<ClInclude Include="..\..\include\fft-internal.h" />
|
||||
<ClInclude Include="..\..\include\fft.h" />
|
||||
<ClInclude Include="..\..\include\FileStream.h" />
|
||||
<ClInclude Include="..\..\include\HuffmanVLC.h" />
|
||||
<ClInclude Include="..\..\include\LogError.h" />
|
||||
<ClInclude Include="..\..\include\rdft.h" />
|
||||
<ClInclude Include="..\..\include\Util.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\avfft.c" />
|
||||
<ClCompile Include="..\..\src\BinkAudio.cpp" />
|
||||
<ClCompile Include="..\..\src\BinkDecoder.cpp" />
|
||||
<ClCompile Include="..\..\src\BinkVideo.cpp" />
|
||||
<ClCompile Include="..\..\src\BitReader.cpp" />
|
||||
<ClCompile Include="..\..\src\dct.c" />
|
||||
<ClCompile Include="..\..\src\dct32.c" />
|
||||
<ClCompile Include="..\..\src\fft.c" />
|
||||
<ClCompile Include="..\..\src\FileStream.cpp" />
|
||||
<ClCompile Include="..\..\src\HuffmanVLC.cpp" />
|
||||
<ClCompile Include="..\..\src\LogError.cpp" />
|
||||
<ClCompile Include="..\..\src\mdct.c" />
|
||||
<ClCompile Include="..\..\src\rdft.c" />
|
||||
<ClCompile Include="..\..\src\Util.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\binkdec.def" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
15
neo/libs/libbinkdec/win32/binkdec.def
Normal file
15
neo/libs/libbinkdec/win32/binkdec.def
Normal file
|
@ -0,0 +1,15 @@
|
|||
LIBRARY
|
||||
EXPORTS
|
||||
|
||||
; functions
|
||||
Bink_Open
|
||||
Bink_Close
|
||||
Bink_GetNumAudioTracks
|
||||
Bink_GetAudioTrackDetails
|
||||
Bink_GetAudioData
|
||||
Bink_GetNumFrames
|
||||
Bink_GetCurrentFrameNum
|
||||
Bink_GetNextFrame
|
||||
Bink_GetFrameSize
|
||||
Bink_GetFrameRate
|
||||
Bink_GotoFrame
|
|
@ -66,6 +66,17 @@ extern "C"
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_BINKDEC
|
||||
// DG: not sure how to use FFMPEG and BINKDEC at the same time.. it might be useful if someone wants to
|
||||
// use binkdec for bink and FFMPEG for other formats in custom code so I didn't just rip FFMPEG out
|
||||
// But right now it's unsupported, if you need this adjust the video loading code etc yourself
|
||||
#ifdef USE_FFMPEG
|
||||
#error "Currently, only one of FFMPEG and BINKDEC is supported at a time!"
|
||||
#endif
|
||||
|
||||
#include <BinkDecoder.h>
|
||||
#endif // USE_BINKDEC
|
||||
|
||||
class idCinematicLocal : public idCinematic
|
||||
{
|
||||
public:
|
||||
|
@ -97,6 +108,19 @@ private:
|
|||
cinData_t ImageForTimeFFMPEG( int milliseconds );
|
||||
bool InitFromFFMPEGFile( const char* qpath, bool looping );
|
||||
void FFMPEGReset();
|
||||
#endif
|
||||
#ifdef USE_BINKDEC
|
||||
BinkHandle binkHandle;
|
||||
cinData_t ImageForTimeBinkDec( int milliseconds );
|
||||
bool InitFromBinkDecFile( const char* qpath, bool looping );
|
||||
void BinkDecReset();
|
||||
|
||||
YUVbuffer yuvBuffer;
|
||||
int framePos;
|
||||
int numFrames;
|
||||
idImage* imgY;
|
||||
idImage* imgCr;
|
||||
idImage* imgCb;
|
||||
#endif
|
||||
idImage* img;
|
||||
bool isRoQ;
|
||||
|
@ -400,6 +424,38 @@ idCinematicLocal::idCinematicLocal()
|
|||
hasFrame = false;
|
||||
#endif
|
||||
|
||||
#ifdef USE_BINKDEC
|
||||
binkHandle.isValid = false;
|
||||
binkHandle.instanceIndex = -1; // whatever this is, it now has a deterministic value
|
||||
framePos = -1;
|
||||
numFrames = 0;
|
||||
|
||||
imgY = globalImages->AllocStandaloneImage( "_cinematicY" );
|
||||
imgCr = globalImages->AllocStandaloneImage( "_cinematicCr" );
|
||||
imgCb = globalImages->AllocStandaloneImage( "_cinematicCb" );
|
||||
{
|
||||
idImageOpts opts;
|
||||
opts.format = FMT_LUM8;
|
||||
opts.colorFormat = CFM_DEFAULT;
|
||||
opts.width = 32;
|
||||
opts.height = 32;
|
||||
opts.numLevels = 1;
|
||||
if( imgY != NULL )
|
||||
{
|
||||
imgY->AllocImage( opts, TF_LINEAR, TR_REPEAT );
|
||||
}
|
||||
if( imgCr != NULL )
|
||||
{
|
||||
imgCr->AllocImage( opts, TF_LINEAR, TR_REPEAT );
|
||||
}
|
||||
if( imgCb != NULL )
|
||||
{
|
||||
imgCb->AllocImage( opts, TF_LINEAR, TR_REPEAT );
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Carl: Original Doom 3 RoQ files:
|
||||
image = NULL;
|
||||
status = FMV_EOF;
|
||||
|
@ -457,6 +513,20 @@ idCinematicLocal::~idCinematicLocal()
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_BINKDEC
|
||||
if( binkHandle.isValid )
|
||||
{
|
||||
Bink_Close( binkHandle );
|
||||
}
|
||||
|
||||
delete imgY;
|
||||
imgY = NULL;
|
||||
delete imgCr;
|
||||
imgCr = NULL;
|
||||
delete imgCr;
|
||||
imgCb = NULL;
|
||||
#endif
|
||||
|
||||
delete img;
|
||||
img = NULL;
|
||||
}
|
||||
|
@ -599,6 +669,80 @@ void idCinematicLocal::FFMPEGReset()
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_BINKDEC
|
||||
bool idCinematicLocal::InitFromBinkDecFile( const char* qpath, bool amilooping )
|
||||
{
|
||||
int ret;
|
||||
looping = amilooping;
|
||||
startTime = 0;
|
||||
isRoQ = false;
|
||||
CIN_HEIGHT = DEFAULT_CIN_HEIGHT;
|
||||
CIN_WIDTH = DEFAULT_CIN_WIDTH;
|
||||
|
||||
idStr fullpath;
|
||||
idFile* testFile = fileSystem->OpenFileRead( qpath );
|
||||
if( testFile )
|
||||
{
|
||||
fullpath = testFile->GetFullPath();
|
||||
fileSystem->CloseFile( testFile );
|
||||
}
|
||||
// RB: case sensitivity HACK for Linux
|
||||
else if( idStr::Cmpn( qpath, "sound/vo", 8 ) == 0 )
|
||||
{
|
||||
idStr newPath( qpath );
|
||||
newPath.Replace( "sound/vo", "sound/VO" );
|
||||
|
||||
testFile = fileSystem->OpenFileRead( newPath );
|
||||
if( testFile )
|
||||
{
|
||||
fullpath = testFile->GetFullPath();
|
||||
fileSystem->CloseFile( testFile );
|
||||
}
|
||||
else
|
||||
{
|
||||
common->Warning( "idCinematic: Cannot open BinkDec video file: '%s', %d\n", qpath, looping );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
binkHandle = Bink_Open( fullpath );
|
||||
if( !binkHandle.isValid )
|
||||
{
|
||||
common->Warning( "idCinematic: Cannot open BinkDec video file: '%s', %d\n", qpath, looping );
|
||||
return false;
|
||||
}
|
||||
|
||||
{
|
||||
uint32_t w = 0, h = 0;
|
||||
Bink_GetFrameSize( binkHandle, w, h );
|
||||
CIN_WIDTH = w;
|
||||
CIN_HEIGHT = h;
|
||||
}
|
||||
|
||||
frameRate = Bink_GetFrameRate( binkHandle );
|
||||
numFrames = Bink_GetNumFrames( binkHandle );
|
||||
float durationSec = frameRate * numFrames;
|
||||
animationLength = durationSec;
|
||||
buf = NULL;
|
||||
|
||||
common->Printf( "Loaded BinkDec file: '%s', looping=%d%dx%d, %f FPS, %f sec\n", qpath, looping, CIN_WIDTH, CIN_HEIGHT, frameRate, durationSec );
|
||||
|
||||
status = FMV_PLAY;
|
||||
|
||||
startTime = Sys_Milliseconds();
|
||||
memset( yuvBuffer, 0, sizeof( yuvBuffer ) );
|
||||
framePos = -1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void idCinematicLocal::BinkDecReset()
|
||||
{
|
||||
framePos = -1;
|
||||
Bink_GotoFrame( binkHandle, 0 );
|
||||
status = FMV_LOOPED;
|
||||
}
|
||||
#endif // USE_BINKDEC
|
||||
|
||||
/*
|
||||
==============
|
||||
|
@ -646,6 +790,13 @@ bool idCinematicLocal::InitFromFile( const char* qpath, bool amilooping )
|
|||
fileName = temp;
|
||||
//idLib::Warning( "New filename: '%s'\n", fileName.c_str() );
|
||||
return InitFromFFMPEGFile( fileName.c_str(), amilooping );
|
||||
#elif defined(USE_BINKDEC)
|
||||
idStr temp = fileName.StripFileExtension() + ".bik";
|
||||
animationLength = 0;
|
||||
RoQShutdown();
|
||||
fileName = temp;
|
||||
//idLib::Warning( "New filename: '%s'\n", fileName.c_str() );
|
||||
return InitFromBinkDecFile( fileName.c_str(), amilooping );
|
||||
#else
|
||||
animationLength = 0;
|
||||
return false;
|
||||
|
@ -727,6 +878,14 @@ void idCinematicLocal::Close()
|
|||
status = FMV_EOF;
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_BINKDEC
|
||||
if( !isRoQ && binkHandle.isValid )
|
||||
{
|
||||
memset( yuvBuffer, 0 , sizeof( yuvBuffer ) );
|
||||
Bink_Close( binkHandle );
|
||||
status = FMV_EOF;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -769,6 +928,10 @@ cinData_t idCinematicLocal::ImageForTime( int thisTime )
|
|||
if( !isRoQ )
|
||||
return ImageForTimeFFMPEG( thisTime );
|
||||
#endif
|
||||
#ifdef USE_BINKDEC // DG: libbinkdec support
|
||||
if( !isRoQ )
|
||||
return ImageForTimeBinkDec( thisTime );
|
||||
#endif
|
||||
|
||||
// Carl: Handle original Doom 3 RoQ video files
|
||||
cinData_t cinData;
|
||||
|
@ -997,6 +1160,128 @@ cinData_t idCinematicLocal::ImageForTimeFFMPEG( int thisTime )
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef USE_BINKDEC
|
||||
cinData_t idCinematicLocal::ImageForTimeBinkDec( int thisTime )
|
||||
{
|
||||
cinData_t cinData = {0};
|
||||
|
||||
if( thisTime <= 0 )
|
||||
{
|
||||
thisTime = Sys_Milliseconds();
|
||||
}
|
||||
|
||||
if( r_skipDynamicTextures.GetBool() || status == FMV_EOF || status == FMV_IDLE )
|
||||
{
|
||||
return cinData;
|
||||
}
|
||||
|
||||
if( !binkHandle.isValid )
|
||||
{
|
||||
// RB: .bik requested but not found
|
||||
return cinData;
|
||||
}
|
||||
|
||||
if( startTime == -1 )
|
||||
{
|
||||
BinkDecReset();
|
||||
startTime = thisTime;
|
||||
}
|
||||
|
||||
int desiredFrame = ( ( thisTime - startTime ) * frameRate ) / 1000.0f;
|
||||
if( desiredFrame < 0 )
|
||||
{
|
||||
desiredFrame = 0;
|
||||
}
|
||||
|
||||
if( desiredFrame >= numFrames )
|
||||
{
|
||||
status = FMV_EOF;
|
||||
if( looping )
|
||||
{
|
||||
desiredFrame = 0;
|
||||
BinkDecReset();
|
||||
framePos = -1;
|
||||
startTime = thisTime;
|
||||
status = FMV_PLAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = FMV_IDLE;
|
||||
return cinData;
|
||||
}
|
||||
}
|
||||
|
||||
if( desiredFrame == framePos )
|
||||
{
|
||||
cinData.imageWidth = CIN_WIDTH;
|
||||
cinData.imageHeight = CIN_HEIGHT;
|
||||
cinData.status = status;
|
||||
|
||||
cinData.imageY = imgY;
|
||||
cinData.imageCr = imgCr;
|
||||
cinData.imageCb = imgCb;
|
||||
return cinData;
|
||||
}
|
||||
|
||||
// Bink_GotoFrame(binkHandle, desiredFrame);
|
||||
// apparently Bink_GotoFrame() doesn't work super well, so skip frames
|
||||
// (if necessary) by calling Bink_GetNextFrame()
|
||||
while( framePos < desiredFrame )
|
||||
{
|
||||
framePos = Bink_GetNextFrame( binkHandle, yuvBuffer );
|
||||
}
|
||||
|
||||
cinData.imageWidth = CIN_WIDTH;
|
||||
cinData.imageHeight = CIN_HEIGHT;
|
||||
cinData.status = status;
|
||||
|
||||
double invAspRat = double( CIN_HEIGHT ) / double( CIN_WIDTH );
|
||||
|
||||
idImage* imgs[3] = {imgY, imgCb, imgCr}; // that's the order of the channels in yuvBuffer[]
|
||||
for( int i = 0; i < 3; ++i )
|
||||
{
|
||||
// Note: img->UploadScratch() seems to assume 32bit per pixel data, but this is 8bit/pixel
|
||||
// so uploading is a bit more manual here (compared to ffmpeg or RoQ)
|
||||
idImage* img = imgs[i];
|
||||
int w = yuvBuffer[i].width;
|
||||
int h = yuvBuffer[i].height;
|
||||
// some videos, including the logo video and the main menu background,
|
||||
// seem to have superfluous rows in at least some of the channels,
|
||||
// leading to a black or glitchy bar at the bottom of the video.
|
||||
// cut that off by reducing the height to the expected height
|
||||
if( h > CIN_HEIGHT )
|
||||
{
|
||||
h = CIN_HEIGHT;
|
||||
}
|
||||
else if( h < CIN_HEIGHT )
|
||||
{
|
||||
// the U and V channels have a lower resolution than the Y channel
|
||||
// (or the logical video resolution), so use the aspect ratio to
|
||||
// calculate the real height
|
||||
int hExp = invAspRat * w + 0.5;
|
||||
if( h > hExp )
|
||||
h = hExp;
|
||||
}
|
||||
|
||||
if( img->GetUploadWidth() != w || img->GetUploadHeight() != h )
|
||||
{
|
||||
idImageOpts opts = img->GetOpts();
|
||||
opts.width = w;
|
||||
opts.height = h;
|
||||
img->AllocImage( opts, TF_LINEAR, TR_REPEAT );
|
||||
}
|
||||
img->SubImageUpload( 0, 0, 0, 0, w, h, yuvBuffer[i].data );
|
||||
}
|
||||
|
||||
cinData.imageY = imgY;
|
||||
cinData.imageCr = imgCr;
|
||||
cinData.imageCb = imgCb;
|
||||
|
||||
return cinData;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
==============
|
||||
idCinematicLocal::move8_32
|
||||
|
|
|
@ -433,7 +433,8 @@ static void RB_BindVariableStageImage( const textureStage_t* texture, const floa
|
|||
cin.imageCr->Bind();
|
||||
GL_SelectTexture( 2 );
|
||||
cin.imageCb->Bind();
|
||||
|
||||
// DG: imageY is only used for bink videos (with libbinkdec), so the bink shader must be used
|
||||
renderProgManager.BindShader_Bink();
|
||||
}
|
||||
else if( cin.image != NULL )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue