Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 10 Dec 2011 00:25:15 +0000 (01:25 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 10 Dec 2011 01:01:03 +0000 (02:01 +0100)
* 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>
25 files changed:
1  2 
Doxyfile
doc/avtools-common-opts.texi
doc/bitstream_filters.texi
doc/demuxers.texi
doc/fate.texi
doc/ffserver.texi
doc/general.texi
doc/git-howto.texi
doc/indevs.texi
doc/muxers.texi
doc/platform.texi
doc/protocols.texi
doc/t2h.init
libavformat/Makefile
libavformat/isom.c
libavformat/mov.c
libavformat/mov_chan.c
libavformat/movenc.c
libavutil/audioconvert.h
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

diff --cc Doxyfile
Simple merge
Simple merge
@@@ -34,7 -34,7 +34,7 @@@ JPEG image. The individual frames can b
  e.g. by
  
  @example
- ffmpeg -i ../some_mjpeg.avi -vcodec copy frames_%d.jpg
 -avconv -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
++ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
  @end example
  
  Unfortunately, these chunks are incomplete JPEG images, because
@@@ -57,9 -57,9 +57,9 @@@ stream (carrying the AVI1 header ID an
  produce fully qualified JPEG images.
  
  @example
- ffmpeg -i mjpeg-movie.avi -vcodec copy -vbsf mjpeg2jpeg frame_%d.jpg
 -avconv -i mjpeg-movie.avi -c:v copy -vbsf mjpeg2jpeg frame_%d.jpg
++ffmpeg -i mjpeg-movie.avi -c:v copy -vbsf mjpeg2jpeg frame_%d.jpg
  exiftran -i -9 frame*.jpg
- ffmpeg -i frame_%d.jpg -vcodec copy rotated.avi
 -avconv -i frame_%d.jpg -c:v copy rotated.avi
++ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
  @end example
  
  @section mjpega_dump_header
@@@ -49,19 -49,19 +49,19 @@@ sequence of filenames of the form @file
  The size, the pixel format, and the format of each image must be the
  same for all the files in the sequence.
  
- The following example shows how to use @file{ffmpeg} for creating a
 -The following example shows how to use @command{avconv} for creating a
++The following example shows how to use @command{ffmpeg} for creating a
  video from the images in the file sequence @file{img-001.jpeg},
 -@file{img-002.jpeg}, ..., assuming an input framerate of 10 frames per
 +@file{img-002.jpeg}, ..., assuming an input frame rate of 10 frames per
  second:
  @example
- ffmpeg -r 10 -f image2 -i 'img-%03d.jpeg' out.avi
 -avconv -i 'img-%03d.jpeg' -r 10 out.mkv
++ffmpeg -i 'img-%03d.jpeg' -r 10 out.mkv
  @end example
  
  Note that the pattern must not necessarily contain "%d" or
  "%0@var{N}d", for example to convert a single image file
  @file{img.jpeg} you can employ the command:
  @example
- ffmpeg -f image2 -i img.jpeg img.png
 -avconv -i img.jpeg img.png
++ffmpeg -i img.jpeg img.png
  @end example
  
  @section applehttp
diff --cc doc/fate.texi
index 0000000,9141eeb..297c0e2
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,135 +1,135 @@@
 -FATE provides a regression testsuite embedded within the Libav build system.
+ \input texinfo @c -*- texinfo -*-
+ @settitle FATE Automated Testing Environment
+ @titlepage
+ @center @titlefont{FATE Automated Testing Environment}
+ @end titlepage
+ @top
+ @contents
+ @chapter Introduction
 -aggregator and viewer @url{http://fate.libav.org}.
++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
 -# rsync -aL rsync://fate-suite.libav.org/fate-suite/ fate-suite
++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
 -This shell script builds Libav, runs the regression tests and prepares a
 -report that can be sent to @url{fate.libav.org} or directly examined locally.
++# 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.
 -Additional optional parameter to tune the Libav building and reporting process
++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.
 -repo=git://git.libav.org/libav.git      # the source repository
++Additional optional parameter to tune the FFmpeg building and reporting process
+ can be passed.
+ @example
+ slot=                                   # some unique identifier
 -fate_recv="ssh -T fate@@fate.libav.org"  # command to submit report
++repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
+ samples=/path/to/fate/samples
+ workdir=                                # directory in which to do all the work
 -to @email{root@@libav.org}.
 -The current server fingerprint is @var{a4:99:d7:d3:1c:92:0d:56:d6:d5:61:be:01:ae:7d:e6}
++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}
index 8b62c50,0000000..3ff275d
mode 100644,000000..100644
--- /dev/null
@@@ -1,278 -1,0 +1,278 @@@
- etc. are not covered here. Read @file{ffmpeg-doc.html} for more
 +\input texinfo @c -*- texinfo -*-
 +
 +@settitle ffserver Documentation
 +@titlepage
 +@center @titlefont{ffserver Documentation}
 +@end titlepage
 +
 +@top
 +
 +@contents
 +
 +@chapter Synopsys
 +
 +The generic syntax is:
 +
 +@example
 +@c man begin SYNOPSIS
 +ffserver [options]
 +@c man end
 +@end example
 +
 +@chapter Description
 +@c man begin DESCRIPTION
 +
 +ffserver is a streaming server for both audio and video. It supports
 +several live feeds, streaming from files and time shifting on live feeds
 +(you can seek to positions in the past on each live feed, provided you
 +specify a big enough feed storage in ffserver.conf).
 +
 +ffserver runs in daemon mode by default; that is, it puts itself in
 +the background and detaches from its TTY, unless it is launched in
 +debug mode or a NoDaemon option is specified in the configuration
 +file.
 +
 +This documentation covers only the streaming aspects of ffserver /
 +ffmpeg. All questions about parameters for ffmpeg, codec questions,
- ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffmpeg/doc/ffserver.conf}
++etc. are not covered here. Read @file{ffmpeg.html} for more
 +information.
 +
 +@section How does it work?
 +
 +ffserver receives prerecorded files or FFM streams from some ffmpeg
 +instance as input, then streams them over RTP/RTSP/HTTP.
 +
 +An ffserver instance will listen on some port as specified in the
 +configuration file. You can launch one or more instances of ffmpeg and
 +send one or more FFM streams to the port where ffserver is expecting
 +to receive them. Alternately, you can make ffserver launch such ffmpeg
 +instances at startup.
 +
 +Input streams are called feeds, and each one is specified by a <Feed>
 +section in the configuration file.
 +
 +For each feed you can have different output streams in various
 +formats, each one specified by a <Stream> section in the configuration
 +file.
 +
 +@section Status stream
 +
 +ffserver supports an HTTP interface which exposes the current status
 +of the server.
 +
 +Simply point your browser to the address of the special status stream
 +specified in the configuration file.
 +
 +For example if you have:
 +@example
 +<Stream status.html>
 +Format status
 +
 +# Only allow local people to get the status
 +ACL allow localhost
 +ACL allow 192.168.0.0 192.168.255.255
 +</Stream>
 +@end example
 +
 +then the server will post a page with the status information when
 +the special stream @file{status.html} is requested.
 +
 +@section What can this do?
 +
 +When properly configured and running, you can capture video and audio in real
 +time from a suitable capture card, and stream it out over the Internet to
 +either Windows Media Player or RealAudio player (with some restrictions).
 +
 +It can also stream from files, though that is currently broken. Very often, a
 +web server can be used to serve up the files just as well.
 +
 +It can stream prerecorded video from .ffm files, though it is somewhat tricky
 +to make it work correctly.
 +
 +@section What do I need?
 +
 +I use Linux on a 900 MHz Duron with a cheapo Bt848 based TV capture card. I'm
 +using stock Linux 2.4.17 with the stock drivers. [Actually that isn't true,
 +I needed some special drivers for my motherboard-based sound card.]
 +
 +I understand that FreeBSD systems work just fine as well.
 +
 +@section How do I make it work?
 +
 +First, build the kit. It *really* helps to have installed LAME first. Then when
 +you run the ffserver ./configure, make sure that you have the
 +@code{--enable-libmp3lame} flag turned on.
 +
 +LAME is important as it allows for streaming audio to Windows Media Player.
 +Don't ask why the other audio types do not work.
 +
 +As a simple test, just run the following two command lines where INPUTFILE
 +is some file which you can decode with ffmpeg:
 +
 +@example
 +ffserver -f doc/ffserver.conf &
 +ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm
 +@end example
 +
 +At this point you should be able to go to your Windows machine and fire up
 +Windows Media Player (WMP). Go to Open URL and enter
 +
 +@example
 +    http://<linuxbox>:8090/test.asf
 +@end example
 +
 +You should (after a short delay) see video and hear audio.
 +
 +WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to
 +transfer the entire file before starting to play.
 +The same is true of AVI files.
 +
 +@section What happens next?
 +
 +You should edit the ffserver.conf file to suit your needs (in terms of
 +frame rates etc). Then install ffserver and ffmpeg, write a script to start
 +them up, and off you go.
 +
 +@section Troubleshooting
 +
 +@subsection I don't hear any audio, but video is fine.
 +
 +Maybe you didn't install LAME, or got your ./configure statement wrong. Check
 +the ffmpeg output to see if a line referring to MP3 is present. If not, then
 +your configuration was incorrect. If it is, then maybe your wiring is not
 +set up correctly. Maybe the sound card is not getting data from the right
 +input source. Maybe you have a really awful audio interface (like I do)
 +that only captures in stereo and also requires that one channel be flipped.
 +If you are one of these people, then export 'AUDIO_FLIP_LEFT=1' before
 +starting ffmpeg.
 +
 +@subsection The audio and video loose sync after a while.
 +
 +Yes, they do.
 +
 +@subsection After a long while, the video update rate goes way down in WMP.
 +
 +Yes, it does. Who knows why?
 +
 +@subsection WMP 6.4 behaves differently to WMP 7.
 +
 +Yes, it does. Any thoughts on this would be gratefully received. These
 +differences extend to embedding WMP into a web page. [There are two
 +object IDs that you can use: The old one, which does not play well, and
 +the new one, which does (both tested on the same system). However,
 +I suspect that the new one is not available unless you have installed WMP 7].
 +
 +@section What else can it do?
 +
 +You can replay video from .ffm files that was recorded earlier.
 +However, there are a number of caveats, including the fact that the
 +ffserver parameters must match the original parameters used to record the
 +file. If they do not, then ffserver deletes the file before recording into it.
 +(Now that I write this, it seems broken).
 +
 +You can fiddle with many of the codec choices and encoding parameters, and
 +there are a bunch more parameters that you cannot control. Post a message
 +to the mailing list if there are some 'must have' parameters. Look in
 +ffserver.conf for a list of the currently available controls.
 +
 +It will automatically generate the ASX or RAM files that are often used
 +in browsers. These files are actually redirections to the underlying ASF
 +or RM file. The reason for this is that the browser often fetches the
 +entire file before starting up the external viewer. The redirection files
 +are very small and can be transferred quickly. [The stream itself is
 +often 'infinite' and thus the browser tries to download it and never
 +finishes.]
 +
 +@section Tips
 +
 +* When you connect to a live stream, most players (WMP, RA, etc) want to
 +buffer a certain number of seconds of material so that they can display the
 +signal continuously. However, ffserver (by default) starts sending data
 +in realtime. This means that there is a pause of a few seconds while the
 +buffering is being done by the player. The good news is that this can be
 +cured by adding a '?buffer=5' to the end of the URL. This means that the
 +stream should start 5 seconds in the past -- and so the first 5 seconds
 +of the stream are sent as fast as the network will allow. It will then
 +slow down to real time. This noticeably improves the startup experience.
 +
 +You can also add a 'Preroll 15' statement into the ffserver.conf that will
 +add the 15 second prebuffering on all requests that do not otherwise
 +specify a time. In addition, ffserver will skip frames until a key_frame
 +is found. This further reduces the startup delay by not transferring data
 +that will be discarded.
 +
 +* You may want to adjust the MaxBandwidth in the ffserver.conf to limit
 +the amount of bandwidth consumed by live streams.
 +
 +@section Why does the ?buffer / Preroll stop working after a time?
 +
 +It turns out that (on my machine at least) the number of frames successfully
 +grabbed is marginally less than the number that ought to be grabbed. This
 +means that the timestamp in the encoded data stream gets behind realtime.
 +This means that if you say 'Preroll 10', then when the stream gets 10
 +or more seconds behind, there is no Preroll left.
 +
 +Fixing this requires a change in the internals of how timestamps are
 +handled.
 +
 +@section Does the @code{?date=} stuff work.
 +
 +Yes (subject to the limitation outlined above). Also note that whenever you
 +start ffserver, it deletes the ffm file (if any parameters have changed),
 +thus wiping out what you had recorded before.
 +
 +The format of the @code{?date=xxxxxx} is fairly flexible. You should use one
 +of the following formats (the 'T' is literal):
 +
 +@example
 +* YYYY-MM-DDTHH:MM:SS     (localtime)
 +* YYYY-MM-DDTHH:MM:SSZ    (UTC)
 +@end example
 +
 +You can omit the YYYY-MM-DD, and then it refers to the current day. However
 +note that @samp{?date=16:00:00} refers to 16:00 on the current day -- this
 +may be in the future and so is unlikely to be useful.
 +
 +You use this by adding the ?date= to the end of the URL for the stream.
 +For example:   @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}.
 +@c man end
 +
 +@chapter Options
 +@c man begin OPTIONS
 +
 +@include avtools-common-opts.texi
 +
 +@section Main options
 +
 +@table @option
 +@item -f @var{configfile}
 +Use @file{configfile} instead of @file{/etc/ffserver.conf}.
 +@item -n
 +Enable no-launch mode. This option disables all the Launch directives
 +within the various <Stream> sections. Since ffserver will not launch
 +any ffmpeg instances, you will have to launch them manually.
 +@item -d
 +Enable debug mode. This option increases log verbosity, directs log
 +messages to stdout and causes ffserver to run in the foreground
 +rather than as a daemon.
 +@end table
 +@c man end
 +
 +@ignore
 +
 +@setfilename ffserver
 +@settitle ffserver video server
 +
 +@c man begin SEEALSO
 +
++ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffserver.conf}
 +example and the FFmpeg HTML documentation
 +@c man end
 +
 +@c man begin AUTHORS
 +The FFmpeg developers
 +@c man end
 +
 +@end ignore
 +
 +@bye
@@@ -9,34 -9,81 +9,89 @@@
  
  @contents
  
- @chapter external libraries
+ @chapter External libraries
  
 -Libav can be hooked up with a number of external libraries to add support
 +FFmpeg can be hooked up with a number of external libraries to add support
  for more formats. None of them are used by default, their use has to be
  explicitly requested by passing the appropriate flags to @file{./configure}.
  
- @section OpenCORE AMR
 +@section OpenJPEG
 +
 +FFmpeg can use the OpenJPEG libraries for encoding/decoding J2K videos.  Go to
 +@url{http://www.openjpeg.org/} to get the libraries and follow the installation
 +instructions.  To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to
 +@file{./configure}.
 +
 +
+ @section OpenCORE and VisualOn libraries
  
- FFmpeg can make use of the OpenCORE libraries for AMR-NB
decoding/encoding and AMR-WB decoding.
+ Spun off Google Android sources, OpenCore and VisualOn libraries provide
encoders for a number of audio codecs.
  
- Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for
- installing the libraries. Then pass @code{--enable-libopencore-amrnb} and/or
- @code{--enable-libopencore-amrwb} to configure to enable the libraries.
- Note that OpenCORE is under the Apache License 2.0 (see
- @url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
+ @float NOTE
+ OpenCORE and VisualOn libraries are under the Apache License 2.0
+ (see @url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
  incompatible with the LGPL version 2.1 and GPL version 2. You have to
 -upgrade Libav's license to LGPL version 3 (or if you have enabled
 +upgrade FFmpeg's license to LGPL version 3 (or if you have enabled
  GPL components, GPL version 3) to use it.
 -Libav can make use of the OpenCORE libraries for AMR-NB
+ @end float
+ @subsection OpenCORE AMR
 -Libav can make use of the VisualOn AACenc library for AAC encoding.
++FFmpeg can make use of the OpenCORE libraries for AMR-NB
+ decoding/encoding and AMR-WB decoding.
+ Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
+ instructions for installing the libraries.
+ Then pass @code{--enable-libopencore-amrnb} and/or
+ @code{--enable-libopencore-amrwb} to configure to enable them.
+ @subsection VisualOn AAC encoder library
 -Libav can make use of the VisualOn AMR-WBenc library for AMR-WB encoding.
++FFmpeg can make use of the VisualOn AACenc library for AAC encoding.
+ Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
+ instructions for installing the library.
+ Then pass @code{--enable-libvo-aacenc} to configure to enable it.
+ @subsection VisualOn AMR-WB encoder library
 -Libav can make use of the LAME library for MP3 encoding.
++FFmpeg can make use of the VisualOn AMR-WBenc library for AMR-WB encoding.
+ Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
+ instructions for installing the library.
+ Then pass @code{--enable-libvo-amrwbenc} to configure to enable it.
+ @section LAME
 -Libav can make use of the libvpx library for VP8 encoding.
++FFmpeg can make use of the LAME library for MP3 encoding.
+ Go to @url{http://lame.sourceforge.net/} and follow the
+ instructions for installing the library.
+ Then pass @code{--enable-libmp3lame} to configure to enable it.
+ @section libvpx
 -Libav can make use of the x264 library for H.264 encoding.
++FFmpeg can make use of the libvpx library for VP8 encoding.
+ Go to @url{http://www.webmproject.org/} and follow the instructions for
+ installing the library. Then pass @code{--enable-libvpx} to configure to
+ enable it.
+ @section x264
 -details), you must upgrade Libav's license to GPL in order to use it.
++FFmpeg can make use of the x264 library for H.264 encoding.
+ Go to @url{http://www.videolan.org/developers/x264.html} and follow the
+ instructions for installing the library. Then pass @code{--enable-libx264} to
+ configure to enable it.
+ @float NOTE
+ x264 is under the GNU Public License Version 2 or later
+ (see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for
++details), you must upgrade FFmpeg's license to GPL in order to use it.
+ @end float
  
  
  @chapter Supported File Formats and Codecs
index 0000000,b01981e..f15c1ce
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,344 +1,344 @@@
 -@settitle Using git to develop Libav
+ \input texinfo @c -*- texinfo -*-
 -@center @titlefont{Using git to develop Libav}
++@settitle Using git to develop FFmpeg
+ @titlepage
 -What follows now is a basic introduction to Git and some Libav-specific
++@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.
 -git clone git://git.libav.org/libav.git <target>
++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
 -This will put the Libav sources into the directory @var{<target>}.
++git clone git://source.ffmpeg.org/ffmpeg <target>
+ @end example
 -git clone git@@git.libav.org:libav.git <target>
++This will put the FFmpeg sources into the directory @var{<target>}.
+ @example
 -This will put the Libav sources into the directory @var{<target>} and let
++git clone git@@source.ffmpeg.org:ffmpeg <target>
+ @end example
 -Since merge commits are forbidden @command{--rebase} (see below) is recommended.
++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
 -Libav's master tree. The master tree will reject pushes with merge commits.
++@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
 -interface available at http://git.libav.org/
++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
 -@chapter Libav specific
++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
 -Contact the project admins @email{git@@libav.org} if you have technical
++@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.
diff --cc doc/indevs.texi
@@@ -42,10 -42,10 +42,10 @@@ specify card number or identifier, devi
  To see the list of cards currently recognized by your system check the
  files @file{/proc/asound/cards} and @file{/proc/asound/devices}.
  
- For example to capture with @file{ffmpeg} from an ALSA device with
 -For example to capture with @command{avconv} from an ALSA device with
++For example to capture with @command{ffmpeg} from an ALSA device with
  card id 0, you may run the command:
  @example
 -avconv -f alsa -i hw:0 alsaout.wav
 +ffmpeg -f alsa -i hw:0 alsaout.wav
  @end example
  
  For more information see:
@@@ -167,14 -72,14 +167,14 @@@ For more detailed information read the 
  Documentation/fb/framebuffer.txt included in the Linux source tree.
  
  To record from the framebuffer device @file{/dev/fb0} with
- @file{ffmpeg}:
 -@command{avconv}:
++@command{ffmpeg}:
  @example
 -avconv -f fbdev -r 10 -i /dev/fb0 out.avi
 +ffmpeg -f fbdev -r 10 -i /dev/fb0 out.avi
  @end example
  
  You can take a single screenshot image with the command:
  @example
- ffmpeg -f fbdev -vframes 1 -r 1 -i /dev/fb0 screenshot.jpeg
 -avconv -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg
++ffmpeg -f fbdev -frames:v 1 -r 1 -i /dev/fb0 screenshot.jpeg
  @end example
  
  See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
@@@ -204,10 -109,10 +204,10 @@@ To list the JACK clients and their prop
  @file{jack_lsp}.
  
  Follows an example which shows how to capture a JACK readable client
- with @file{ffmpeg}.
 -with @command{avconv}.
++with @command{ffmpeg}.
  @example
 -# Create a JACK writable client with name "libav".
 -$ avconv -f jack -i libav -y out.wav
 +# Create a JACK writable client with name "ffmpeg".
 +$ ffmpeg -f jack -i ffmpeg -y out.wav
  
  # Start the sample jack_metro readable client.
  $ jack_metro -b 120 -d 0.2 -f 4000
@@@ -395,10 -145,10 +395,10 @@@ The filename to provide to the input de
  representing the OSS input device, and is usually set to
  @file{/dev/dsp}.
  
- For example to grab from @file{/dev/dsp} using @file{ffmpeg} use the
 -For example to grab from @file{/dev/dsp} using @command{avconv} use the
++For example to grab from @file{/dev/dsp} using @command{ffmpeg} use the
  command:
  @example
 -avconv -f oss -i /dev/dsp /tmp/oss.wav
 +ffmpeg -f oss -i /dev/dsp /tmp/oss.wav
  @end example
  
  For more information about OSS see:
@@@ -418,7 -168,7 +418,7 @@@ To list the pulse source devices and th
  the command @file{pactl list sources}.
  
  @example
--avconv -f pulse -i default /tmp/pulse.wav
++ffmpeg -f pulse -i default /tmp/pulse.wav
  @end example
  
  @subsection @var{server} AVOption
@@@ -498,10 -248,10 +498,10 @@@ The filename to provide to the input de
  representing the sndio input device, and is usually set to
  @file{/dev/audio0}.
  
- For example to grab from @file{/dev/audio0} using @file{ffmpeg} use the
 -For example to grab from @file{/dev/audio0} using @command{avconv} use the
++For example to grab from @file{/dev/audio0} using @command{ffmpeg} use the
  command:
  @example
 -avconv -f sndio -i /dev/audio0 /tmp/oss.wav
 +ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav
  @end example
  
  @section video4linux and video4linux2
@@@ -582,12 -326,12 +582,12 @@@ Check the X11 documentation (e.g. man X
  Use the @file{dpyinfo} program for getting basic information about the
  properties of your X11 display (e.g. grep for "name" or "dimensions").
  
- For example to grab from @file{:0.0} using @file{ffmpeg}:
 -For example to grab from @file{:0.0} using @command{avconv}:
++For example to grab from @file{:0.0} using @command{ffmpeg}:
  @example
 -avconv -f x11grab -r 25 -s cif -i :0.0 out.mpg
 +ffmpeg -f x11grab -r 25 -s cif -i :0.0 out.mpg
  
  # Grab at position 10,20.
 -avconv -f x11grab -r 25 -s cif -i :0.0+10,20 out.mpg
 +ffmpeg -f x11grab -r 25 -s cif -i :0.0+10,20 out.mpg
  @end example
  
  @subsection @var{follow_mouse} AVOption
diff --cc doc/muxers.texi
@@@ -40,15 -40,15 +40,15 @@@ ffmpeg -i INPUT -f crc out.cr
  
  You can print the CRC to stdout with the command:
  @example
 -avconv -i INPUT -f crc -
 +ffmpeg -i INPUT -f crc -
  @end example
  
- You can select the output format of each frame with @file{ffmpeg} by
 -You can select the output format of each frame with @command{avconv} by
++You can select the output format of each frame with @command{ffmpeg} by
  specifying the audio and video codec and format. For example to
  compute the CRC of the input audio converted to PCM unsigned 8-bit
  and the input video converted to MPEG-2 video, use the command:
  @example
- ffmpeg -i INPUT -acodec pcm_u8 -vcodec mpeg2video -f crc -
 -avconv -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc -
++ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc -
  @end example
  
  See also the @ref{framecrc} muxer.
@@@ -76,16 -76,16 +76,16 @@@ ffmpeg -i INPUT -f framecrc out.cr
  
  You can print the CRC of each decoded frame to stdout with the command:
  @example
 -avconv -i INPUT -f framecrc -
 +ffmpeg -i INPUT -f framecrc -
  @end example
  
- You can select the output format of each frame with @file{ffmpeg} by
 -You can select the output format of each frame with @command{avconv} by
++You can select the output format of each frame with @command{ffmpeg} by
  specifying the audio and video codec and format. For example, to
  compute the CRC of each decoded input audio frame converted to PCM
  unsigned 8-bit and of each decoded input video frame converted to
  MPEG-2 video, use the command:
  @example
- ffmpeg -i INPUT -acodec pcm_u8 -vcodec mpeg2video -f framecrc -
 -avconv -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -
++ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -
  @end example
  
  See also the @ref{crc} muxer.
@@@ -119,46 -119,28 +119,46 @@@ The pattern "img%%-%d.jpg" will specif
  form @file{img%-1.jpg}, @file{img%-2.jpg}, ..., @file{img%-10.jpg},
  etc.
  
- The following example shows how to use @file{ffmpeg} for creating a
 -The following example shows how to use @command{avconv} for creating a
++The following example shows how to use @command{ffmpeg} for creating a
  sequence of files @file{img-001.jpeg}, @file{img-002.jpeg}, ...,
  taking one image every second from the input video:
  @example
- ffmpeg -i in.avi -r 1 -f image2 'img-%03d.jpeg'
 -avconv -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg'
++ffmpeg -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg'
  @end example
  
- Note that with @file{ffmpeg}, if the format is not specified with the
 -Note that with @command{avconv}, if the format is not specified with the
++Note that with @command{ffmpeg}, if the format is not specified with the
  @code{-f} option and the output filename specifies an image file
  format, the image2 muxer is automatically selected, so the previous
  command can be written as:
  @example
- ffmpeg -i in.avi -r 1 'img-%03d.jpeg'
 -avconv -i in.avi -vsync 1 -r 1 'img-%03d.jpeg'
++ffmpeg -i in.avi -vsync 1 -r 1 'img-%03d.jpeg'
  @end example
  
  Note also that the pattern must not necessarily contain "%d" or
  "%0@var{N}d", for example to create a single image file
  @file{img.jpeg} from the input video you can employ the command:
  @example
- ffmpeg -i in.avi -f image2 -vframes 1 img.jpeg
 -avconv -i in.avi -f image2 -frames:v 1 img.jpeg
++ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
  @end example
  
 +The image muxer supports the .Y.U.V image file format. This format is
 +special in that that each image frame consists of three files, for
 +each of the YUV420P components. To read or write this image file format,
 +specify the name of the '.Y' file. The muxer will automatically open the
 +'.U' and '.V' files as required.
 +
 +@section mov
 +
 +MOV / MP4 muxer
 +
 +The muxer options are:
 +
 +@table @option
 +@item -moov_size @var{bytes}
 +Reserves space for the moov atom at the beginning of the file instead of placing the
 +moov atom at the end. If the space reserved is insufficient, muxing will fail.
 +@end table
 +
  @section mpegts
  
  MPEG transport stream muxer.
@@@ -189,7 -171,7 +189,7 @@@ and @code{service_name}. If they are no
  @code{service_name} is "Service01".
  
  @example
- ffmpeg -i file.mpg -acodec copy -vcodec copy \
 -avconv -i file.mpg -c copy \
++ffmpeg -i file.mpg -c copy \
       -mpegts_original_network_id 0x1122 \
       -mpegts_transport_stream_id 0x3344 \
       -mpegts_service_id 0x5566 \
@@@ -207,14 -189,14 +207,14 @@@ Null muxer
  This muxer does not generate any output file, it is mainly useful for
  testing or benchmarking purposes.
  
- For example to benchmark decoding with @file{ffmpeg} you can use the
 -For example to benchmark decoding with @command{avconv} you can use the
++For example to benchmark decoding with @command{ffmpeg} you can use the
  command:
  @example
 -avconv -benchmark -i INPUT -f null out.null
 +ffmpeg -benchmark -i INPUT -f null out.null
  @end example
  
  Note that the above command does not read or write the @file{out.null}
- file, but specifying the output file is required by the @file{ffmpeg}
 -file, but specifying the output file is required by the @command{avconv}
++file, but specifying the output file is required by the @command{ffmpeg}
  syntax.
  
  Alternatively you can write the command as:
@@@ -282,7 -264,7 +282,7 @@@ Both eyes laced in one Block, Right-ey
  
  For example a 3D WebM clip can be created using the following command line:
  @example
- ffmpeg -i sample_left_right_clip.mpg -an -vcodec libvpx -metadata stereo_mode=left_right -y stereo_clip.webm
 -avconv -i sample_left_right_clip.mpg -an -c:v libvpx -metadata STEREO_MODE=left_right -y stereo_clip.webm
++ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm
  @end example
  
  @c man end MUXERS
index 0000000,6a44640..d15c574
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,359 +1,387 @@@
 -Some parts of Libav cannot be built with version 2.15 of the GNU
+ \input texinfo @c -*- texinfo -*-
+ @settitle Platform Specific information
+ @titlepage
+ @center @titlefont{Platform Specific information}
+ @end titlepage
+ @top
+ @contents
+ @chapter Unix-like
 -BSD make will not build Libav, you need to install and use GNU Make
++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
 -GNU Make is required to build Libav, so you have to invoke (@file{gmake}),
++BSD make will not build FFmpeg, you need to install and use GNU Make
+ (@file{gmake}).
+ @section (Open)Solaris
 -in your PATH, Libav's configure will pick it up automatically.
++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
 -For information about compiling Libav on OS/2 see
++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
 -Libav can be built to run natively on Windows using the MinGW tools. Install
++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
 -You can find detailed installation
 -instructions in the download section and the FAQ.
++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/}.
 -Libav does not build out-of-the-box with the packages the automated MinGW
++You can find detailed installation instructions in the download
++section and the FAQ.
 -Libav automatically passes @code{-fno-common} to the compiler to work around
++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
 -@item In order to compile AVplay, you must have the MinGW development library
++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 By using @code{./configure --enable-shared} when configuring Libav,
 -you can build libavutil, libavcodec and libavformat as DLLs.
++@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.
 -As stated in the FAQ, Libav will not compile under MSVC++. However, if you
++@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
 -This description of how to use the Libav libraries with MSVC++ is based on
++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.
 -Assuming you have just built and installed Libav in @file{/usr/local}.
++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
 -@file{libavformat/output-example.c} from the Libav distribution.
++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
 -Directories" setting to contain the path where the Libav includes were
++@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
 -directory where Libav was installed (i.e. @file{c:\msys\1.0\local\lib}),
++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}
 -@item MSVC++ lacks some C99 header files that are fundamental for Libav.
++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.
 -Libav, so you must add this line before @code{#include}ing libav*:
++@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
 -Within the MSYS shell, build Libav with
++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++:
 -Libav headers do not declare global data for Windows DLLs through the usual
++@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.
 -Then configure Libav with the following options:
++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 you can easily test Libav with @uref{http://www.winehq.com/, Wine}.
++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).
 -If you want to build Libav with additional libraries, download Cygwin
++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
 -yasm, libSDL-devel, libdirac-devel, libfaac-devel, libgsm-devel,
++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
@@@ -67,10 -67,10 +67,10 @@@ File access protocol
  
  Allow to read from or read to a file.
  
- For example to read from a file @file{input.mpeg} with @file{ffmpeg}
 -For example to read from a file @file{input.mpeg} with @command{avconv}
++For example to read from a file @file{input.mpeg} with @command{ffmpeg}
  use the command:
  @example
 -avconv -i file:input.mpeg output.mpeg
 +ffmpeg -i file:input.mpeg output.mpeg
  @end example
  
  The ff* tools default to the file protocol, that is a resource
@@@ -134,18 -134,18 +134,18 @@@ pipe (e.g. 0 for stdin, 1 for stdout, 
  is not specified, by default the stdout file descriptor will be used
  for writing, stdin for reading.
  
- For example to read from stdin with @file{ffmpeg}:
 -For example to read from stdin with @command{avconv}:
++For example to read from stdin with @command{ffmpeg}:
  @example
 -cat test.wav | avconv -i pipe:0
 +cat test.wav | ffmpeg -i pipe:0
  # ...this is the same as...
 -cat test.wav | avconv -i pipe:
 +cat test.wav | ffmpeg -i pipe:
  @end example
  
- For writing to stdout with @file{ffmpeg}:
 -For writing to stdout with @command{avconv}:
++For writing to stdout with @command{ffmpeg}:
  @example
 -avconv -i test.wav -f avi pipe:1 | cat > test.avi
 +ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
  # ...this is the same as...
 -avconv -i test.wav -f avi pipe: | cat > test.avi
 +ffmpeg -i test.wav -f avi pipe: | cat > test.avi
  @end example
  
  Note that some formats (typically MOV), require the output protocol to
@@@ -219,14 -219,14 +219,14 @@@ meaning as specified for the RTMP nativ
  See the librtmp manual page (man 3 librtmp) for more information.
  
  For example, to stream a file in real-time to an RTMP server using
- @file{ffmpeg}:
 -@command{avconv}:
++@command{ffmpeg}:
  @example
 -avconv -re -i myfile -f flv rtmp://myserver/live/mystream
 +ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream
  @end example
  
 -To play the same stream using @file{avplay}:
 +To play the same stream using @file{ffplay}:
  @example
 -avplay "rtmp://myserver/live/mystream live=1"
 +ffplay "rtmp://myserver/live/mystream live=1"
  @end example
  
  @section rtp
@@@ -249,7 -249,7 +249,7 @@@ The required syntax for a RTSP url is
  rtsp://@var{hostname}[:@var{port}]/@var{path}
  @end example
  
- The following options (set on the @file{ffmpeg}/@file{ffplay} command
 -The following options (set on the @command{avconv}/@file{avplay} command
++The following options (set on the @command{ffmpeg}/@file{ffplay} command
  line, or set in code via @code{AVOption}s or in @code{avformat_open_input}),
  are supported:
  
@@@ -472,7 -472,7 +472,7 @@@ For receiving, this gives the benefit o
  the specified peer address/port.
  @end table
  
- Some usage examples of the udp protocol with @file{ffmpeg} follow.
 -Some usage examples of the udp protocol with @command{avconv} follow.
++Some usage examples of the udp protocol with @command{ffmpeg} follow.
  
  To stream over UDP to a remote endpoint:
  @example
diff --cc doc/t2h.init
@@@ -9,8 -9,65 +9,65 @@@ $EXTRA_HEAD 
  <link rel="stylesheet" type="text/css" href="default.css" />
  ';
  
+ $CSS_LINES = <<EOT;
+ <style type="text/css">
+ <!--
+ a.summary-letter { text-decoration: none }
+ a { color: #2D6198; }
+ a:visited { color: #884488; }
+ h1 a, h2 a, h3 a { text-decoration: inherit; color: inherit; }
+ p { margin-left: 1em; margin-right: 1em; }
+ table { margin-left: 2em; }
+ pre { margin-left: 2em; }
+ #footer { text-align: center; }
+ #body { margin-left: 1em; margin-right: 1em; }
+ body { background-color: #313131; margin: 0; }
+ #container {
+     background-color: white;
+     color: #202020;
+     margin-left: 1em;
+     margin-right: 1em;
+ }
+ h1 {
+     background-color: #7BB37B;
+     border: 1px solid #6A996A;
+     color: #151515;
+     font-size: 1.2em;
+     padding-bottom: 0.2em;
+     padding-left: 0.4em;
+     padding-top: 0.2em;
+ }
+ h2 {
+     color: #313131;
+     font-size: 1.2em;
+ }
+ h3 {
+     color: #313131;
+     font-size: 0.8em;
+     margin-bottom: -8px;
+ }
+ .note {
+     margin: 1em;
+     border: 1px solid #bbc9d8;
+     background-color: #dde1e1;
+ }
+ .important {
+     margin: 1em;
+     border: 1px solid #d26767;
+     background-color: #f8e1e1;
+ }
+ -->
+ </style>
+ EOT
  
 -my $LIBAV_NAVBAR = $ENV{"LIBAV_NAVBAR"} || '';
 +my $FFMPEG_NAVBAR = $ENV{"FFMPEG_NAVBAR"} || '';
  
  $AFTER_BODY_OPEN =
  '<div id="container">' .
@@@ -31,8 -88,37 +88,37 @@@ sub FFmpeg_print_page_foot($$
      print $fh "</div>\n";
  }
  
 -$float = \&Libav_float;
++$float = \&FFmpeg_float;
 -sub Libav_float($$$$)
++sub FFmpeg_float($$$$)
+ {
+     my $text = shift;
+     my $float = shift;
+     my $caption = shift;
+     my $shortcaption = shift;
+     my $label = '';
+     if (exists($float->{'id'}))
+     {
+         $label = &$anchor($float->{'id'});
+     }
+     my $class = '';
+     my $subject = '';
+     if ($caption =~ /NOTE/)
+     {
+         $class = "note";
+     }
+     elsif ($caption =~ /IMPORTANT/)
+     {
+         $class = "important";
+     }
+     return '<div class="float ' . $class . '">' . "$label\n" . $text . '</div>';
+ }
 -$print_page_head = \&Libav_print_page_head;
 -sub Libav_print_page_head($$)
 +$print_page_head = \&FFmpeg_print_page_head;
 +sub FFmpeg_print_page_head($$)
  {
      my $fh = shift;
      my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}";
Simple merge
@@@ -224,64 -223,48 +224,49 @@@ const AVCodecTag codec_movvideo_tags[] 
  };
  
  const AVCodecTag codec_movaudio_tags[] = {
-     { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
-     { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
-     { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
-     { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
-     { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, /* 16 bits */
-     { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, /*  */
-     { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
-     { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
-     { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
-     { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
-     { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
-     { CODEC_ID_PCM_S8,    MKTAG('s', 'o', 'w', 't') },
-     { CODEC_ID_PCM_U8,    MKTAG('r', 'a', 'w', ' ') }, /* 8 bits unsigned */
-     { CODEC_ID_PCM_U8,    MKTAG('N', 'O', 'N', 'E') }, /* uncompressed */
-     { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, /*  */
-     { CODEC_ID_PCM_ALAW,  MKTAG('a', 'l', 'a', 'w') }, /*  */
-     { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, /* IMA-4 ADPCM */
-     { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, /* Macintosh Audio Compression and Expansion 3:1 */
-     { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, /* Macintosh Audio Compression and Expansion 6:1 */
-     { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') }, /* MPEG layer 1 */
-     { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') }, /* MPEG layer 2 */
-     { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, /* MPEG layer 3 */ /* sample files at http://www.3ivx.com/showcase.html use this tag */
-     { CODEC_ID_MP3, 0x6D730055 }, /* MPEG layer 3 */
- /*  { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
-     { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */
-     { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
-     { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */
-     { CODEC_ID_DTS, MKTAG('d', 't', 's', 'c') }, /* mp4ra.org */
-     { CODEC_ID_DTS, MKTAG('D', 'T', 'S', ' ') }, /* non-standard */
-     { CODEC_ID_EAC3, MKTAG('e', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
-     { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
-     { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
-     { CODEC_ID_GSM,  MKTAG('a', 'g', 's', 'm') },
-     { CODEC_ID_NELLYMOSER, MKTAG('n', 'm', 'o', 's') }, /* Flash Media Server */
-     { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */
-     { CODEC_ID_QCELP, MKTAG('Q','c','l','p') },
-     { CODEC_ID_QCELP, MKTAG('Q','c','l','q') },
-     { CODEC_ID_QCELP, MKTAG('s','q','c','p') }, /* ISO Media fourcc */
-     { CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') }, /* QDMC */
-     { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */
-     { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
-     { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
-     { CODEC_ID_SPEEX, MKTAG('s','p','e','x') }, /* Flash Media Server */
-     { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
+     { CODEC_ID_AAC,             MKTAG('m', 'p', '4', 'a') },
+     { CODEC_ID_AC3,             MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
+     { CODEC_ID_AC3,             MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */
+     { CODEC_ID_ADPCM_IMA_QT,    MKTAG('i', 'm', 'a', '4') },
+     { CODEC_ID_ALAC,            MKTAG('a', 'l', 'a', 'c') },
+     { CODEC_ID_AMR_NB,          MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
+     { CODEC_ID_AMR_WB,          MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
+     { CODEC_ID_DTS,             MKTAG('d', 't', 's', 'c') }, /* mp4ra.org */
+     { CODEC_ID_DTS,             MKTAG('D', 'T', 'S', ' ') }, /* non-standard */
+     { CODEC_ID_DVAUDIO,         MKTAG('v', 'd', 'v', 'a') },
+     { CODEC_ID_DVAUDIO,         MKTAG('d', 'v', 'c', 'a') },
++    { CODEC_ID_EAC3,            MKTAG('e', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
+     { CODEC_ID_GSM,             MKTAG('a', 'g', 's', 'm') },
+     { CODEC_ID_MACE3,           MKTAG('M', 'A', 'C', '3') },
+     { CODEC_ID_MACE6,           MKTAG('M', 'A', 'C', '6') },
+     { CODEC_ID_MP1,             MKTAG('.', 'm', 'p', '1') },
+     { CODEC_ID_MP2,             MKTAG('.', 'm', 'p', '2') },
+     { CODEC_ID_MP3,             MKTAG('.', 'm', 'p', '3') },
+     { CODEC_ID_MP3,             0x6D730055                },
+     { CODEC_ID_NELLYMOSER,      MKTAG('n', 'm', 'o', 's') }, /* Flash Media Server */
+     { CODEC_ID_PCM_ALAW,        MKTAG('a', 'l', 'a', 'w') },
+     { CODEC_ID_PCM_F32BE,       MKTAG('f', 'l', '3', '2') },
+     { CODEC_ID_PCM_F32LE,       MKTAG('f', 'l', '3', '2') },
+     { CODEC_ID_PCM_F64BE,       MKTAG('f', 'l', '6', '4') },
+     { CODEC_ID_PCM_F64LE,       MKTAG('f', 'l', '6', '4') },
+     { CODEC_ID_PCM_MULAW,       MKTAG('u', 'l', 'a', 'w') },
+     { CODEC_ID_PCM_S16BE,       MKTAG('t', 'w', 'o', 's') },
+     { CODEC_ID_PCM_S16LE,       MKTAG('s', 'o', 'w', 't') },
+     { CODEC_ID_PCM_S16LE,       MKTAG('l', 'p', 'c', 'm') },
+     { CODEC_ID_PCM_S24BE,       MKTAG('i', 'n', '2', '4') },
+     { CODEC_ID_PCM_S24LE,       MKTAG('i', 'n', '2', '4') },
+     { CODEC_ID_PCM_S32BE,       MKTAG('i', 'n', '3', '2') },
+     { CODEC_ID_PCM_S32LE,       MKTAG('i', 'n', '3', '2') },
+     { CODEC_ID_PCM_S8,          MKTAG('s', 'o', 'w', 't') },
+     { CODEC_ID_PCM_U8,          MKTAG('r', 'a', 'w', ' ') },
+     { CODEC_ID_PCM_U8,          MKTAG('N', 'O', 'N', 'E') },
+     { CODEC_ID_QCELP,           MKTAG('Q', 'c', 'l', 'p') },
+     { CODEC_ID_QCELP,           MKTAG('Q', 'c', 'l', 'q') },
+     { CODEC_ID_QCELP,           MKTAG('s', 'q', 'c', 'p') }, /* ISO Media fourcc */
+     { CODEC_ID_QDM2,            MKTAG('Q', 'D', 'M', '2') },
+     { CODEC_ID_QDMC,            MKTAG('Q', 'D', 'M', 'C') },
+     { CODEC_ID_SPEEX,           MKTAG('s', 'p', 'e', 'x') }, /* Flash Media Server */
+     { CODEC_ID_WMAV2,           MKTAG('W', 'M', 'A', '2') },
      { CODEC_ID_NONE, 0 },
  };
  
@@@ -2346,17 -2321,8 +2392,17 @@@ static int mov_read_elst(MOVContext *c
      return 0;
  }
  
- static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom)
++static int mov_read_chan2(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 +{
 +    if (atom.size < 16)
 +        return 0;
 +    avio_skip(pb, 4);
 +    ff_mov_read_chan(c->fc, atom.size - 4, c->fc->streams[0]->codec);
 +    return 0;
 +}
 +
  static const MOVParseTableEntry mov_default_parse_table[] = {
 -{ MKTAG('a','v','s','s'), mov_read_extradata },
 +{ MKTAG('a','v','s','s'), mov_read_avss },
  { MKTAG('c','h','p','l'), mov_read_chpl },
  { MKTAG('c','o','6','4'), mov_read_stco },
  { MKTAG('c','t','t','s'), mov_read_ctts }, /* composition time to sample */
index 0000000,3c1ced6..a8e6b94
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,505 +1,505 @@@
 -    /* TODO: map MOV channel labels to Libav channels */
+ /*
+  * 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;
+ }
Simple merge
Simple merge
   */
  
  #define LIBAVUTIL_VERSION_MAJOR 51
- #define LIBAVUTIL_VERSION_MINOR 31
 -#define LIBAVUTIL_VERSION_MINOR 20
++#define LIBAVUTIL_VERSION_MINOR 32
  #define LIBAVUTIL_VERSION_MICRO  0
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
@@@ -1,4 -1,4 +1,4 @@@
- aeec610f33d8eec7031c5c6a9aab4cc0 *./tests/data/acodec/pcm_s16be.mov
- 1059029 ./tests/data/acodec/pcm_s16be.mov
 -dd832e23156643becce8e9d2c24cb31d *./tests/data/acodec/pcm_s16be.mov
 -1060073 ./tests/data/acodec/pcm_s16be.mov
++d07e475322765c20b1fcdb822ad5dc04 *./tests/data/acodec/pcm_s16be.mov
++1059065 ./tests/data/acodec/pcm_s16be.mov
  64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav
  stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
@@@ -1,4 -1,4 +1,4 @@@
- 9ea74aa6d09fcfe9a1e232efecfb07fe *./tests/data/acodec/pcm_s24be.mov
- 1588229 ./tests/data/acodec/pcm_s24be.mov
 -1b570c296bce03e36e1dfb369190ffb6 *./tests/data/acodec/pcm_s24be.mov
 -1589273 ./tests/data/acodec/pcm_s24be.mov
++f66d9543a4e04346818e802c4f2d7a30 *./tests/data/acodec/pcm_s24be.mov
++1588265 ./tests/data/acodec/pcm_s24be.mov
  64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav
  stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
@@@ -1,4 -1,4 +1,4 @@@
- 25535c11babbc971b6a958e92feaee37 *./tests/data/acodec/pcm_s32be.mov
- 2117429 ./tests/data/acodec/pcm_s32be.mov
 -249c2ca88e2d8cdaed345e3d446e5bc3 *./tests/data/acodec/pcm_s32be.mov
 -2118473 ./tests/data/acodec/pcm_s32be.mov
++09c919947211de14b3ad0e7603e5b44e *./tests/data/acodec/pcm_s32be.mov
++2117465 ./tests/data/acodec/pcm_s32be.mov
  64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav
  stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
@@@ -1,4 -1,4 +1,4 @@@
- d63813e9255a74324ea4559d6a8a1f7c *./tests/data/acodec/pcm_s8.mov
- 529829 ./tests/data/acodec/pcm_s8.mov
 -f467f8899b2bd11c736d0f4e61efb1c4 *./tests/data/acodec/pcm_s8.mov
 -530873 ./tests/data/acodec/pcm_s8.mov
++52d8c65c4987227979785d5ac2030175 *./tests/data/acodec/pcm_s8.mov
++529865 ./tests/data/acodec/pcm_s8.mov
  651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav
  stddev:  147.89 PSNR: 52.93 MAXDIFF:  255 bytes:  1058400/  1058400
@@@ -1,3 -1,3 +1,3 @@@
- 93ed3b20190daa51aeb19f62f939d04a *./tests/data/lavf/lavf.mov
- 357821 ./tests/data/lavf/lavf.mov
 -8dc82a08a0abb47c822d03a6e408383b *./tests/data/lavf/lavf.mov
 -357717 ./tests/data/lavf/lavf.mov
++3340b7ffe1b1d98a50622bd53f786d41 *./tests/data/lavf/lavf.mov
++357857 ./tests/data/lavf/lavf.mov
  ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26