* qatar/master: isom: sort and pretty-print codec_movaudio_tags[] isom: remove pointless comments in codec_movaudio_tags[] isom: remove commented-out tag for vorbis movenc: write 'chan' tag for AC-3 in MOV mov: add support for reading and writing the 'chan' tag audioconvert: add some additional channel and channel layout macros audioconvert: change 7.1 "wide" layout to use side surround channels movenc: simplify handling of pcm vs. adpcm vs. other compressed codecs doc: update documentation to use avconv doc: update demuxers section doc: extend external library coverage doc: split platform specific information doc: port the git-howto to texinfo doc: provide fallback css and customize @float doc: document fate in a texinfo doxy: change hue value to match our green Conflicts: doc/fate.txt doc/ffserver.texi doc/general.texi doc/muxers.texi doc/protocols.texi doc/t2h.init libavformat/isom.c libavformat/mov.c libavutil/avutil.h tests/ref/acodec/pcm_s16be tests/ref/acodec/pcm_s24be tests/ref/acodec/pcm_s32be tests/ref/acodec/pcm_s8 tests/ref/lavf/mov Merged-by: Michael Niedermayer <michaelni@gmx.at>pull/2/head
commit
c59b80c8d3
27 changed files with 1786 additions and 541 deletions
@ -0,0 +1,135 @@ |
|||||||
|
\input texinfo @c -*- texinfo -*- |
||||||
|
|
||||||
|
@settitle FATE Automated Testing Environment |
||||||
|
@titlepage |
||||||
|
@center @titlefont{FATE Automated Testing Environment} |
||||||
|
@end titlepage |
||||||
|
|
||||||
|
@top |
||||||
|
|
||||||
|
@contents |
||||||
|
|
||||||
|
@chapter Introduction |
||||||
|
|
||||||
|
FATE provides a regression testsuite embedded within the FFmpeg build system. |
||||||
|
It can be run locally and optionally configured to send reports to a web |
||||||
|
aggregator and viewer @url{http://fate.ffmpeg.org}. |
||||||
|
|
||||||
|
It is advised to run FATE before submitting patches to the current codebase |
||||||
|
and provide new tests when submitting patches to add additional features. |
||||||
|
|
||||||
|
@chapter Running FATE |
||||||
|
|
||||||
|
@section Samples and References |
||||||
|
In order to run, FATE needs a large amount of data (samples and references) |
||||||
|
that is provided separately from the actual source distribution. |
||||||
|
|
||||||
|
To inform the build system about the testsuite location, pass |
||||||
|
@option{--samples=<path to the samples>} to @command{configure} or set the |
||||||
|
@var{SAMPLES} Make variable or the @var{FATE_SAMPLES} environment variable |
||||||
|
to a suitable value. |
||||||
|
|
||||||
|
The dataset is available through @command{rsync}, is possible to fetch |
||||||
|
the current sample using the straight rsync command or through a specific |
||||||
|
@ref{Makefile target}. |
||||||
|
|
||||||
|
@example |
||||||
|
# rsync -aL rsync://fate.ffmpeg.org/fate-suite/ fate-suite |
||||||
|
@end example |
||||||
|
|
||||||
|
@example |
||||||
|
# make fate-rsync SAMPLES=fate-suite |
||||||
|
@end example |
||||||
|
|
||||||
|
|
||||||
|
@chapter Manual Run |
||||||
|
FATE regression test can be run through @command{make}. |
||||||
|
Specific Makefile targets and Makefile variables are available: |
||||||
|
|
||||||
|
@anchor{Makefile target} |
||||||
|
@section FATE Makefile targets |
||||||
|
@table @option |
||||||
|
@item fate-list |
||||||
|
List all fate/regression test targets. |
||||||
|
@item fate-rsync |
||||||
|
Shortcut to download the fate test samples to the specified testsuite location. |
||||||
|
@item fate |
||||||
|
Run the FATE test suite (requires the fate-suite dataset). |
||||||
|
@end table |
||||||
|
|
||||||
|
@section Fate Makefile variables |
||||||
|
@table @option |
||||||
|
@item V |
||||||
|
Verbosity level, can be set to 0, 1 or 2. |
||||||
|
@table @option |
||||||
|
@item 0 |
||||||
|
show just the test arguments |
||||||
|
@item 1 |
||||||
|
show just the command used in the test |
||||||
|
@item 2 |
||||||
|
show everything |
||||||
|
@end table |
||||||
|
@item SAMPLES |
||||||
|
Specify or override the path to the FATE samples at make time, it has a |
||||||
|
meaning only while running the regression tests. |
||||||
|
@item THREADS |
||||||
|
Specify how many threads to use while running regression tests, it is |
||||||
|
quite useful to detect thread-related regressions. |
||||||
|
@end table |
||||||
|
|
||||||
|
@example |
||||||
|
make V=1 SAMPLES=/var/fate/samples THREADS=2 fate |
||||||
|
@end example |
||||||
|
|
||||||
|
@chapter Automated Tests |
||||||
|
In order to automatically testing specific configurations, e.g. multiple |
||||||
|
compilers, @command{tests/fate.sh} is provided. |
||||||
|
|
||||||
|
This shell script builds FFmpeg, runs the regression tests and prepares a |
||||||
|
report that can be sent to @url{fate.ffmpeg.org} or directly examined locally. |
||||||
|
|
||||||
|
@section Testing Profiles |
||||||
|
The configuration file passed to @command{fate.sh} is shell scripts as well. |
||||||
|
|
||||||
|
It must provide at least a @var{slot} identifier, the @var{repo} from |
||||||
|
which fetch the sources, the @var{samples} directory, a @var{workdir} with |
||||||
|
enough space to build and run all the tests. |
||||||
|
Optional submit command @var{fate_recv} and a @var{comment} to describe |
||||||
|
the testing profile are available. |
||||||
|
|
||||||
|
Additional optional parameter to tune the FFmpeg building and reporting process |
||||||
|
can be passed. |
||||||
|
|
||||||
|
@example |
||||||
|
slot= # some unique identifier |
||||||
|
repo=git://source.ffmpeg.org/ffmpeg.git # the source repository |
||||||
|
samples=/path/to/fate/samples |
||||||
|
workdir= # directory in which to do all the work |
||||||
|
fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report |
||||||
|
comment= # optional description |
||||||
|
|
||||||
|
# the following are optional and map to configure options |
||||||
|
arch= |
||||||
|
cpu= |
||||||
|
cross_prefix= |
||||||
|
cc= |
||||||
|
target_os= |
||||||
|
sysroot= |
||||||
|
target_exec= |
||||||
|
target_path= |
||||||
|
extra_cflags= |
||||||
|
extra_ldflags= |
||||||
|
extra_libs= |
||||||
|
extra_conf= # extra configure options not covered above |
||||||
|
|
||||||
|
#make= # name of GNU make if not 'make' |
||||||
|
makeopts= # extra options passed to 'make' |
||||||
|
#tar= # command to create a tar archive from its arguments on |
||||||
|
# stdout, defaults to 'tar c' |
||||||
|
@end example |
||||||
|
|
||||||
|
@section Submitting Reports |
||||||
|
In order to send reports you need to create an @command{ssh} key and send it |
||||||
|
to the fate server administrator. |
||||||
|
The current server fingerprint is @var{b1:31:c8:79:3f:04:1d:f8:f2:23:26:5a:fd:55:fa:92} |
||||||
|
|
@ -0,0 +1,344 @@ |
|||||||
|
\input texinfo @c -*- texinfo -*- |
||||||
|
|
||||||
|
@settitle Using git to develop FFmpeg |
||||||
|
|
||||||
|
@titlepage |
||||||
|
@center @titlefont{Using git to develop FFmpeg} |
||||||
|
@end titlepage |
||||||
|
|
||||||
|
@top |
||||||
|
|
||||||
|
@contents |
||||||
|
|
||||||
|
@chapter Introduction |
||||||
|
|
||||||
|
This document aims in giving some quick references on a set of useful git |
||||||
|
commands. You should always use the extensive and detailed documentation |
||||||
|
provided directly by git: |
||||||
|
|
||||||
|
@example |
||||||
|
git --help |
||||||
|
man git |
||||||
|
@end example |
||||||
|
|
||||||
|
shows you the available subcommands, |
||||||
|
|
||||||
|
@example |
||||||
|
git <command> --help |
||||||
|
man git-<command> |
||||||
|
@end example |
||||||
|
|
||||||
|
shows information about the subcommand <command>. |
||||||
|
|
||||||
|
Additional information could be found on the |
||||||
|
@url{http://gitref.org, Git Reference} website |
||||||
|
|
||||||
|
For more information about the Git project, visit the |
||||||
|
|
||||||
|
@url{http://git-scm.com/, Git website} |
||||||
|
|
||||||
|
Consult these resources whenever you have problems, they are quite exhaustive. |
||||||
|
|
||||||
|
What follows now is a basic introduction to Git and some FFmpeg-specific |
||||||
|
guidelines to ease the contribution to the project |
||||||
|
|
||||||
|
@chapter Basics Usage |
||||||
|
|
||||||
|
@section Get GIT |
||||||
|
|
||||||
|
You can get git from @url{http://git-scm.com/} |
||||||
|
Most distribution and operating system provide a package for it. |
||||||
|
|
||||||
|
|
||||||
|
@section Cloning the source tree |
||||||
|
|
||||||
|
@example |
||||||
|
git clone git://source.ffmpeg.org/ffmpeg <target> |
||||||
|
@end example |
||||||
|
|
||||||
|
This will put the FFmpeg sources into the directory @var{<target>}. |
||||||
|
|
||||||
|
@example |
||||||
|
git clone git@@source.ffmpeg.org:ffmpeg <target> |
||||||
|
@end example |
||||||
|
|
||||||
|
This will put the FFmpeg sources into the directory @var{<target>} and let |
||||||
|
you push back your changes to the remote repository. |
||||||
|
|
||||||
|
|
||||||
|
@section Updating the source tree to the latest revision |
||||||
|
|
||||||
|
@example |
||||||
|
git pull (--rebase) |
||||||
|
@end example |
||||||
|
|
||||||
|
pulls in the latest changes from the tracked branch. The tracked branch |
||||||
|
can be remote. By default the master branch tracks the branch master in |
||||||
|
the remote origin. |
||||||
|
|
||||||
|
@float IMPORTANT |
||||||
|
@command{--rebase} (see below) is recommended. |
||||||
|
@end float |
||||||
|
|
||||||
|
@section Rebasing your local branches |
||||||
|
|
||||||
|
@example |
||||||
|
git pull --rebase |
||||||
|
@end example |
||||||
|
|
||||||
|
fetches the changes from the main repository and replays your local commits |
||||||
|
over it. This is required to keep all your local changes at the top of |
||||||
|
FFmpeg's master tree. The master tree will reject pushes with merge commits. |
||||||
|
|
||||||
|
|
||||||
|
@section Adding/removing files/directories |
||||||
|
|
||||||
|
@example |
||||||
|
git add [-A] <filename/dirname> |
||||||
|
git rm [-r] <filename/dirname> |
||||||
|
@end example |
||||||
|
|
||||||
|
GIT needs to get notified of all changes you make to your working |
||||||
|
directory that makes files appear or disappear. |
||||||
|
Line moves across files are automatically tracked. |
||||||
|
|
||||||
|
|
||||||
|
@section Showing modifications |
||||||
|
|
||||||
|
@example |
||||||
|
git diff <filename(s)> |
||||||
|
@end example |
||||||
|
|
||||||
|
will show all local modifications in your working directory as unified diff. |
||||||
|
|
||||||
|
|
||||||
|
@section Inspecting the changelog |
||||||
|
|
||||||
|
@example |
||||||
|
git log <filename(s)> |
||||||
|
@end example |
||||||
|
|
||||||
|
You may also use the graphical tools like gitview or gitk or the web |
||||||
|
interface available at http://source.ffmpeg.org/ |
||||||
|
|
||||||
|
@section Checking source tree status |
||||||
|
|
||||||
|
@example |
||||||
|
git status |
||||||
|
@end example |
||||||
|
|
||||||
|
detects all the changes you made and lists what actions will be taken in case |
||||||
|
of a commit (additions, modifications, deletions, etc.). |
||||||
|
|
||||||
|
|
||||||
|
@section Committing |
||||||
|
|
||||||
|
@example |
||||||
|
git diff --check |
||||||
|
@end example |
||||||
|
|
||||||
|
to double check your changes before committing them to avoid trouble later |
||||||
|
on. All experienced developers do this on each and every commit, no matter |
||||||
|
how small. |
||||||
|
Every one of them has been saved from looking like a fool by this many times. |
||||||
|
It's very easy for stray debug output or cosmetic modifications to slip in, |
||||||
|
please avoid problems through this extra level of scrutiny. |
||||||
|
|
||||||
|
For cosmetics-only commits you should get (almost) empty output from |
||||||
|
|
||||||
|
@example |
||||||
|
git diff -w -b <filename(s)> |
||||||
|
@end example |
||||||
|
|
||||||
|
Also check the output of |
||||||
|
|
||||||
|
@example |
||||||
|
git status |
||||||
|
@end example |
||||||
|
|
||||||
|
to make sure you don't have untracked files or deletions. |
||||||
|
|
||||||
|
@example |
||||||
|
git add [-i|-p|-A] <filenames/dirnames> |
||||||
|
@end example |
||||||
|
|
||||||
|
Make sure you have told git your name and email address |
||||||
|
|
||||||
|
@example |
||||||
|
git config --global user.name "My Name" |
||||||
|
git config --global user.email my@@email.invalid |
||||||
|
@end example |
||||||
|
|
||||||
|
Use @var{--global} to set the global configuration for all your git checkouts. |
||||||
|
|
||||||
|
Git will select the changes to the files for commit. Optionally you can use |
||||||
|
the interactive or the patch mode to select hunk by hunk what should be |
||||||
|
added to the commit. |
||||||
|
|
||||||
|
|
||||||
|
@example |
||||||
|
git commit |
||||||
|
@end example |
||||||
|
|
||||||
|
Git will commit the selected changes to your current local branch. |
||||||
|
|
||||||
|
You will be prompted for a log message in an editor, which is either |
||||||
|
set in your personal configuration file through |
||||||
|
|
||||||
|
@example |
||||||
|
git config --global core.editor |
||||||
|
@end example |
||||||
|
|
||||||
|
or set by one of the following environment variables: |
||||||
|
@var{GIT_EDITOR}, @var{VISUAL} or @var{EDITOR}. |
||||||
|
|
||||||
|
Log messages should be concise but descriptive. Explain why you made a change, |
||||||
|
what you did will be obvious from the changes themselves most of the time. |
||||||
|
Saying just "bug fix" or "10l" is bad. Remember that people of varying skill |
||||||
|
levels look at and educate themselves while reading through your code. Don't |
||||||
|
include filenames in log messages, Git provides that information. |
||||||
|
|
||||||
|
Possibly make the commit message have a terse, descriptive first line, an |
||||||
|
empty line and then a full description. The first line will be used to name |
||||||
|
the patch by git format-patch. |
||||||
|
|
||||||
|
@section Preparing a patchset |
||||||
|
|
||||||
|
@example |
||||||
|
git format-patch <commit> [-o directory] |
||||||
|
@end example |
||||||
|
|
||||||
|
will generate a set of patches for each commit between @var{<commit>} and |
||||||
|
current @var{HEAD}. E.g. |
||||||
|
|
||||||
|
@example |
||||||
|
git format-patch origin/master |
||||||
|
@end example |
||||||
|
|
||||||
|
will generate patches for all commits on current branch which are not |
||||||
|
present in upstream. |
||||||
|
A useful shortcut is also |
||||||
|
|
||||||
|
@example |
||||||
|
git format-patch -n |
||||||
|
@end example |
||||||
|
|
||||||
|
which will generate patches from last @var{n} commits. |
||||||
|
By default the patches are created in the current directory. |
||||||
|
|
||||||
|
@section Sending patches for review |
||||||
|
|
||||||
|
@example |
||||||
|
git send-email <commit list|directory> |
||||||
|
@end example |
||||||
|
|
||||||
|
will send the patches created by @command{git format-patch} or directly |
||||||
|
generates them. All the email fields can be configured in the global/local |
||||||
|
configuration or overridden by command line. |
||||||
|
Note that this tool must often be installed separately (e.g. @var{git-email} |
||||||
|
package on Debian-based distros). |
||||||
|
|
||||||
|
|
||||||
|
@section Renaming/moving/copying files or contents of files |
||||||
|
|
||||||
|
Git automatically tracks such changes, making those normal commits. |
||||||
|
|
||||||
|
@example |
||||||
|
mv/cp path/file otherpath/otherfile |
||||||
|
git add [-A] . |
||||||
|
git commit |
||||||
|
@end example |
||||||
|
|
||||||
|
|
||||||
|
@chapter FFmpeg specific |
||||||
|
|
||||||
|
@section Reverting broken commits |
||||||
|
|
||||||
|
@example |
||||||
|
git reset <commit> |
||||||
|
@end example |
||||||
|
|
||||||
|
@command{git reset} will uncommit the changes till @var{<commit>} rewriting |
||||||
|
the current branch history. |
||||||
|
|
||||||
|
@example |
||||||
|
git commit --amend |
||||||
|
@end example |
||||||
|
|
||||||
|
allows to amend the last commit details quickly. |
||||||
|
|
||||||
|
@example |
||||||
|
git rebase -i origin/master |
||||||
|
@end example |
||||||
|
|
||||||
|
will replay local commits over the main repository allowing to edit, merge |
||||||
|
or remove some of them in the process. |
||||||
|
|
||||||
|
@float NOTE |
||||||
|
@command{git reset}, @command{git commit --amend} and @command{git rebase} |
||||||
|
rewrite history, so you should use them ONLY on your local or topic branches. |
||||||
|
The main repository will reject those changes. |
||||||
|
@end float |
||||||
|
|
||||||
|
@example |
||||||
|
git revert <commit> |
||||||
|
@end example |
||||||
|
|
||||||
|
@command{git revert} will generate a revert commit. This will not make the |
||||||
|
faulty commit disappear from the history. |
||||||
|
|
||||||
|
@section Pushing changes to remote trees |
||||||
|
|
||||||
|
@example |
||||||
|
git push |
||||||
|
@end example |
||||||
|
|
||||||
|
Will push the changes to the default remote (@var{origin}). |
||||||
|
Git will prevent you from pushing changes if the local and remote trees are |
||||||
|
out of sync. Refer to and to sync the local tree. |
||||||
|
|
||||||
|
@example |
||||||
|
git remote add <name> <url> |
||||||
|
@end example |
||||||
|
|
||||||
|
Will add additional remote with a name reference, it is useful if you want |
||||||
|
to push your local branch for review on a remote host. |
||||||
|
|
||||||
|
@example |
||||||
|
git push <remote> <refspec> |
||||||
|
@end example |
||||||
|
|
||||||
|
Will push the changes to the @var{<remote>} repository. |
||||||
|
Omitting @var{<refspec>} makes @command{git push} update all the remote |
||||||
|
branches matching the local ones. |
||||||
|
|
||||||
|
@section Finding a specific svn revision |
||||||
|
|
||||||
|
Since version 1.7.1 git supports @var{:/foo} syntax for specifying commits |
||||||
|
based on a regular expression. see man gitrevisions |
||||||
|
|
||||||
|
@example |
||||||
|
git show :/'as revision 23456' |
||||||
|
@end example |
||||||
|
|
||||||
|
will show the svn changeset @var{r23456}. With older git versions searching in |
||||||
|
the @command{git log} output is the easiest option (especially if a pager with |
||||||
|
search capabilities is used). |
||||||
|
This commit can be checked out with |
||||||
|
|
||||||
|
@example |
||||||
|
git checkout -b svn_23456 :/'as revision 23456' |
||||||
|
@end example |
||||||
|
|
||||||
|
or for git < 1.7.1 with |
||||||
|
|
||||||
|
@example |
||||||
|
git checkout -b svn_23456 $SHA1 |
||||||
|
@end example |
||||||
|
|
||||||
|
where @var{$SHA1} is the commit hash from the @command{git log} output. |
||||||
|
|
||||||
|
@chapter Server Issues |
||||||
|
|
||||||
|
Contact the project admins @email{root@@ffmpeg.org} if you have technical |
||||||
|
problems with the GIT server. |
@ -0,0 +1,387 @@ |
|||||||
|
\input texinfo @c -*- texinfo -*- |
||||||
|
|
||||||
|
@settitle Platform Specific information |
||||||
|
@titlepage |
||||||
|
@center @titlefont{Platform Specific information} |
||||||
|
@end titlepage |
||||||
|
|
||||||
|
@top |
||||||
|
|
||||||
|
@contents |
||||||
|
|
||||||
|
@chapter Unix-like |
||||||
|
|
||||||
|
Some parts of FFmpeg cannot be built with version 2.15 of the GNU |
||||||
|
assembler which is still provided by a few AMD64 distributions. To |
||||||
|
make sure your compiler really uses the required version of gas |
||||||
|
after a binutils upgrade, run: |
||||||
|
|
||||||
|
@example |
||||||
|
$(gcc -print-prog-name=as) --version |
||||||
|
@end example |
||||||
|
|
||||||
|
If not, then you should install a different compiler that has no |
||||||
|
hard-coded path to gas. In the worst case pass @code{--disable-asm} |
||||||
|
to configure. |
||||||
|
|
||||||
|
@section BSD |
||||||
|
|
||||||
|
BSD make will not build FFmpeg, you need to install and use GNU Make |
||||||
|
(@file{gmake}). |
||||||
|
|
||||||
|
@section (Open)Solaris |
||||||
|
|
||||||
|
GNU Make is required to build FFmpeg, so you have to invoke (@file{gmake}), |
||||||
|
standard Solaris Make will not work. When building with a non-c99 front-end |
||||||
|
(gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o} |
||||||
|
or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options |
||||||
|
since the libc is not c99-compliant by default. The probes performed by |
||||||
|
configure may raise an exception leading to the death of configure itself |
||||||
|
due to a bug in the system shell. Simply invoke a different shell such as |
||||||
|
bash directly to work around this: |
||||||
|
|
||||||
|
@example |
||||||
|
bash ./configure |
||||||
|
@end example |
||||||
|
|
||||||
|
@anchor{Darwin} |
||||||
|
@section Darwin (OSX, iPhone) |
||||||
|
|
||||||
|
The toolchain provided with Xcode is sufficient to build the basic |
||||||
|
unacelerated code. |
||||||
|
|
||||||
|
OSX on PowerPC or ARM (iPhone) requires a preprocessor from |
||||||
|
@url{http://github.com/yuvi/gas-preprocessor} to build the optimized |
||||||
|
assembler functions. Just download the Perl script and put it somewhere |
||||||
|
in your PATH, FFmpeg's configure will pick it up automatically. |
||||||
|
|
||||||
|
OSX on amd64 and x86 requires @command{yasm} to build most of the |
||||||
|
optimized assembler functions @url{http://mxcl.github.com/homebrew/, Homebrew}, |
||||||
|
@url{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix} |
||||||
|
or @url{http://www.macports.org, MacPorts} can easily provide it. |
||||||
|
|
||||||
|
|
||||||
|
@chapter DOS |
||||||
|
|
||||||
|
Using a cross-compiler is preferred for various reasons. |
||||||
|
@url{http://www.delorie.com/howto/djgpp/linux-x-djgpp.html} |
||||||
|
|
||||||
|
|
||||||
|
@chapter OS/2 |
||||||
|
|
||||||
|
For information about compiling FFmpeg on OS/2 see |
||||||
|
@url{http://www.edm2.com/index.php/FFmpeg}. |
||||||
|
|
||||||
|
|
||||||
|
@chapter Windows |
||||||
|
|
||||||
|
To get help and instructions for building FFmpeg under Windows, check out |
||||||
|
the FFmpeg Windows Help Forum at |
||||||
|
@url{http://ffmpeg.arrozcru.org/}. |
||||||
|
|
||||||
|
@section Native Windows compilation |
||||||
|
|
||||||
|
FFmpeg can be built to run natively on Windows using the MinGW tools. Install |
||||||
|
the latest versions of MSYS and MinGW from @url{http://www.mingw.org/}. |
||||||
|
You can find detailed installation instructions in the download |
||||||
|
section and the FAQ. |
||||||
|
|
||||||
|
FFmpeg does not build out-of-the-box with the packages the automated MinGW |
||||||
|
installer provides. It also requires coreutils to be installed and many other |
||||||
|
packages updated to the latest version. The minimum version for some packages |
||||||
|
are listed below: |
||||||
|
|
||||||
|
@itemize |
||||||
|
@item bash 3.1 |
||||||
|
@item msys-make 3.81-2 (note: not mingw32-make) |
||||||
|
@item w32api 3.13 |
||||||
|
@item mingw-runtime 3.15 |
||||||
|
@end itemize |
||||||
|
|
||||||
|
FFmpeg automatically passes @code{-fno-common} to the compiler to work around |
||||||
|
a GCC bug (see @url{http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216}). |
||||||
|
|
||||||
|
Notes: |
||||||
|
|
||||||
|
@itemize |
||||||
|
|
||||||
|
@item Building natively using MSYS can be sped up by disabling implicit rules |
||||||
|
in the Makefile by calling @code{make -r} instead of plain @code{make}. This |
||||||
|
speed up is close to non-existent for normal one-off builds and is only |
||||||
|
noticeable when running make for a second time (for example in |
||||||
|
@code{make install}). |
||||||
|
|
||||||
|
@item In order to compile FFplay, you must have the MinGW development library |
||||||
|
of @uref{http://www.libsdl.org/, SDL}. |
||||||
|
Edit the @file{bin/sdl-config} script so that it points to the correct prefix |
||||||
|
where SDL was installed. Verify that @file{sdl-config} can be launched from |
||||||
|
the MSYS command line. |
||||||
|
|
||||||
|
@item By using @code{./configure --enable-shared} when configuring FFmpeg, |
||||||
|
you can build the FFmpeg libraries (e.g. libavutil, libavcodec, |
||||||
|
libavformat) as DLLs. |
||||||
|
|
||||||
|
@end itemize |
||||||
|
|
||||||
|
@section Microsoft Visual C++ compatibility |
||||||
|
|
||||||
|
As stated in the FAQ, FFmpeg will not compile under MSVC++. However, if you |
||||||
|
want to use the libav* libraries in your own applications, you can still |
||||||
|
compile those applications using MSVC++. But the libav* libraries you link |
||||||
|
to @emph{must} be built with MinGW. However, you will not be able to debug |
||||||
|
inside the libav* libraries, since MSVC++ does not recognize the debug |
||||||
|
symbols generated by GCC. |
||||||
|
We strongly recommend you to move over from MSVC++ to MinGW tools. |
||||||
|
|
||||||
|
This description of how to use the FFmpeg libraries with MSVC++ is based on |
||||||
|
Microsoft Visual C++ 2005 Express Edition. If you have a different version, |
||||||
|
you might have to modify the procedures slightly. |
||||||
|
|
||||||
|
@subsection Using static libraries |
||||||
|
|
||||||
|
Assuming you have just built and installed FFmpeg in @file{/usr/local}. |
||||||
|
|
||||||
|
@enumerate |
||||||
|
|
||||||
|
@item Create a new console application ("File / New / Project") and then |
||||||
|
select "Win32 Console Application". On the appropriate page of the |
||||||
|
Application Wizard, uncheck the "Precompiled headers" option. |
||||||
|
|
||||||
|
@item Write the source code for your application, or, for testing, just |
||||||
|
copy the code from an existing sample application into the source file |
||||||
|
that MSVC++ has already created for you. For example, you can copy |
||||||
|
@file{libavformat/output-example.c} from the FFmpeg distribution. |
||||||
|
|
||||||
|
@item Open the "Project / Properties" dialog box. In the "Configuration" |
||||||
|
combo box, select "All Configurations" so that the changes you make will |
||||||
|
affect both debug and release builds. In the tree view on the left hand |
||||||
|
side, select "C/C++ / General", then edit the "Additional Include |
||||||
|
Directories" setting to contain the path where the FFmpeg includes were |
||||||
|
installed (i.e. @file{c:\msys\1.0\local\include}). |
||||||
|
Do not add MinGW's include directory here, or the include files will |
||||||
|
conflict with MSVC's. |
||||||
|
|
||||||
|
@item Still in the "Project / Properties" dialog box, select |
||||||
|
"Linker / General" from the tree view and edit the |
||||||
|
"Additional Library Directories" setting to contain the @file{lib} |
||||||
|
directory where FFmpeg was installed (i.e. @file{c:\msys\1.0\local\lib}), |
||||||
|
the directory where MinGW libs are installed (i.e. @file{c:\mingw\lib}), |
||||||
|
and the directory where MinGW's GCC libs are installed |
||||||
|
(i.e. @file{C:\mingw\lib\gcc\mingw32\4.2.1-sjlj}). Then select |
||||||
|
"Linker / Input" from the tree view, and add the files @file{libavformat.a}, |
||||||
|
@file{libavcodec.a}, @file{libavutil.a}, @file{libmingwex.a}, |
||||||
|
@file{libgcc.a}, and any other libraries you used (i.e. @file{libz.a}) |
||||||
|
to the end of "Additional Dependencies". |
||||||
|
|
||||||
|
@item Now, select "C/C++ / Code Generation" from the tree view. Select |
||||||
|
"Debug" in the "Configuration" combo box. Make sure that "Runtime |
||||||
|
Library" is set to "Multi-threaded Debug DLL". Then, select "Release" in |
||||||
|
the "Configuration" combo box and make sure that "Runtime Library" is |
||||||
|
set to "Multi-threaded DLL". |
||||||
|
|
||||||
|
@item Click "OK" to close the "Project / Properties" dialog box. |
||||||
|
|
||||||
|
@item MSVC++ lacks some C99 header files that are fundamental for FFmpeg. |
||||||
|
Get msinttypes from @url{http://code.google.com/p/msinttypes/downloads/list} |
||||||
|
and install it in MSVC++'s include directory |
||||||
|
(i.e. @file{C:\Program Files\Microsoft Visual Studio 8\VC\include}). |
||||||
|
|
||||||
|
@item MSVC++ also does not understand the @code{inline} keyword used by |
||||||
|
FFmpeg, so you must add this line before @code{#include}ing libav*: |
||||||
|
@example |
||||||
|
#define inline _inline |
||||||
|
@end example |
||||||
|
|
||||||
|
@item Build your application, everything should work. |
||||||
|
|
||||||
|
@end enumerate |
||||||
|
|
||||||
|
@subsection Using shared libraries |
||||||
|
|
||||||
|
This is how to create DLL and LIB files that are compatible with MSVC++: |
||||||
|
|
||||||
|
@enumerate |
||||||
|
|
||||||
|
@item Add a call to @file{vcvars32.bat} (which sets up the environment |
||||||
|
variables for the Visual C++ tools) as the first line of @file{msys.bat}. |
||||||
|
The standard location for @file{vcvars32.bat} is |
||||||
|
@file{C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat}, |
||||||
|
and the standard location for @file{msys.bat} is @file{C:\msys\1.0\msys.bat}. |
||||||
|
If this corresponds to your setup, add the following line as the first line |
||||||
|
of @file{msys.bat}: |
||||||
|
|
||||||
|
@example |
||||||
|
call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" |
||||||
|
@end example |
||||||
|
|
||||||
|
Alternatively, you may start the @file{Visual Studio 2005 Command Prompt}, |
||||||
|
and run @file{c:\msys\1.0\msys.bat} from there. |
||||||
|
|
||||||
|
@item Within the MSYS shell, run @code{lib.exe}. If you get a help message |
||||||
|
from @file{Microsoft (R) Library Manager}, this means your environment |
||||||
|
variables are set up correctly, the @file{Microsoft (R) Library Manager} |
||||||
|
is on the path and will be used by FFmpeg to create |
||||||
|
MSVC++-compatible import libraries. |
||||||
|
|
||||||
|
@item Build FFmpeg with |
||||||
|
|
||||||
|
@example |
||||||
|
./configure --enable-shared |
||||||
|
make |
||||||
|
make install |
||||||
|
@end example |
||||||
|
|
||||||
|
Your install path (@file{/usr/local/} by default) should now have the |
||||||
|
necessary DLL and LIB files under the @file{bin} directory. |
||||||
|
|
||||||
|
Alternatively, build the libraries with a cross compiler, according to |
||||||
|
the instructions below in @ref{Cross compilation for Windows with Linux}. |
||||||
|
|
||||||
|
To use those files with MSVC++, do the same as you would do with |
||||||
|
the static libraries, as described above. But in Step 4, |
||||||
|
you should only need to add the directory where the LIB files are installed |
||||||
|
(i.e. @file{c:\msys\usr\local\bin}). This is not a typo, the LIB files are |
||||||
|
installed in the @file{bin} directory. And instead of adding the static |
||||||
|
libraries (@file{libxxx.a} files) you should add the MSVC import libraries |
||||||
|
(@file{avcodec.lib}, @file{avformat.lib}, and |
||||||
|
@file{avutil.lib}). Note that you should not use the GCC import |
||||||
|
libraries (@file{libxxx.dll.a} files), as these will give you undefined |
||||||
|
reference errors. There should be no need for @file{libmingwex.a}, |
||||||
|
@file{libgcc.a}, and @file{wsock32.lib}, nor any other external library |
||||||
|
statically linked into the DLLs. |
||||||
|
|
||||||
|
FFmpeg headers do not declare global data for Windows DLLs through the usual |
||||||
|
dllexport/dllimport interface. Such data will be exported properly while |
||||||
|
building, but to use them in your MSVC++ code you will have to edit the |
||||||
|
appropriate headers and mark the data as dllimport. For example, in |
||||||
|
libavutil/pixdesc.h you should have: |
||||||
|
@example |
||||||
|
extern __declspec(dllimport) const AVPixFmtDescriptor av_pix_fmt_descriptors[]; |
||||||
|
@end example |
||||||
|
|
||||||
|
Note that using import libraries created by dlltool requires |
||||||
|
the linker optimization option to be set to |
||||||
|
"References: Keep Unreferenced Data (@code{/OPT:NOREF})", otherwise |
||||||
|
the resulting binaries will fail during runtime. This isn't |
||||||
|
required when using import libraries generated by lib.exe. |
||||||
|
This issue is reported upstream at |
||||||
|
@url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}. |
||||||
|
|
||||||
|
To create import libraries that work with the @code{/OPT:REF} option |
||||||
|
(which is enabled by default in Release mode), follow these steps: |
||||||
|
|
||||||
|
@enumerate |
||||||
|
|
||||||
|
@item Open @file{Visual Studio 2005 Command Prompt}. |
||||||
|
|
||||||
|
Alternatively, in a normal command line prompt, call @file{vcvars32.bat} |
||||||
|
which sets up the environment variables for the Visual C++ tools |
||||||
|
(the standard location for this file is |
||||||
|
@file{C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat}). |
||||||
|
|
||||||
|
@item Enter the @file{bin} directory where the created LIB and DLL files |
||||||
|
are stored. |
||||||
|
|
||||||
|
@item Generate new import libraries with @file{lib.exe}: |
||||||
|
|
||||||
|
@example |
||||||
|
lib /machine:i386 /def:..\lib\avcodec-53.def /out:avcodec.lib |
||||||
|
lib /machine:i386 /def:..\lib\avdevice-53.def /out:avdevice.lib |
||||||
|
lib /machine:i386 /def:..\lib\avfilter-2.def /out:avfilter.lib |
||||||
|
lib /machine:i386 /def:..\lib\avformat-53.def /out:avformat.lib |
||||||
|
lib /machine:i386 /def:..\lib\avutil-51.def /out:avutil.lib |
||||||
|
lib /machine:i386 /def:..\lib\swscale-2.def /out:swscale.lib |
||||||
|
@end example |
||||||
|
|
||||||
|
@end enumerate |
||||||
|
|
||||||
|
@anchor{Cross compilation for Windows with Linux} |
||||||
|
@section Cross compilation for Windows with Linux |
||||||
|
|
||||||
|
You must use the MinGW cross compilation tools available at |
||||||
|
@url{http://www.mingw.org/}. |
||||||
|
|
||||||
|
Then configure FFmpeg with the following options: |
||||||
|
@example |
||||||
|
./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc- |
||||||
|
@end example |
||||||
|
(you can change the cross-prefix according to the prefix chosen for the |
||||||
|
MinGW tools). |
||||||
|
|
||||||
|
Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}. |
||||||
|
|
||||||
|
@section Compilation under Cygwin |
||||||
|
|
||||||
|
Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack |
||||||
|
llrint() in its C library. |
||||||
|
|
||||||
|
Install your Cygwin with all the "Base" packages, plus the |
||||||
|
following "Devel" ones: |
||||||
|
@example |
||||||
|
binutils, gcc4-core, make, git, mingw-runtime, texi2html |
||||||
|
@end example |
||||||
|
|
||||||
|
And the following "Utils" one: |
||||||
|
@example |
||||||
|
diffutils |
||||||
|
@end example |
||||||
|
|
||||||
|
Then run |
||||||
|
|
||||||
|
@example |
||||||
|
./configure |
||||||
|
@end example |
||||||
|
|
||||||
|
to make a static build. |
||||||
|
|
||||||
|
The current @code{gcc4-core} package is buggy and needs this flag to build |
||||||
|
shared libraries: |
||||||
|
|
||||||
|
@example |
||||||
|
./configure --enable-shared --disable-static --extra-cflags=-fno-reorder-functions |
||||||
|
@end example |
||||||
|
|
||||||
|
If you want to build FFmpeg with additional libraries, download Cygwin |
||||||
|
"Devel" packages for Ogg and Vorbis from any Cygwin packages repository: |
||||||
|
@example |
||||||
|
libogg-devel, libvorbis-devel |
||||||
|
@end example |
||||||
|
|
||||||
|
These library packages are only available from |
||||||
|
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}: |
||||||
|
|
||||||
|
@example |
||||||
|
yasm, libSDL-devel, libdirac-devel, libfaac-devel, libaacplus-devel, libgsm-devel, |
||||||
|
libmp3lame-devel, libschroedinger1.0-devel, speex-devel, libtheora-devel, |
||||||
|
libxvidcore-devel |
||||||
|
@end example |
||||||
|
|
||||||
|
The recommendation for libnut and x264 is to build them from source by |
||||||
|
yourself, as they evolve too quickly for Cygwin Ports to be up to date. |
||||||
|
|
||||||
|
Cygwin 1.7.x has IPv6 support. You can add IPv6 to Cygwin 1.5.x by means |
||||||
|
of the @code{libgetaddrinfo-devel} package, available at Cygwin Ports. |
||||||
|
|
||||||
|
@section Crosscompilation for Windows under Cygwin |
||||||
|
|
||||||
|
With Cygwin you can create Windows binaries that do not need the cygwin1.dll. |
||||||
|
|
||||||
|
Just install your Cygwin as explained before, plus these additional |
||||||
|
"Devel" packages: |
||||||
|
@example |
||||||
|
gcc-mingw-core, mingw-runtime, mingw-zlib |
||||||
|
@end example |
||||||
|
|
||||||
|
and add some special flags to your configure invocation. |
||||||
|
|
||||||
|
For a static build run |
||||||
|
@example |
||||||
|
./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin |
||||||
|
@end example |
||||||
|
|
||||||
|
and for a build with shared libraries |
||||||
|
@example |
||||||
|
./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin |
||||||
|
@end example |
||||||
|
|
||||||
|
@bye |
@ -0,0 +1,505 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011 Justin Ruggles |
||||||
|
* |
||||||
|
* 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 |
||||||
|
*/ |
||||||
|
|
||||||
|
/**
|
||||||
|
* mov 'chan' tag reading/writing. |
||||||
|
* @author Justin Ruggles |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
#include "libavutil/audioconvert.h" |
||||||
|
#include "libavcodec/avcodec.h" |
||||||
|
#include "mov_chan.h" |
||||||
|
|
||||||
|
/**
|
||||||
|
* Channel Layout Tag |
||||||
|
* This tells which channels are present in the audio stream and the order in |
||||||
|
* which they appear. |
||||||
|
* |
||||||
|
* @note We're using the channel layout tag to indicate channel order |
||||||
|
* when the value is greater than 0x10000. The Apple documentation has |
||||||
|
* some contradictions as to how this is actually supposed to be handled. |
||||||
|
* |
||||||
|
* Core Audio File Format Spec: |
||||||
|
* "The high 16 bits indicates a specific ordering of the channels." |
||||||
|
* Core Audio Data Types Reference: |
||||||
|
* "These identifiers specify the channels included in a layout but |
||||||
|
* do not specify a particular ordering of those channels." |
||||||
|
*/ |
||||||
|
enum MovChannelLayoutTag { |
||||||
|
MOV_CH_LAYOUT_UNKNOWN = 0xFFFF0000, |
||||||
|
MOV_CH_LAYOUT_USE_DESCRIPTIONS = ( 0 << 16) | 0, |
||||||
|
MOV_CH_LAYOUT_USE_BITMAP = ( 1 << 16) | 0, |
||||||
|
MOV_CH_LAYOUT_DISCRETEINORDER = (147 << 16) | 0, |
||||||
|
MOV_CH_LAYOUT_MONO = (100 << 16) | 1, |
||||||
|
MOV_CH_LAYOUT_STEREO = (101 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_STEREOHEADPHONES = (102 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_MATRIXSTEREO = (103 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_MIDSIDE = (104 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_XY = (105 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_BINAURAL = (106 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_AMBISONIC_B_FORMAT = (107 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_QUADRAPHONIC = (108 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_PENTAGONAL = (109 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_HEXAGONAL = (110 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_OCTAGONAL = (111 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_CUBE = (112 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_MPEG_3_0_A = (113 << 16) | 3, |
||||||
|
MOV_CH_LAYOUT_MPEG_3_0_B = (114 << 16) | 3, |
||||||
|
MOV_CH_LAYOUT_MPEG_4_0_A = (115 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_MPEG_4_0_B = (116 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_A = (117 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_B = (118 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_C = (119 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_D = (120 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_A = (121 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_B = (122 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_C = (123 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_D = (124 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_MPEG_6_1_A = (125 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_MPEG_7_1_A = (126 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_MPEG_7_1_B = (127 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_MPEG_7_1_C = (128 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1 = (129 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_SMPTE_DTV = (130 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_ITU_2_1 = (131 << 16) | 3, |
||||||
|
MOV_CH_LAYOUT_ITU_2_2 = (132 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_DVD_4 = (133 << 16) | 3, |
||||||
|
MOV_CH_LAYOUT_DVD_5 = (134 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_DVD_6 = (135 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_DVD_10 = (136 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_DVD_11 = (137 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_DVD_18 = (138 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_AUDIOUNIT_6_0 = (139 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_AUDIOUNIT_7_0 = (140 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT = (148 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_AAC_6_0 = (141 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_AAC_6_1 = (142 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_AAC_7_0 = (143 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_AAC_OCTAGONAL = (144 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_TMH_10_2_STD = (145 << 16) | 16, |
||||||
|
MOV_CH_LAYOUT_TMH_10_2_FULL = (146 << 16) | 21, |
||||||
|
MOV_CH_LAYOUT_AC3_1_0_1 = (149 << 16) | 2, |
||||||
|
MOV_CH_LAYOUT_AC3_3_0 = (150 << 16) | 3, |
||||||
|
MOV_CH_LAYOUT_AC3_3_1 = (151 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_AC3_3_0_1 = (152 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_AC3_2_1_1 = (153 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_AC3_3_1_1 = (154 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_EAC3_6_0_A = (155 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_0_A = (156 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_EAC3_6_1_A = (157 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_EAC3_6_1_B = (158 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_EAC3_6_1_C = (159 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_A = (160 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_B = (161 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_C = (162 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_D = (163 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_E = (164 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_F = (165 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_G = (166 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_EAC3_7_1_H = (167 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_DTS_3_1 = (168 << 16) | 4, |
||||||
|
MOV_CH_LAYOUT_DTS_4_1 = (169 << 16) | 5, |
||||||
|
MOV_CH_LAYOUT_DTS_6_0_A = (170 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_DTS_6_0_B = (171 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_DTS_6_0_C = (172 << 16) | 6, |
||||||
|
MOV_CH_LAYOUT_DTS_6_1_A = (173 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_DTS_6_1_B = (174 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_DTS_6_1_C = (175 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_DTS_6_1_D = (182 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_DTS_7_0 = (176 << 16) | 7, |
||||||
|
MOV_CH_LAYOUT_DTS_7_1 = (177 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_DTS_8_0_A = (178 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_DTS_8_0_B = (179 << 16) | 8, |
||||||
|
MOV_CH_LAYOUT_DTS_8_1_A = (180 << 16) | 9, |
||||||
|
MOV_CH_LAYOUT_DTS_8_1_B = (181 << 16) | 9, |
||||||
|
}; |
||||||
|
|
||||||
|
struct MovChannelLayoutMap { |
||||||
|
uint32_t tag; |
||||||
|
uint64_t layout; |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_misc[] = { |
||||||
|
{ MOV_CH_LAYOUT_USE_DESCRIPTIONS, 0 }, |
||||||
|
{ MOV_CH_LAYOUT_USE_BITMAP, 0 }, |
||||||
|
{ MOV_CH_LAYOUT_DISCRETEINORDER, 0 }, |
||||||
|
{ MOV_CH_LAYOUT_UNKNOWN, 0 }, |
||||||
|
{ MOV_CH_LAYOUT_TMH_10_2_STD, 0 }, // L, R, C, Vhc, Lsd, Rsd,
|
||||||
|
// Ls, Rs, Vhl, Vhr, Lw, Rw,
|
||||||
|
// Csd, Cs, LFE1, LFE2
|
||||||
|
{ MOV_CH_LAYOUT_TMH_10_2_FULL, 0 }, // L, R, C, Vhc, Lsd, Rsd,
|
||||||
|
// Ls, Rs, Vhl, Vhr, Lw, Rw,
|
||||||
|
// Csd, Cs, LFE1, LFE2, Lc, Rc,
|
||||||
|
// HI, VI, Haptic
|
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_1ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_MONO, AV_CH_LAYOUT_MONO }, // C
|
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_2ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_STEREO }, // L, R
|
||||||
|
{ MOV_CH_LAYOUT_STEREOHEADPHONES, AV_CH_LAYOUT_STEREO }, // L, R
|
||||||
|
{ MOV_CH_LAYOUT_BINAURAL, AV_CH_LAYOUT_STEREO }, // L, R
|
||||||
|
{ MOV_CH_LAYOUT_MIDSIDE, AV_CH_LAYOUT_STEREO }, // C, sides
|
||||||
|
{ MOV_CH_LAYOUT_XY, AV_CH_LAYOUT_STEREO }, // X (left), Y (right)
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MATRIXSTEREO, AV_CH_LAYOUT_STEREO_DOWNMIX }, // Lt, Rt
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_AC3_1_0_1, AV_CH_LAYOUT_MONO | // C, LFE
|
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_3ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_MPEG_3_0_A, AV_CH_LAYOUT_SURROUND }, // L, R, C
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_3_0_B, AV_CH_LAYOUT_SURROUND }, // C, L, R
|
||||||
|
{ MOV_CH_LAYOUT_AC3_3_0, AV_CH_LAYOUT_SURROUND }, // L, C, R
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_ITU_2_1, AV_CH_LAYOUT_2_1 }, // L, R, Cs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DVD_4, AV_CH_LAYOUT_2POINT1 }, // L, R, LFE
|
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_4ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, 0 }, // W, X, Y, Z
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_QUADRAPHONIC, AV_CH_LAYOUT_QUAD }, // L, R, Rls, Rrs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_4_0_A, AV_CH_LAYOUT_4POINT0 }, // L, R, C, Cs
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_4_0_B, AV_CH_LAYOUT_4POINT0 }, // C, L, R, Cs
|
||||||
|
{ MOV_CH_LAYOUT_AC3_3_1, AV_CH_LAYOUT_4POINT0 }, // L, C, R, Cs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_ITU_2_2, AV_CH_LAYOUT_2_2 }, // L, R, Ls, Rs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DVD_5, AV_CH_LAYOUT_2_1 | // L, R, LFE, Cs
|
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
{ MOV_CH_LAYOUT_AC3_2_1_1, AV_CH_LAYOUT_2_1 | // L, R, Cs, LFE
|
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DVD_10, AV_CH_LAYOUT_3POINT1 }, // L, R, C, LFE
|
||||||
|
{ MOV_CH_LAYOUT_AC3_3_0_1, AV_CH_LAYOUT_3POINT1 }, // L, C, R, LFE
|
||||||
|
{ MOV_CH_LAYOUT_DTS_3_1, AV_CH_LAYOUT_3POINT1 }, // C, L, R, LFE
|
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_5ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_PENTAGONAL, AV_CH_LAYOUT_5POINT0_BACK }, // L, R, Rls, Rrs, C
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_0_A, AV_CH_LAYOUT_5POINT0 }, // L, R, C, Ls, Rs
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_0_B, AV_CH_LAYOUT_5POINT0 }, // L, R, Ls, Rs, C
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_0_C, AV_CH_LAYOUT_5POINT0 }, // L, C, R, Ls, Rs
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_0_D, AV_CH_LAYOUT_5POINT0 }, // C, L, R, Ls, Rs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DVD_6, AV_CH_LAYOUT_2_2 | // L, R, LFE, Ls, Rs
|
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
{ MOV_CH_LAYOUT_DVD_18, AV_CH_LAYOUT_2_2 | // L, R, Ls, Rs, LFE
|
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DVD_11, AV_CH_LAYOUT_4POINT1 }, // L, R, C, LFE, Cs
|
||||||
|
{ MOV_CH_LAYOUT_AC3_3_1_1, AV_CH_LAYOUT_4POINT1 }, // L, C, R, Cs, LFE
|
||||||
|
{ MOV_CH_LAYOUT_DTS_4_1, AV_CH_LAYOUT_4POINT1 }, // C, L, R, Cs, LFE
|
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_6ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_HEXAGONAL, AV_CH_LAYOUT_HEXAGONAL }, // L, R, Rls, Rrs, C, Cs
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_0_C, AV_CH_LAYOUT_HEXAGONAL }, // C, Cs, L, R, Rls, Rrs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_1_A, AV_CH_LAYOUT_5POINT1 }, // L, R, C, LFE, Ls, Rs
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_1_B, AV_CH_LAYOUT_5POINT1 }, // L, R, Ls, Rs, C, LFE
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_1_C, AV_CH_LAYOUT_5POINT1 }, // L, C, R, Ls, Rs, LFE
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_5_1_D, AV_CH_LAYOUT_5POINT1 }, // C, L, R, Ls, Rs, LFE
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_AUDIOUNIT_6_0, AV_CH_LAYOUT_6POINT0 }, // L, R, Ls, Rs, C, Cs
|
||||||
|
{ MOV_CH_LAYOUT_AAC_6_0, AV_CH_LAYOUT_6POINT0 }, // C, L, R, Ls, Rs, Cs
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_6_0_A, AV_CH_LAYOUT_6POINT0 }, // L, C, R, Ls, Rs, Cs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_0_A, AV_CH_LAYOUT_6POINT0_FRONT }, // Lc, Rc, L, R, Ls, Rs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_0_B, AV_CH_LAYOUT_5POINT0_BACK | // C, L, R, Rls, Rrs, Ts
|
||||||
|
AV_CH_TOP_CENTER }, |
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_7ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_MPEG_6_1_A, AV_CH_LAYOUT_6POINT1 }, // L, R, C, LFE, Ls, Rs, Cs
|
||||||
|
{ MOV_CH_LAYOUT_AAC_6_1, AV_CH_LAYOUT_6POINT1 }, // C, L, R, Ls, Rs, Cs, LFE
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_6_1_A, AV_CH_LAYOUT_6POINT1 }, // L, C, R, Ls, Rs, LFE, Cs
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_1_D, AV_CH_LAYOUT_6POINT1 }, // C, L, R, Ls, Rs, LFE, Cs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_AUDIOUNIT_7_0, AV_CH_LAYOUT_7POINT0 }, // L, R, Ls, Rs, C, Rls, Rrs
|
||||||
|
{ MOV_CH_LAYOUT_AAC_7_0, AV_CH_LAYOUT_7POINT0 }, // C, L, R, Ls, Rs, Rls, Rrs
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_0_A, AV_CH_LAYOUT_7POINT0 }, // L, C, R, Ls, Rs, Rls, Rrs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, AV_CH_LAYOUT_7POINT0_FRONT }, // L, R, Ls, Rs, C, Lc, Rc
|
||||||
|
{ MOV_CH_LAYOUT_DTS_7_0, AV_CH_LAYOUT_7POINT0_FRONT }, // Lc, C, Rc, L, R, Ls, Rs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_6_1_B, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Ts
|
||||||
|
AV_CH_TOP_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_6_1_C, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Vhc
|
||||||
|
AV_CH_TOP_FRONT_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_1_A, AV_CH_LAYOUT_6POINT1_FRONT }, // Lc, Rc, L, R, Ls, Rs, LFE
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_1_B, AV_CH_LAYOUT_5POINT1_BACK | // C, L, R, Rls, Rrs, Ts, LFE
|
||||||
|
AV_CH_TOP_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_6_1_C, AV_CH_LAYOUT_6POINT1_BACK }, // C, Cs, L, R, Rls, Rrs, LFE
|
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_8ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_OCTAGONAL, AV_CH_LAYOUT_OCTAGONAL }, // L, R, Rls, Rrs, C, Cs, Ls, Rs
|
||||||
|
{ MOV_CH_LAYOUT_AAC_OCTAGONAL, AV_CH_LAYOUT_OCTAGONAL }, // C, L, R, Ls, Rs, Rls, Rrs, Cs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_CUBE, AV_CH_LAYOUT_QUAD | // L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt
|
||||||
|
AV_CH_TOP_FRONT_LEFT | |
||||||
|
AV_CH_TOP_FRONT_RIGHT | |
||||||
|
AV_CH_TOP_BACK_LEFT | |
||||||
|
AV_CH_TOP_BACK_RIGHT }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_7_1_A, AV_CH_LAYOUT_7POINT1_WIDE }, // L, R, C, LFE, Ls, Rs, Lc, Rc
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_7_1_B, AV_CH_LAYOUT_7POINT1_WIDE }, // C, Lc, Rc, L, R, Ls, Rs, LFE
|
||||||
|
{ MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, AV_CH_LAYOUT_7POINT1_WIDE }, // L, R, Ls, Rs, C, LFE, Lc, Rc
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_B, AV_CH_LAYOUT_7POINT1_WIDE }, // L, C, R, Ls, Rs, LFE, Lc, Rc
|
||||||
|
{ MOV_CH_LAYOUT_DTS_7_1, AV_CH_LAYOUT_7POINT1_WIDE }, // Lc, C, Rc, L, R, Ls, Rs, LFE
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_MPEG_7_1_C, AV_CH_LAYOUT_7POINT1 }, // L, R, C, LFE, Ls, Rs, Rls, Rrs
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_A, AV_CH_LAYOUT_7POINT1 }, // L, C, R, Ls, Rs, LFE, Rls, Rrs
|
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_SMPTE_DTV, AV_CH_LAYOUT_5POINT1 | // L, R, C, LFE, Ls, Rs, Lt, Rt
|
||||||
|
AV_CH_LAYOUT_STEREO_DOWNMIX }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_C, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Lsd, Rsd
|
||||||
|
AV_CH_SURROUND_DIRECT_LEFT | |
||||||
|
AV_CH_SURROUND_DIRECT_RIGHT }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_D, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Lw, Rw
|
||||||
|
AV_CH_WIDE_LEFT | |
||||||
|
AV_CH_WIDE_RIGHT }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_E, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Vhl, Vhr
|
||||||
|
AV_CH_TOP_FRONT_LEFT | |
||||||
|
AV_CH_TOP_FRONT_RIGHT }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_F, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Cs, Ts
|
||||||
|
AV_CH_BACK_CENTER | |
||||||
|
AV_CH_TOP_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_G, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Cs, Vhc
|
||||||
|
AV_CH_BACK_CENTER | |
||||||
|
AV_CH_TOP_FRONT_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_EAC3_7_1_H, AV_CH_LAYOUT_5POINT1 | // L, C, R, Ls, Rs, LFE, Ts, Vhc
|
||||||
|
AV_CH_TOP_CENTER | |
||||||
|
AV_CH_TOP_FRONT_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_8_0_A, AV_CH_LAYOUT_2_2 | // Lc, Rc, L, R, Ls, Rs, Rls, Rrs
|
||||||
|
AV_CH_BACK_LEFT | |
||||||
|
AV_CH_BACK_RIGHT | |
||||||
|
AV_CH_FRONT_LEFT_OF_CENTER | |
||||||
|
AV_CH_FRONT_RIGHT_OF_CENTER }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_8_0_B, AV_CH_LAYOUT_5POINT0 | // Lc, C, Rc, L, R, Ls, Cs, Rs
|
||||||
|
AV_CH_FRONT_LEFT_OF_CENTER | |
||||||
|
AV_CH_FRONT_RIGHT_OF_CENTER | |
||||||
|
AV_CH_BACK_CENTER }, |
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap mov_ch_layout_map_9ch[] = { |
||||||
|
{ MOV_CH_LAYOUT_DTS_8_1_A, AV_CH_LAYOUT_2_2 | // Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE
|
||||||
|
AV_CH_BACK_LEFT | |
||||||
|
AV_CH_BACK_RIGHT | |
||||||
|
AV_CH_FRONT_LEFT_OF_CENTER | |
||||||
|
AV_CH_FRONT_RIGHT_OF_CENTER | |
||||||
|
AV_CH_LOW_FREQUENCY }, |
||||||
|
|
||||||
|
{ MOV_CH_LAYOUT_DTS_8_1_B, AV_CH_LAYOUT_7POINT1_WIDE | // Lc, C, Rc, L, R, Ls, Cs, Rs, LFE
|
||||||
|
AV_CH_BACK_CENTER }, |
||||||
|
{ 0, 0 }, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct MovChannelLayoutMap *mov_ch_layout_map[] = { |
||||||
|
mov_ch_layout_map_misc, |
||||||
|
mov_ch_layout_map_1ch, |
||||||
|
mov_ch_layout_map_2ch, |
||||||
|
mov_ch_layout_map_3ch, |
||||||
|
mov_ch_layout_map_4ch, |
||||||
|
mov_ch_layout_map_5ch, |
||||||
|
mov_ch_layout_map_6ch, |
||||||
|
mov_ch_layout_map_7ch, |
||||||
|
mov_ch_layout_map_8ch, |
||||||
|
mov_ch_layout_map_9ch, |
||||||
|
}; |
||||||
|
|
||||||
|
static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = { |
||||||
|
MOV_CH_LAYOUT_MONO, |
||||||
|
MOV_CH_LAYOUT_STEREO, |
||||||
|
MOV_CH_LAYOUT_AC3_1_0_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_3_0_B, |
||||||
|
MOV_CH_LAYOUT_ITU_2_1, |
||||||
|
MOV_CH_LAYOUT_DVD_4, |
||||||
|
MOV_CH_LAYOUT_QUADRAPHONIC, |
||||||
|
MOV_CH_LAYOUT_MPEG_4_0_B, |
||||||
|
MOV_CH_LAYOUT_ITU_2_2, |
||||||
|
MOV_CH_LAYOUT_AC3_2_1_1, |
||||||
|
MOV_CH_LAYOUT_DTS_3_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_D, |
||||||
|
MOV_CH_LAYOUT_DVD_18, |
||||||
|
MOV_CH_LAYOUT_DTS_4_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_D, |
||||||
|
MOV_CH_LAYOUT_AAC_6_0, |
||||||
|
MOV_CH_LAYOUT_DTS_6_0_A, |
||||||
|
MOV_CH_LAYOUT_AAC_6_1, |
||||||
|
MOV_CH_LAYOUT_AAC_7_0, |
||||||
|
MOV_CH_LAYOUT_DTS_6_1_A, |
||||||
|
MOV_CH_LAYOUT_AAC_OCTAGONAL, |
||||||
|
MOV_CH_LAYOUT_MPEG_7_1_B, |
||||||
|
MOV_CH_LAYOUT_DTS_8_0_A, |
||||||
|
0, |
||||||
|
}; |
||||||
|
|
||||||
|
static const enum MovChannelLayoutTag mov_ch_layouts_ac3[] = { |
||||||
|
MOV_CH_LAYOUT_MONO, |
||||||
|
MOV_CH_LAYOUT_STEREO, |
||||||
|
MOV_CH_LAYOUT_AC3_1_0_1, |
||||||
|
MOV_CH_LAYOUT_AC3_3_0, |
||||||
|
MOV_CH_LAYOUT_ITU_2_1, |
||||||
|
MOV_CH_LAYOUT_DVD_4, |
||||||
|
MOV_CH_LAYOUT_AC3_3_1, |
||||||
|
MOV_CH_LAYOUT_ITU_2_2, |
||||||
|
MOV_CH_LAYOUT_AC3_2_1_1, |
||||||
|
MOV_CH_LAYOUT_AC3_3_0_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_C, |
||||||
|
MOV_CH_LAYOUT_DVD_18, |
||||||
|
MOV_CH_LAYOUT_AC3_3_1_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_C, |
||||||
|
0, |
||||||
|
}; |
||||||
|
|
||||||
|
static const enum MovChannelLayoutTag mov_ch_layouts_alac[] = { |
||||||
|
MOV_CH_LAYOUT_MONO, |
||||||
|
MOV_CH_LAYOUT_STEREO, |
||||||
|
MOV_CH_LAYOUT_MPEG_3_0_B, |
||||||
|
MOV_CH_LAYOUT_MPEG_4_0_B, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_0_D, |
||||||
|
MOV_CH_LAYOUT_MPEG_5_1_D, |
||||||
|
MOV_CH_LAYOUT_AAC_6_1, |
||||||
|
MOV_CH_LAYOUT_MPEG_7_1_B, |
||||||
|
0, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct { |
||||||
|
enum CodecID codec_id; |
||||||
|
const enum MovChannelLayoutTag *layouts; |
||||||
|
} mov_codec_ch_layouts[] = { |
||||||
|
{ CODEC_ID_AAC, mov_ch_layouts_aac }, |
||||||
|
{ CODEC_ID_AC3, mov_ch_layouts_ac3 }, |
||||||
|
{ CODEC_ID_ALAC, mov_ch_layouts_alac }, |
||||||
|
{ CODEC_ID_NONE, NULL }, |
||||||
|
}; |
||||||
|
|
||||||
|
uint64_t ff_mov_get_channel_layout(uint32_t tag, uint32_t bitmap) |
||||||
|
{ |
||||||
|
int i, channels; |
||||||
|
const struct MovChannelLayoutMap *layout_map; |
||||||
|
|
||||||
|
/* handle the use of the channel descriptions */ |
||||||
|
/* TODO: map MOV channel labels to FFmpeg channels */ |
||||||
|
if (tag == MOV_CH_LAYOUT_USE_DESCRIPTIONS) |
||||||
|
return 0; |
||||||
|
|
||||||
|
/* handle the use of the channel bitmap */ |
||||||
|
if (tag == MOV_CH_LAYOUT_USE_BITMAP) |
||||||
|
return bitmap < 0x40000 ? bitmap : 0; |
||||||
|
|
||||||
|
/* get the layout map based on the channel count for the specified layout tag */ |
||||||
|
channels = tag & 0xFFFF; |
||||||
|
if (channels > 9) |
||||||
|
channels = 0; |
||||||
|
layout_map = mov_ch_layout_map[channels]; |
||||||
|
|
||||||
|
/* find the channel layout for the specified layout tag */ |
||||||
|
for (i = 0; layout_map[i].tag != 0; i++) { |
||||||
|
if (layout_map[i].tag == tag) |
||||||
|
break; |
||||||
|
} |
||||||
|
return layout_map[i].layout; |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t ff_mov_get_channel_layout_tag(enum CodecID codec_id, |
||||||
|
uint64_t channel_layout, |
||||||
|
uint32_t *bitmap) |
||||||
|
{ |
||||||
|
int i, j; |
||||||
|
uint32_t tag = 0; |
||||||
|
const enum MovChannelLayoutTag *layouts = NULL; |
||||||
|
|
||||||
|
/* find the layout list for the specified codec */ |
||||||
|
for (i = 0; mov_codec_ch_layouts[i].codec_id != CODEC_ID_NONE; i++) { |
||||||
|
if (mov_codec_ch_layouts[i].codec_id == codec_id) |
||||||
|
break; |
||||||
|
} |
||||||
|
if (mov_codec_ch_layouts[i].codec_id != CODEC_ID_NONE) |
||||||
|
layouts = mov_codec_ch_layouts[i].layouts; |
||||||
|
|
||||||
|
if (layouts) { |
||||||
|
int channels; |
||||||
|
const struct MovChannelLayoutMap *layout_map; |
||||||
|
|
||||||
|
/* get the layout map based on the channel count */ |
||||||
|
channels = av_get_channel_layout_nb_channels(channel_layout); |
||||||
|
if (channels > 9) |
||||||
|
channels = 0; |
||||||
|
layout_map = mov_ch_layout_map[channels]; |
||||||
|
|
||||||
|
/* find the layout tag for the specified channel layout */ |
||||||
|
for (i = 0; layouts[i] != 0; i++) { |
||||||
|
if (layouts[i] & 0xFFFF != channels) |
||||||
|
continue; |
||||||
|
for (j = 0; layout_map[j].tag != 0; j++) { |
||||||
|
if (layout_map[j].tag == layouts[i] && |
||||||
|
layout_map[j].layout == channel_layout) |
||||||
|
break; |
||||||
|
} |
||||||
|
if (layout_map[j].tag) |
||||||
|
break; |
||||||
|
} |
||||||
|
tag = layouts[i]; |
||||||
|
} |
||||||
|
|
||||||
|
/* if no tag was found, use channel bitmap as a backup if possible */ |
||||||
|
if (tag == 0 && channel_layout > 0 && channel_layout < 0x40000) { |
||||||
|
tag = MOV_CH_LAYOUT_USE_BITMAP; |
||||||
|
*bitmap = (uint32_t)channel_layout; |
||||||
|
} else |
||||||
|
*bitmap = 0; |
||||||
|
|
||||||
|
/* TODO: set channel descriptions as a secondary backup */ |
||||||
|
|
||||||
|
return tag; |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011 Justin Ruggles |
||||||
|
* |
||||||
|
* 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 |
||||||
|
*/ |
||||||
|
|
||||||
|
/**
|
||||||
|
* mov 'chan' tag reading/writing. |
||||||
|
* @author Justin Ruggles |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef AVFORMAT_MOV_CHAN_H |
||||||
|
#define AVFORMAT_MOV_CHAN_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
#include "libavcodec/avcodec.h" |
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channel layout for the specified channel layout tag. |
||||||
|
* |
||||||
|
* @param[in] tag channel layout tag |
||||||
|
* @param[out] bitmap channel bitmap (only used if needed) |
||||||
|
* @return channel layout |
||||||
|
*/ |
||||||
|
uint64_t ff_mov_get_channel_layout(uint32_t tag, uint32_t bitmap); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channel layout tag for the specified codec id and channel layout. |
||||||
|
* If the layout tag was not found, use a channel bitmap if possible. |
||||||
|
* |
||||||
|
* @param[in] codec_id codec id |
||||||
|
* @param[in] channel_layout channel layout |
||||||
|
* @param[out] bitmap channel bitmap |
||||||
|
* @return channel layout tag |
||||||
|
*/ |
||||||
|
uint32_t ff_mov_get_channel_layout_tag(enum CodecID codec_id, |
||||||
|
uint64_t channel_layout, |
||||||
|
uint32_t *bitmap); |
||||||
|
|
||||||
|
#endif /* AVFORMAT_MOV_CHAN_H */ |
@ -1,4 +1,4 @@ |
|||||||
aeec610f33d8eec7031c5c6a9aab4cc0 *./tests/data/acodec/pcm_s16be.mov |
d07e475322765c20b1fcdb822ad5dc04 *./tests/data/acodec/pcm_s16be.mov |
||||||
1059029 ./tests/data/acodec/pcm_s16be.mov |
1059065 ./tests/data/acodec/pcm_s16be.mov |
||||||
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav |
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav |
||||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
||||||
|
@ -1,4 +1,4 @@ |
|||||||
9ea74aa6d09fcfe9a1e232efecfb07fe *./tests/data/acodec/pcm_s24be.mov |
f66d9543a4e04346818e802c4f2d7a30 *./tests/data/acodec/pcm_s24be.mov |
||||||
1588229 ./tests/data/acodec/pcm_s24be.mov |
1588265 ./tests/data/acodec/pcm_s24be.mov |
||||||
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav |
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav |
||||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
||||||
|
@ -1,4 +1,4 @@ |
|||||||
25535c11babbc971b6a958e92feaee37 *./tests/data/acodec/pcm_s32be.mov |
09c919947211de14b3ad0e7603e5b44e *./tests/data/acodec/pcm_s32be.mov |
||||||
2117429 ./tests/data/acodec/pcm_s32be.mov |
2117465 ./tests/data/acodec/pcm_s32be.mov |
||||||
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav |
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav |
||||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |
||||||
|
@ -1,4 +1,4 @@ |
|||||||
d63813e9255a74324ea4559d6a8a1f7c *./tests/data/acodec/pcm_s8.mov |
52d8c65c4987227979785d5ac2030175 *./tests/data/acodec/pcm_s8.mov |
||||||
529829 ./tests/data/acodec/pcm_s8.mov |
529865 ./tests/data/acodec/pcm_s8.mov |
||||||
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav |
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav |
||||||
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 |
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 |
||||||
|
@ -1,3 +1,3 @@ |
|||||||
93ed3b20190daa51aeb19f62f939d04a *./tests/data/lavf/lavf.mov |
3340b7ffe1b1d98a50622bd53f786d41 *./tests/data/lavf/lavf.mov |
||||||
357821 ./tests/data/lavf/lavf.mov |
357857 ./tests/data/lavf/lavf.mov |
||||||
./tests/data/lavf/lavf.mov CRC=0x2f6a9b26 |
./tests/data/lavf/lavf.mov CRC=0x2f6a9b26 |
||||||
|
Loading…
Reference in new issue