Merge commit 'e3b225a4fe0ff1e64a220b757c6f0a5cf9258521'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 3 May 2013 11:16:34 +0000 (13:16 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 3 May 2013 11:16:34 +0000 (13:16 +0200)
* commit 'e3b225a4fe0ff1e64a220b757c6f0a5cf9258521':
  matroskaenc: add an option to put the index at the start of the file

Conflicts:
doc/muxers.texi
libavformat/matroskaenc.c
libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
doc/muxers.texi
libavformat/matroskaenc.c
libavformat/version.h

diff --combined Changelog
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version 10:
 -- av_strnstr
 -- support ID3v2 tags in ASF files
 +version <next>:
 +- curves filter
  - reference-counting for AVFrame and AVPacket data
 -- avconv now fails when input options are used for output file
 +- ffmpeg now fails when input options are used for output file
    or vice versa
 -- new avconv options -filter_script and -filter_complex_script, which allow a
 +- support for Monkey's Audio versions from 3.93
 +- perms and aperms filters
 +- audio filtering support in ffplay
 +- 10% faster aac encoding on x86 and MIPS
 +- sine audio filter source
 +- WebP demuxing and decoding support
 +- new ffmpeg options -filter_script and -filter_complex_script, which allow a
    filtergraph description to be read from a file
 +- OpenCL support
 +- audio phaser filter
 +- separatefields filter
 +- libquvi demuxer
  - uniform options syntax across all filters
 +- telecine filter
  - new interlace filter
 -- JPEG 2000 decoder
 -- new asetpts filter (same as setpts, but for audio)
 -- new trim and atrim filters
 -- avconv -t and -ss (output-only) options are now sample-accurate when
 +- smptehdbars source
 +- inverse telecine filters (fieldmatch and decimate)
 +- colorbalance filter
 +- colorchannelmixer filter
 +- The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default at the next libavformat major bump.
 +- decent native animated GIF encoding
 +- asetrate filter
 +- interleave filter
 +- timeline editing with filters
 +- vidstabdetect and vidstabtransform filters for video stabilization using
 +  the vid.stab library
 +- astats filter
 +- trim and atrim filters
 +- ffmpeg -t and -ss (output-only) options are now sample-accurate when
    transcoding audio
+ - Matroska muxer can now put the index at the beginning of the file.
  
  
 -version 9:
 -- av_basename and av_dirname
 -- adobe and limelight publisher authentication in RTMP
 +version 1.2:
 +
  - VDPAU hardware acceleration through normal hwaccel
  - SRTP support
 -
 -
 -version 9_beta3:
 -- ashowinfo audio filter
 +- Error diffusion dither in Swscale
 +- Chained Ogg support
 +- Theora Midstream reconfiguration support
 +- EVRC decoder
 +- audio fade filter
 +- filtering audio with unknown channel layout
 +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 +  and treble audio filter
 +- improved showspectrum filter, with multichannel support and sox-like colors
 +- histogram filter
 +- tee muxer
 +- il filter ported from libmpcodecs
 +- support ID3v2 tags in ASF files
 +- encrypted TTA stream decoding support
 +- RF64 support in WAV muxer
 +- noise filter ported from libmpcodecs
 +- Subtitles character encoding conversion
 +- blend filter
 +- stereo3d filter ported from libmpcodecs
 +
 +
 +version 1.1:
 +
 +- stream disposition information printing in ffprobe
 +- filter for loudness analysis following EBU R128
 +- Opus encoder using libopus
 +- ffprobe -select_streams option
 +- Pinnacle TARGA CineWave YUV16 decoder
 +- TAK demuxer, decoder and parser
 +- DTS-HD demuxer
 +- remove -same_quant, it hasn't worked for years
 +- FFM2 support
 +- X-Face image encoder and decoder
  - 24-bit FLAC encoding
 -- audio volume filter
 -- deprecated the avconv -vol option. the volume filter is to be used instead.
  - multi-channel ALAC encoding up to 7.1
 -- TAK demuxer, parser, and decoder
 -- adaptive frame-level multithreading for H.264
 -
 -
 -version 9_beta2:
  - metadata (INFO tag) support in WAV muxer
 +- subtitles raw text decoder
  - support for building DLLs using MSVC
 -- remove avserver daemon mode
 +- LVF demuxer
 +- ffescape tool
 +- metadata (info chunk) support in CAF muxer
 +- field filter ported from libmpcodecs
 +- AVR demuxer
 +- geq filter ported from libmpcodecs
 +- remove ffserver daemon mode
 +- AST muxer/demuxer
 +- new expansion syntax for drawtext
 +- BRender PIX image decoder
 +- ffprobe -show_entries option
 +- ffprobe -sections option
 +- ADPCM IMA Dialogic decoder
 +- BRSTM demuxer
 +- animated GIF decoder and demuxer
 +- PVF demuxer
 +- subtitles filter
 +- IRCAM muxer/demuxer
 +- Paris Audio File demuxer
 +- Virtual concatenation demuxer
 +- VobSub demuxer
 +- JSON captions for TED talks decoding support
 +- SOX Resampler support in libswresample
 +- aselect filter
 +- SGI RLE 8-bit decoder
 +- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 +- Silicon Graphics Movie demuxer
 +- apad filter
 +- Resolution & pixel format change support with multithreading for H.264
 +- documentation split into per-component manuals
 +- pp (postproc) filter ported from MPlayer
 +- NIST Sphere demuxer
 +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 +- Sony Wave64 muxer
 +- adobe and limelight publisher authentication in RTMP
 +- data: URI scheme
  - support building on the Plan 9 operating system
 -- ffv1: support version 1.3
 +- kerndeint filter ported from MPlayer
 +- histeq filter ported from VirtualDub
 +- Megalux Frame demuxer
 +- 012v decoder
 +- Improved AVC Intra decoding support
  
  
 -version 9_beta1:
 +version 1.0:
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 -- CDXL demuxer and decoder
 -- Apple ProRes encoder
 -- Sun Rasterfile Encoder
 -- remove libpostproc
 -- ID3v2 attached pictures reading and writing
 -- WMA Lossless decoder
 -- XBM encoder
 -- RealAudio Lossless decoder
 -- ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 -- add fps filter
 -- audio split filter
 -- audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
  - Indeo Audio decoder
  - channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
  - RTMPT protocol support
  - iLBC encoding/decoding via libilbc
  - Microsoft Screen 1 decoder
  - Microsoft Expression Encoder Screen decoder
  - RTMPS protocol support
  - RTMPTS protocol support
 -- JPEG 2000 encoding support through OpenJPEG
 -- G.723.1 demuxer and decoder
  - RTMPE protocol support
  - RTMPTE protocol support
 +- showwaves and showspectrum filter
 +- LucasArts SMUSH playback support
 +- SAMI, RealText and SubViewer demuxers and decoders
 +- Heart Of Darkness PAF playback support
 +- iec61883 device
 +- asettb filter
 +- new option: -progress
 +- 3GPP Timed Text encoder/decoder
 +- GeoTIFF decoder support
 +- ffmpeg -(no)stdin option
 +- Opus decoder using libopus
 +- caca output device using libcaca
 +- alphaextract and alphamerge filters
 +- concat filter
 +- flite filter
  - Canopus Lossless Codec decoder
 -- avconv -shortest option is now per-output file,
 +- bitmap subtitles in filters (experimental and temporary)
 +- MP2 encoding via TwoLAME
 +- bmp parser
 +- smptebars source
 +- asetpts filter
 +- hue filter
 +- ICO muxer
 +- SubRip encoder and decoder without embedded timing
 +- edge detection filter
 +- framestep filter
 +- ffmpeg -shortest option is now per-output file
    -pass and -passlogfile are now per-output stream
 +- volume measurement filter
  - Ut Video encoder
  - Microsoft Screen 2 decoder
 +- smartblur filter ported from MPlayer
 +- CPiA decoder
 +- decimate filter ported from MPlayer
  - RTP depacketization of JPEG
  - Smooth Streaming live segmenter muxer
 +- F4V muxer
 +- sendcmd and asendcmd filters
 +- WebVTT demuxer and decoder (simple tags supported)
  - RTP packetization of JPEG
 -- Opus decoder and encoder using libopus
 -- remove -same_quant, it hasn't worked for years
 +- faststart option in the MOV/MP4 muxer
  - support for building with MSVC
  
  
 -version 0.8:
 +version 0.11:
  
 -- GSM audio parser
 -- SMJPEG muxer
 +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 +         CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785,
 +         CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790,
 +         CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795,
 +         CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800,
 +         CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804,
 +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder
 +- setfield filter
 +- CDXL demuxer and decoder
 +- Apple ProRes encoder
 +- ffprobe -count_packets and -count_frames options
 +- Sun Rasterfile Encoder
 +- ID3v2 attached pictures reading and writing
 +- WMA Lossless decoder
 +- bluray protocol
 +- blackdetect filter
 +- libutvideo encoder wrapper (--enable-libutvideo)
 +- swapuv filter
 +- bbox filter
 +- XBM encoder and decoder
 +- RealAudio Lossless decoder
 +- ZeroCodec decoder
 +- tile video filter
 +- Metal Gear Solid: The Twin Snakes demuxer
 +- OpenEXR image decoder
 +- removelogo filter
 +- drop support for ffmpeg without libavfilter
 +- drawtext video filter: fontconfig support
 +- ffmpeg -benchmark_all option
 +- super2xsai filter ported from libmpcodecs
 +- add libavresample audio conversion library for compatibility
 +- MicroDVD decoder
 +- Avid Meridien (AVUI) encoder and decoder
 +- accept + prefix to -pix_fmt option to disable automatic conversions.
 +- complete audio filtering in libavfilter and ffmpeg
 +- add fps filter
 +- vorbis parser
 +- png parser
 +- audio mix filter
 +- ffv1: support (draft) version 1.3
  
  
 -version 0.8_beta2:
 +version 0.10:
  
 +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 +         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 +         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 +         CVE-2011-3950, CVE-2011-3951, CVE-2011-3952
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
 +- OpenMG Audio muxer
 +- Timecode extraction in DV and MOV
 +- thumbnail video filter
 +- XML output in ffprobe
 +- asplit audio filter
 +- tinterlace video filter
 +- astreamsync audio filter
 +- amerge audio filter
 +- ISMV (Smooth Streaming) muxer
 +- GSM audio parser
 +- SMJPEG muxer
 +- XWD encoder and decoder
  - Automatic thread count based on detection number of (available) CPU cores
 -- Deprecate libpostproc. If desired, the switch --enable-postproc will
 -  enable it but it may be removed in a later Libav release.
 +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
 +- ffprobe -show_error option
 +- Avid 1:1 10-bit RGB Packer codec
 +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder
 +- yuv4 libquicktime packed 4:2:0 encoder and decoder
 +- ffprobe -show_frames option
 +- silencedetect audio filter
 +- ffprobe -show_program_version, -show_library_versions, -show_versions options
  - rv34: frame-level multi-threading
  - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
 +- Improved PGS subtitle decoder
 +- dumpgraph option to lavfi device
 +- r210 and r10k encoders
 +- ffwavesynth decoder
 +- aviocat tool
 +- ffeval tool
  
  
 -version 0.8_beta1:
 +version 0.9:
  
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
 +- added avconv, which is almost the same for now, except
  for a few incompatible changes in the options, which will hopefully make them
  easier to use. The changes are:
      * The options placement is now strictly enforced! While in theory the
      * -vframes/-aframes/-dframes options are now aliases to the new -frames option.
      * -vtag/-atag/-stag options are now aliases to the new -tag option.
  - XMV demuxer
 +- LOAS demuxer
 +- ashowinfo filter added
  - Windows Media Image decoder
 +- amovie source added
  - LATM muxer/demuxer
 -- showinfo filter
 -- split filter
 +- Speex encoder via libspeex
 +- JSON output in ffprobe
 +- WTV muxer
 +- Optional C++ Support (needed for libstagefright)
 +- H.264 Decoding on Android via Stagefright
 +- Prores decoder
 +- BIN/XBIN/ADF/IDF text file decoder
 +- aconvert audio filter added
 +- audio support to lavfi input device added
  - libcdio-paranoia input device for audio CD grabbing
 -- select filter
  - Apple ProRes decoder
  - CELT in Ogg demuxing
 +- G.723.1 demuxer and decoder
 +- libmodplug support (--enable-libmodplug)
  - VC-1 interlaced decoding
 -- lut, lutrgb, and lutyuv filters
 -- boxblur filter
 +- libutvideo wrapper (--enable-libutvideo)
 +- aevalsrc audio source added
  - Ut Video decoder
  - Speex encoding via libspeex
  - 4:2:2 H.264 decoding support
  - 4:2:2 and 4:4:4 H.264 encoding with libx264
  - Pulseaudio input device
 +- Prores encoder
 +- Video Decoder Acceleration (VDA) HWAccel module.
  - replacement Indeo 3 decoder
 +- new ffmpeg option: -map_channel
 +- volume audio filter added
 +- earwax audio filter added
 +- libv4l2 support (--enable-libv4l2)
  - TLS/SSL and HTTPS protocol support
  - AVOptions API rewritten and documented
  - most of CODEC_FLAG2_*, some CODEC_FLAG_* and many codec-specific fields in
  - Discworld II BMV decoding support
  - VBLE Decoder
  - OS X Video Decoder Acceleration (VDA) support
 +- compact and csv output in ffprobe
 +- pan audio filter
 +- IFF Amiga Continuous Bitmap (ACBM) decoder
 +- ass filter
  - CRI ADX audio format muxer and demuxer
  - Playstation Portable PMP format demuxer
 +- Microsoft Windows ICO demuxer
 +- life source
  - PCM format support in OMA demuxer
  - CLJR encoder
 +- new option: -report
  - Dxtory capture format decoder
 -- v410 QuickTime uncompressed 4:4:4 10-bit encoder and decoder
 -- OpenMG Audio muxer
 +- cellauto source
  - Simple segmenting muxer
  - Indeo 4 decoder
  - SMJPEG demuxer
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 -
 -
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 +version 0.8:
  
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
  - Demuxer for On2's IVF format
  - Pictor/PC Paint decoder
  - HE-AAC v2 decoder
 +- HE-AAC v2 encoding with libaacplus
  - libfaad2 wrapper removed
  - DTS-ES extension (XCh) decoding support
  - native VP8 decoder
  - RTP depacketization of QDM2
  - ANSI/ASCII art playback system
  - Lego Mindstorms RSO de/muxer
 +- libavcore added (and subsequently removed)
  - SubRip subtitle file muxer and demuxer
  - Chinese AVS encoding via libxavs
  - ffprobe -show_packets option added
  - replace the ocv_smooth filter with a more generic ocv filter
  - Windows Televison (WTV) demuxer
  - FFmpeg metadata format muxer and demuxer
 -- SubRip (srt) subtitle decoder
 +- SubRip (srt) subtitle encoder and decoder
  - floating-point AC-3 encoder added
  - Lagarith decoder
  - ffmpeg -copytb option added
  - sndio support for playback and record
  - Linux framebuffer input device added
  - Chronomaster DFA decoder
 -- Mobotix MxPEG decoder
 +- DPX image encoder
 +- MicroDVD subtitle file muxer and demuxer
 +- Playstation Portable PMP format demuxer
 +- fieldorder video filter added
  - AAC encoding via libvo-aacenc
  - AMR-WB encoding via libvo-amrwbenc
  - xWMA demuxer
 -- fieldorder video filter added
 +- Mobotix MxPEG decoder
 +- VP8 frame-multithreading
 +- NEON optimizations for VP8
 +- Lots of deprecated API cruft removed
 +- fft and imdct optimizations for AVX (Sandy Bridge) processors
 +- showinfo filter added
 +- SMPTE 302M AES3 audio decoder
 +- Apple Core Audio Format muxer
 +- 9bit and 10bit per sample support in the H.264 decoder
 +- 9bit and 10bit FFV1 encoding / decoding
 +- split filter added
 +- select filter added
 +- sdl output device added
 +- libmpcodecs video filter support (3 times as many filters than before)
 +- mpeg2 aspect ratio dection fixed
 +- libxvid aspect pickiness fixed
 +- Frame multithreaded decoding
 +- E-AC-3 audio encoder
 +- ac3enc: add channel coupling support
 +- floating-point sample format support to the ac3, eac3, dca, aac, and vorbis decoders.
 +- H264/MPEG frame-level multi-threading
 +- All av_metadata_* functions renamed to av_dict_* and moved to libavutil
 +- 4:4:4 H.264 decoding support
 +- 10-bit H.264 optimizations for x86
 +- lut, lutrgb, and lutyuv filters added
 +- buffersink libavfilter sink added
 +- Bump libswscale for recently reported ABI break
 +- New J2K encoder (via OpenJPEG)
 +
 +
 +version 0.7:
 +
 +- all the changes for 0.8, but keeping API/ABI compatibility with the 0.6 release
  
  
  version 0.6:
@@@ -775,7 -573,6 +776,7 @@@ version 0.5
  - Gopher client support
  - MXF D-10 muxer
  - generic metadata API
 +- flash ScreenVideo2 encoder
  
  
  version 0.4.9-pre1:
@@@ -978,7 -775,7 +979,7 @@@ version 0.4.5
  - MPEG-4 vol header fixes (Jonathan Marsden <snmjbm at pacbell.net>)
  - ARM optimizations (Lionel Ulmer <lionel.ulmer at free.fr>).
  - Windows porting of file converter
 -- added MJPEG raw format (input/ouput)
 +- added MJPEG raw format (input/output)
  - added JPEG image format support (input/output)
  
  
diff --combined doc/muxers.texi
@@@ -1,10 -1,10 +1,10 @@@
  @chapter Muxers
  @c man begin MUXERS
  
 -Muxers are configured elements in Libav which allow writing
 +Muxers are configured elements in FFmpeg which allow writing
  multimedia streams to a particular type of file.
  
 -When you configure your Libav build, all the supported muxers
 +When you configure your FFmpeg build, all the supported muxers
  are enabled by default. You can list all available muxers using the
  configure option @code{--list-muxers}.
  
@@@ -13,7 -13,7 +13,7 @@@ You can disable all the muxers with th
  with the options @code{--enable-muxer=@var{MUXER}} /
  @code{--disable-muxer=@var{MUXER}}.
  
 -The option @code{-formats} of the av* tools will display the list of
 +The option @code{-formats} of the ff* tools will display the list of
  enabled muxers.
  
  A description of some of the currently available muxers follows.
@@@ -35,20 -35,20 +35,20 @@@ CRC=0x@var{CRC}, where @var{CRC} is a h
  For example to compute the CRC of the input, and store it in the file
  @file{out.crc}:
  @example
 -avconv -i INPUT -f crc out.crc
 +ffmpeg -i INPUT -f crc out.crc
  @end example
  
  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 @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
 -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.
  @anchor{framecrc}
  @section framecrc
  
 -Per-frame CRC (Cyclic Redundancy Check) testing format.
 +Per-packet CRC (Cyclic Redundancy Check) testing format.
  
 -This muxer computes and prints the Adler-32 CRC for each decoded audio
 -and video frame. By default audio frames are converted to signed
 +This muxer computes and prints the Adler-32 CRC for each audio
 +and video packet. By default audio frames are converted to signed
  16-bit raw audio and video frames to raw video before computing the
  CRC.
  
  The output of the muxer consists of a line for each audio and video
 -frame of the form: @var{stream_index}, @var{frame_dts},
 -@var{frame_size}, 0x@var{CRC}, where @var{CRC} is a hexadecimal
 -number 0-padded to 8 digits containing the CRC of the decoded frame.
 +packet of the form:
 +@example
 +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, 0x@var{CRC}
 +@end example
  
 -For example to compute the CRC of each decoded frame in the input, and
 -store it in the file @file{out.crc}:
 +@var{CRC} is a hexadecimal number 0-padded to 8 digits containing the
 +CRC of the packet.
 +
 +For example to compute the CRC of the audio and video frames in
 +@file{INPUT}, converted to raw audio and video packets, and store it
 +in the file @file{out.crc}:
  @example
 -avconv -i INPUT -f framecrc out.crc
 +ffmpeg -i INPUT -f framecrc out.crc
  @end example
  
 -You can print the CRC of each decoded frame to stdout with the command:
 +To print the information to stdout, use 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 @command{avconv} by
 -specifying the audio and video codec and format. For example, to
 +With @command{ffmpeg}, you can select the output format to which the
 +audio and video frames are encoded before computing the CRC for each
 +packet by specifying the audio and video codec. 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
 -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.
  
 +@anchor{framemd5}
 +@section framemd5
 +
 +Per-packet MD5 testing format.
 +
 +This muxer computes and prints the MD5 hash for each audio
 +and video packet. By default audio frames are converted to signed
 +16-bit raw audio and video frames to raw video before computing the
 +hash.
 +
 +The output of the muxer consists of a line for each audio and video
 +packet of the form:
 +@example
 +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, @var{MD5}
 +@end example
 +
 +@var{MD5} is a hexadecimal number representing the computed MD5 hash
 +for the packet.
 +
 +For example to compute the MD5 of the audio and video frames in
 +@file{INPUT}, converted to raw audio and video packets, and store it
 +in the file @file{out.md5}:
 +@example
 +ffmpeg -i INPUT -f framemd5 out.md5
 +@end example
 +
 +To print the information to stdout, use the command:
 +@example
 +ffmpeg -i INPUT -f framemd5 -
 +@end example
 +
 +See also the @ref{md5} muxer.
 +
  @anchor{hls}
  @section hls
  
@@@ -141,7 -102,7 +141,7 @@@ receive the same basename as the playli
  a .ts extension.
  
  @example
 -avconv -i in.nut out.m3u8
 +ffmpeg -i in.nut out.m3u8
  @end example
  
  @table @option
@@@ -155,39 -116,6 +155,39 @@@ Set the number after which index wraps
  Start the sequence from @var{number}.
  @end table
  
 +@anchor{ico}
 +@section ico
 +
 +ICO file muxer.
 +
 +Microsoft's icon file format (ICO) has some strict limitations that should be noted:
 +
 +@itemize
 +@item
 +Size cannot exceed 256 pixels in any dimension
 +
 +@item
 +Only BMP and PNG images can be stored
 +
 +@item
 +If a BMP image is used, it must be one of the following pixel formats:
 +@example
 +BMP Bit Depth      FFmpeg Pixel Format
 +1bit               pal8
 +4bit               pal8
 +8bit               pal8
 +16bit              rgb555le
 +24bit              bgr24
 +32bit              bgra
 +@end example
 +
 +@item
 +If a BMP image is used, it must use the BITMAPINFOHEADER DIB header
 +
 +@item
 +If a PNG image is used, it must use the rgba pixel format
 +@end itemize
 +
  @anchor{image2}
  @section image2
  
@@@ -218,32 -146,31 +218,32 @@@ 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 @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
 -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 @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
 -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
 -avconv -i in.avi -f image2 -frames:v 1 img.jpeg
 +ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
  @end example
  
  @table @option
 -@item -start_number @var{number}
 -Start the sequence from @var{number}.
 +@item start_number @var{number}
 +Start the sequence from @var{number}. Default value is 1. Must be a
 +positive number.
  
  @item -update @var{number}
  If @var{number} is nonzero, the filename will always be interpreted as just a
@@@ -252,46 -179,12 +252,46 @@@ images
  
  @end table
  
 +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.
 +
 +@anchor{md5}
 +@section md5
 +
 +MD5 testing format.
 +
 +This muxer computes and prints the MD5 hash of all the input audio
 +and video frames. By default audio frames are converted to signed
 +16-bit raw audio and video frames to raw video before computing the
 +hash.
 +
 +The output of the muxer consists of a single line of the form:
 +MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing
 +the computed MD5 hash.
 +
 +For example to compute the MD5 hash of the input converted to raw
 +audio and video, and store it in the file @file{out.md5}:
 +@example
 +ffmpeg -i INPUT -f md5 out.md5
 +@end example
 +
 +You can print the MD5 to stdout with the command:
 +@example
 +ffmpeg -i INPUT -f md5 -
 +@end example
 +
 +See also the @ref{framemd5} muxer.
 +
  @section MOV/MP4/ISMV
  
  The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4
  file has all the metadata about all packets stored in one location
  (written at the end of the file, it can be moved to the start for
 -better playback using the @command{qt-faststart} tool). A fragmented
 +better playback by adding @var{faststart} to the @var{movflags}, or
 +using the @command{qt-faststart} tool). A fragmented
  file consists of a number of fragments, where packets and metadata
  about these packets are stored together. Writing a fragmented
  file has the advantage that the file is decodable even if the
@@@ -305,9 -198,6 +305,9 @@@ Fragmentation is enabled by setting on
  how to cut the file into fragments:
  
  @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.
  @item -movflags frag_keyframe
  Start a new fragment at each video keyframe.
  @item -frag_duration @var{duration}
@@@ -318,7 -208,7 +318,7 @@@ Create fragments that contain up to @va
  Allow the caller to manually choose when to cut fragments, by
  calling @code{av_write_frame(ctx, NULL)} to write a fragment with
  the packets written so far. (This is only useful with other
 -applications integrating libavformat, not from @command{avconv}.)
 +applications integrating libavformat, not from @command{ffmpeg}.)
  @item -min_frag_duration @var{duration}
  Don't create fragments that are shorter than @var{duration} microseconds long.
  @end table
@@@ -349,18 -239,12 +349,18 @@@ more efficient), but with this option s
  pair for each track, making it easier to separate tracks.
  
  This option is implicitly set when writing ismv (Smooth Streaming) files.
 +@item -movflags faststart
 +Run a second pass moving the moov atom on top of the file. This
 +operation can take a while, and will not work in various situations such
 +as fragmented output, thus it is not enabled by default.
 +@item -movflags rtphint
 +Add RTP hinting tracks to the output file.
  @end table
  
  Smooth Streaming content can be pushed in real time to a publishing
  point on IIS with this muxer. Example:
  @example
 -avconv -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
 +ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
  @end example
  
  @section mpegts
@@@ -389,11 -273,11 +389,11 @@@ Set the first PID for data packets (def
  
  The recognized metadata settings in mpegts muxer are @code{service_provider}
  and @code{service_name}. If they are not set the default for
 -@code{service_provider} is "Libav" and the default for
 +@code{service_provider} is "FFmpeg" and the default for
  @code{service_name} is "Service01".
  
  @example
 -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 \
@@@ -411,19 -295,19 +411,19 @@@ 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 @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 @command{avconv}
 +file, but specifying the output file is required by the @command{ffmpeg}
  syntax.
  
  Alternatively you can write the command as:
  @example
 -avconv -benchmark -i INPUT -f null -
 +ffmpeg -benchmark -i INPUT -f null -
  @end example
  
  @section matroska
@@@ -448,7 -332,7 +448,7 @@@ Specifies the language of the track in 
  
  @table @option
  
 -@item STEREO_MODE=@var{mode}
 +@item stereo_mode=@var{mode}
  Stereo 3D video layout of two views in a single video track
  @table @option
  @item mono
@@@ -486,10 -370,31 +486,31 @@@ Both eyes laced in one Block, Right-ey
  
  For example a 3D WebM clip can be created using the following command line:
  @example
 -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
  
 -@section segment
+ This muxer supports the following options:
+ @table @option
+ @item reserve_index_space
+ By default, this muxer writes the index for seeking (called cues in Matroska
+ terms) at the end of the file, because it cannot know in advance how much space
+ to leave for the index at the beginning of the file. However for some use cases
+ -- e.g.  streaming where seeking is possible but slow -- it is useful to put the
+ index at the beginning of the file.
+ If this option is set to a non-zero value, the muxer will reserve a given amount
+ of space in the file header and then try to write the cues there when the muxing
+ finishes. If the available space does not suffice, muxing will fail. A safe size
+ for most use cases should be about 50kB per hour of video.
+ Note that cues are only written if the output is seekable and this option will
+ have no effect if it is not.
+ @end table
 +@section segment, stream_segment, ssegment
  
  Basic stream segmenter.
  
@@@ -497,215 -402,29 +518,215 @@@ The segmenter muxer outputs streams to 
  fixed duration. Output filename pattern can be set in a fashion similar to
  @ref{image2}.
  
 -Every segment starts with a video keyframe, if a video stream is present.
 +@code{stream_segment} is a variant of the muxer used to write to
 +streaming output formats, i.e. which do not require global headers,
 +and is recommended for outputting e.g. to MPEG transport stream segments.
 +@code{ssegment} is a shorter alias for @code{stream_segment}.
 +
 +Every segment starts with a keyframe of the selected reference stream,
 +which is set through the @option{reference_stream} option.
 +
 +Note that if you want accurate splitting for a video file, you need to
 +make the input key frames correspond to the exact splitting times
 +expected by the segmenter, or the segment muxer will start the new
 +segment with the key frame found next after the specified start
 +time.
 +
  The segment muxer works best with a single constant frame rate video.
  
 -Optionally it can generate a flat list of the created segments, one segment
 -per line.
 +Optionally it can generate a list of the created segments, by setting
 +the option @var{segment_list}. The list type is specified by the
 +@var{segment_list_type} option.
 +
 +The segment muxer supports the following options:
  
  @table @option
 +@item reference_stream @var{specifier}
 +Set the reference stream, as specified by the string @var{specifier}.
 +If @var{specifier} is set to @code{auto}, the reference is choosen
 +automatically. Otherwise it must be a stream specifier (see the ``Stream
 +specifiers'' chapter in the ffmpeg manual) which specifies the
 +reference stream. The default value is ``auto''.
 +
  @item segment_format @var{format}
  Override the inner container format, by default it is guessed by the filename
  extension.
 -@item segment_time @var{t}
 -Set segment duration to @var{t} seconds.
 +
  @item segment_list @var{name}
 -Generate also a listfile named @var{name}.
 +Generate also a listfile named @var{name}. If not specified no
 +listfile is generated.
 +
 +@item segment_list_flags @var{flags}
 +Set flags affecting the segment list generation.
 +
 +It currently supports the following flags:
 +@table @var
 +@item cache
 +Allow caching (only affects M3U8 list files).
 +
 +@item live
 +Allow live-friendly file generation.
 +@end table
 +
 +Default value is @code{cache}.
 +
  @item segment_list_size @var{size}
 -Overwrite the listfile once it reaches @var{size} entries.
 +Update the list file so that it contains at most the last @var{size}
 +segments. If 0 the list file will contain all the segments. Default
 +value is 0.
 +
 +@item segment_list type @var{type}
 +Specify the format for the segment list file.
 +
 +The following values are recognized:
 +@table @option
 +@item flat
 +Generate a flat list for the created segments, one segment per line.
 +
 +@item csv, ext
 +Generate a list for the created segments, one segment per line,
 +each line matching the format (comma-separated values):
 +@example
 +@var{segment_filename},@var{segment_start_time},@var{segment_end_time}
 +@end example
 +
 +@var{segment_filename} is the name of the output file generated by the
 +muxer according to the provided pattern. CSV escaping (according to
 +RFC4180) is applied if required.
 +
 +@var{segment_start_time} and @var{segment_end_time} specify
 +the segment start and end time expressed in seconds.
 +
 +A list file with the suffix @code{".csv"} or @code{".ext"} will
 +auto-select this format.
 +
 +@code{ext} is deprecated in favor or @code{csv}.
 +
 +@item ffconcat
 +Generate an ffconcat file for the created segments. The resulting file
 +can be read using the FFmpeg @ref{concat} demuxer.
 +
 +A list file with the suffix @code{".ffcat"} or @code{".ffconcat"} will
 +auto-select this format.
 +
 +@item m3u8
 +Generate an extended M3U8 file, version 3, compliant with
 +@url{http://tools.ietf.org/id/draft-pantos-http-live-streaming}.
 +
 +A list file with the suffix @code{".m3u8"} will auto-select this format.
 +@end table
 +
 +If not specified the type is guessed from the list file name suffix.
 +
 +@item segment_time @var{time}
 +Set segment duration to @var{time}, the value must be a duration
 +specification. Default value is "2". See also the
 +@option{segment_times} option.
 +
 +Note that splitting may not be accurate, unless you force the
 +reference stream key-frames at the given time. See the introductory
 +notice and the examples below.
 +
 +@item segment_time_delta @var{delta}
 +Specify the accuracy time when selecting the start time for a
 +segment, expressed as a duration specification. Default value is "0".
 +
 +When delta is specified a key-frame will start a new segment if its
 +PTS satisfies the relation:
 +@example
 +PTS >= start_time - time_delta
 +@end example
 +
 +This option is useful when splitting video content, which is always
 +split at GOP boundaries, in case a key frame is found just before the
 +specified split time.
 +
 +In particular may be used in combination with the @file{ffmpeg} option
 +@var{force_key_frames}. The key frame times specified by
 +@var{force_key_frames} may not be set accurately because of rounding
 +issues, with the consequence that a key frame time may result set just
 +before the specified time. For constant frame rate videos a value of
 +1/2*@var{frame_rate} should address the worst case mismatch between
 +the specified time and the time set by @var{force_key_frames}.
 +
 +@item segment_times @var{times}
 +Specify a list of split points. @var{times} contains a list of comma
 +separated duration specifications, in increasing order. See also
 +the @option{segment_time} option.
 +
 +@item segment_frames @var{frames}
 +Specify a list of split video frame numbers. @var{frames} contains a
 +list of comma separated integer numbers, in increasing order.
 +
 +This option specifies to start a new segment whenever a reference
 +stream key frame is found and the sequential number (starting from 0)
 +of the frame is greater or equal to the next value in the list.
 +
  @item segment_wrap @var{limit}
  Wrap around segment index once it reaches @var{limit}.
 +
 +@item segment_start_number @var{number}
 +Set the sequence number of the first segment. Defaults to @code{0}.
 +
 +@item reset_timestamps @var{1|0}
 +Reset timestamps at the begin of each segment, so that each segment
 +will start with near-zero timestamps. It is meant to ease the playback
 +of the generated segments. May not work with some combinations of
 +muxers/codecs. It is set to @code{0} by default.
  @end table
  
 +@subsection Examples
 +
 +@itemize
 +@item
 +To remux the content of file @file{in.mkv} to a list of segments
 +@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of
 +generated segments to @file{out.list}:
 +@example
 +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut
 +@end example
 +
 +@item
 +As the example above, but segment the input file according to the split
 +points specified by the @var{segment_times} option:
 +@example
 +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
 +@end example
 +
 +@item
 +As the example above, but use the @code{ffmpeg} @var{force_key_frames}
 +option to force key frames in the input at the specified location, together
 +with the segment option @var{segment_time_delta} to account for
 +possible roundings operated when setting key frame times.
 +@example
 +ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \
 +-f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut
 +@end example
 +In order to force key frames on the input file, transcoding is
 +required.
 +
 +@item
 +Segment the input file by splitting the input file according to the
 +frame numbers sequence specified with the @var{segment_frames} option:
 +@example
 +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut
 +@end example
 +
 +@item
 +To convert the @file{in.mkv} to TS segments using the @code{libx264}
 +and @code{libfaac} encoders:
 +@example
 +ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts
 +@end example
 +
 +@item
 +Segment the input file, and create an M3U8 live playlist (can be used
 +as live HLS source):
  @example
 -avconv -i in.mkv -c copy -map 0 -f segment -list out.list out%03d.nut
 +ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
 +-segment_list_flags +live -segment_time 10 out%03d.mkv
  @end example
 +@end itemize
  
  @section mp3
  
@@@ -733,14 -452,13 +754,14 @@@ Examples
  
  Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
  @example
 -avconv -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3
 +ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3
  @end example
  
 -Attach a picture to an mp3:
 +To attach a picture to an mp3 file select both the audio and the picture stream
 +with @code{map}:
  @example
 -avconv -i input.mp3 -i cover.png -c copy -metadata:s:v title="Album cover"
 --metadata:s:v comment="Cover (Front)" out.mp3
 +ffmpeg -i input.mp3 -i cover.png -c copy -map 0 -map 1
 +-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3
  @end example
  
  @section ogg
@@@ -758,39 -476,4 +779,39 @@@ situations, giving a small seek granula
  overhead.
  @end table
  
 +@section tee
 +
 +The tee muxer can be used to write the same data to several files or any
 +other kind of muxer. It can be used, for example, to both stream a video to
 +the network and save it to disk at the same time.
 +
 +It is different from specifying several outputs to the @command{ffmpeg}
 +command-line tool because the audio and video data will be encoded only once
 +with the tee muxer; encoding can be a very expensive process. It is not
 +useful when using the libavformat API directly because it is then possible
 +to feed the same packets to several muxers directly.
 +
 +The slave outputs are specified in the file name given to the muxer,
 +separated by '|'. If any of the slave name contains the '|' separator,
 +leading or trailing spaces or any special character, it must be
 +escaped (see the ``Quoting and escaping'' section in the ffmpeg-utils
 +manual).
 +
 +Options can be specified for each slave by prepending them as a list of
 +@var{key}=@var{value} pairs separated by ':', between square brackets. If
 +the options values contain a special character or the ':' separator, they
 +must be escaped; note that this is a second level escaping.
 +
 +Example: encode something and both archive it in a WebM file and stream it
 +as MPEG-TS over UDP (the streams need to be explicitly mapped):
 +
 +@example
 +ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
 +  "archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
 +@end example
 +
 +Note: some codecs may need different options depending on the output format;
 +the auto-detection of this can not work with the tee muxer. The main example
 +is the @option{global_header} flag.
 +
  @c man end MUXERS
@@@ -2,20 -2,20 +2,20 @@@
   * Matroska muxer
   * Copyright (c) 2007 David Conrad
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "libavutil/intreadwrite.h"
  #include "libavutil/lfg.h"
  #include "libavutil/mathematics.h"
+ #include "libavutil/opt.h"
  #include "libavutil/random_seed.h"
  #include "libavutil/samplefmt.h"
 +#include "libavutil/sha.h"
  
  #include "libavcodec/xiph.h"
  #include "libavcodec/mpeg4audio.h"
@@@ -74,13 -74,13 +75,14 @@@ typedef struct 
  
  typedef struct {
      int             write_dts;
 +    int             has_cue;
  } mkv_track;
  
  #define MODE_MATROSKAv2 0x01
  #define MODE_WEBM       0x02
  
  typedef struct MatroskaMuxContext {
+     const AVClass  *class;
      int             mode;
      AVIOContext   *dyn_bc;
      ebml_master     segment;
@@@ -97,6 -97,9 +99,9 @@@
      AVPacket        cur_audio_pkt;
  
      int have_attachments;
+     int reserve_cues_space;
+     int64_t cues_pos;
  } MatroskaMuxContext;
  
  
@@@ -121,7 -124,7 +126,7 @@@ static void put_ebml_id(AVIOContext *pb
  {
      int i = ebml_id_size(id);
      while (i--)
 -        avio_w8(pb, id >> (i*8));
 +        avio_w8(pb, (uint8_t)(id >> (i*8)));
  }
  
  /**
   */
  static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
  {
 -    assert(bytes <= 8);
 +    av_assert0(bytes <= 8);
      avio_w8(pb, 0x1ff >> bytes);
      while (--bytes)
          avio_w8(pb, 0xff);
@@@ -158,18 -161,18 +163,18 @@@ static void put_ebml_num(AVIOContext *p
      int i, needed_bytes = ebml_num_size(num);
  
      // sizes larger than this are currently undefined in EBML
 -    assert(num < (1ULL<<56)-1);
 +    av_assert0(num < (1ULL<<56)-1);
  
      if (bytes == 0)
          // don't care how many bytes are used, so use the min
          bytes = needed_bytes;
      // the bytes needed to write the given size would exceed the bytes
      // that we need to use, so write unknown size. This shouldn't happen.
 -    assert(bytes >= needed_bytes);
 +    av_assert0(bytes >= needed_bytes);
  
      num |= 1ULL << bytes*7;
      for (i = bytes - 1; i >= 0; i--)
 -        avio_w8(pb, num >> i*8);
 +        avio_w8(pb, (uint8_t)(num >> i*8));
  }
  
  static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
      put_ebml_id(pb, elementid);
      put_ebml_num(pb, bytes, 0);
      for (i = bytes - 1; i >= 0; i--)
 -        avio_w8(pb, val >> i*8);
 +        avio_w8(pb, (uint8_t)(val >> i*8));
  }
  
  static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
@@@ -214,7 -217,7 +219,7 @@@ static void put_ebml_void(AVIOContext *
  {
      int64_t currentpos = avio_tell(pb);
  
 -    assert(size >= 2);
 +    av_assert0(size >= 2);
  
      put_ebml_id(pb, EBML_ID_VOID);
      // we need to subtract the length needed to store the size from the
@@@ -386,7 -389,7 +391,7 @@@ static int mkv_add_cuepoint(mkv_cues *c
      return 0;
  }
  
 -static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, int num_tracks)
 +static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, mkv_track *tracks, int num_tracks)
  {
      ebml_master cues_element;
      int64_t currentpos;
  
          // put all the entries from different tracks that have the exact same
          // timestamp into the same CuePoint
 +        for (j = 0; j < num_tracks; j++)
 +            tracks[j].has_cue = 0;
          for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
 +            int tracknum = entry[j].tracknum - 1;
 +            av_assert0(tracknum>=0 && tracknum<num_tracks);
 +            if (tracks[tracknum].has_cue)
 +                continue;
 +            tracks[tracknum].has_cue = 1;
              track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
              put_ebml_uint(pb, MATROSKA_ID_CUETRACK          , entry[j].tracknum   );
              put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
@@@ -495,7 -491,7 +500,7 @@@ static int mkv_write_codecprivate(AVFor
                  avio_write(dyn_cp, codec->extradata + 12,
                                     codec->extradata_size - 12);
          }
 -        else if (codec->extradata_size)
 +        else if (codec->extradata_size && codec->codec_id != AV_CODEC_ID_TTA)
              avio_write(dyn_cp, codec->extradata, codec->extradata_size);
      } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
          if (qt_id) {
              if (!codec->codec_tag)
                  codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id);
              if (!codec->codec_tag) {
 -                av_log(s, AV_LOG_ERROR, "No bmp codec ID found.\n");
 -                ret = -1;
 +                av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
 +                       avcodec_get_name(codec->codec_id));
 +                ret = AVERROR(EINVAL);
              }
  
              ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0);
          unsigned int tag;
          tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id);
          if (!tag) {
 -            av_log(s, AV_LOG_ERROR, "No wav codec ID found.\n");
 -            ret = -1;
 +            av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
 +                   avcodec_get_name(codec->codec_id));
 +            ret = AVERROR(EINVAL);
          }
          if (!codec->codec_tag)
              codec->codec_tag = tag;
@@@ -541,16 -535,12 +546,16 @@@ static int mkv_write_tracks(AVFormatCon
      MatroskaMuxContext *mkv = s->priv_data;
      AVIOContext *pb = s->pb;
      ebml_master tracks;
 -    int i, j, ret;
 +    int i, j, ret, default_stream_exists = 0;
  
      ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
      if (ret < 0) return ret;
  
      tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
 +    for (i = 0; i < s->nb_streams; i++) {
 +        AVStream *st = s->streams[i];
 +        default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
 +    }
      for (i = 0; i < s->nb_streams; i++) {
          AVStream *st = s->streams[i];
          AVCodecContext *codec = st->codec;
  
          if (!bit_depth)
              bit_depth = av_get_bytes_per_sample(codec->sample_fmt) << 3;
 +        if (!bit_depth)
 +            bit_depth = codec->bits_per_coded_sample;
  
          if (codec->codec_id == AV_CODEC_ID_AAC)
              get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate);
          tag = av_dict_get(st->metadata, "language", NULL, 0);
          put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und");
  
 -        if (st->disposition)
 +        if (default_stream_exists) {
              put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
 +        }
 +        if (st->disposition & AV_DISPOSITION_FORCED)
 +            put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
  
          // look for a codec ID string specific to mkv to use,
          // if none are found, use AVI codes
          switch (codec->codec_type) {
              case AVMEDIA_TYPE_VIDEO:
                  put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
 -                put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
 +                if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base))
 +                    put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate));
 +                else
 +                    put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
  
                  if (!native_id &&
                        ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id) &&
                  // XXX: interlace flag?
                  put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
                  put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
 -                if ((tag = av_dict_get(s->metadata, "stereo_mode", NULL, 0))) {
 -                    uint8_t stereo_fmt = atoi(tag->value);
 -                    int valid_fmt = 0;
 -
 -                    switch (mkv->mode) {
 -                    case MODE_WEBM:
 -                        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
 -                            || stereo_fmt == MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT)
 -                            valid_fmt = 1;
 -                        break;
 -                    case MODE_MATROSKAv2:
 -                        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL)
 -                            valid_fmt = 1;
 -                        break;
 -                    }
  
 -                    if (valid_fmt)
 -                        put_ebml_uint (pb, MATROSKA_ID_VIDEOSTEREOMODE, stereo_fmt);
 +                if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
 +                    (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
 +                    // save stereo mode flag
 +                    uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
 +
 +                    for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
 +                        if (!strcmp(tag->value, ff_matroska_video_stereo_mode[j])){
 +                            st_mode = j;
 +                            break;
 +                        }
 +
 +                    if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
 +                        || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
 +                        av_log(s, AV_LOG_ERROR,
 +                               "The specified stereo mode is not valid.\n");
 +                        return AVERROR(EINVAL);
 +                    } else
 +                        put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
                  }
 +
                  if (st->sample_aspect_ratio.num) {
 -                    int d_width = codec->width*av_q2d(st->sample_aspect_ratio);
 +                    int64_t d_width = av_rescale(codec->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
 +                    if (d_width > INT_MAX) {
 +                        av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
 +                        return AVERROR(EINVAL);
 +                    }
                      put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
                      put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
 -                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, 3);
 +                }
 +
 +                if (codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
 +                    uint32_t color_space = av_le2ne32(codec->codec_tag);
 +                    put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
                  }
                  end_ebml_master(pb, subinfo);
                  break;
@@@ -810,7 -782,7 +815,7 @@@ static int mkv_write_tag(AVFormatContex
      end_ebml_master(s->pb, targets);
  
      while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
 -        if (av_strcasecmp(t->key, "title"))
 +        if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
              mkv_write_simpletag(s->pb, t);
  
      end_ebml_master(s->pb, tag);
@@@ -877,7 -849,6 +882,7 @@@ static int mkv_write_attachments(AVForm
          ebml_master attached_file;
          AVDictionaryEntry *t;
          const char *mimetype = NULL;
 +        uint64_t fileuid;
  
          if (st->codec->codec_type != AVMEDIA_TYPE_ATTACHMENT)
              continue;
              return AVERROR(EINVAL);
          }
  
 +        if (st->codec->flags & CODEC_FLAG_BITEXACT) {
 +            struct AVSHA *sha = av_sha_alloc();
 +            uint8_t digest[20];
 +            if (!sha)
 +                return AVERROR(ENOMEM);
 +            av_sha_init(sha, 160);
 +            av_sha_update(sha, st->codec->extradata, st->codec->extradata_size);
 +            av_sha_final(sha, digest);
 +            av_free(sha);
 +            fileuid = AV_RL64(digest);
 +        } else {
 +            fileuid = av_lfg_get(&c);
 +        }
 +        av_log(s, AV_LOG_VERBOSE, "Using %.16"PRIx64" for attachment %d\n",
 +               fileuid, i);
 +
          put_ebml_string(pb, MATROSKA_ID_FILEMIMETYPE, mimetype);
          put_ebml_binary(pb, MATROSKA_ID_FILEDATA, st->codec->extradata, st->codec->extradata_size);
 -        put_ebml_uint(pb, MATROSKA_ID_FILEUID, av_lfg_get(&c));
 +        put_ebml_uint(pb, MATROSKA_ID_FILEUID, fileuid);
          end_ebml_master(pb, attached_file);
      }
      end_ebml_master(pb, attachments);
@@@ -944,22 -899,6 +949,22 @@@ static int mkv_write_header(AVFormatCon
      if (!strcmp(s->oformat->name, "webm")) mkv->mode = MODE_WEBM;
      else                                   mkv->mode = MODE_MATROSKAv2;
  
 +    if (s->avoid_negative_ts < 0)
 +        s->avoid_negative_ts = 1;
 +
 +    for (i = 0; i < s->nb_streams; i++)
 +        if (s->streams[i]->codec->codec_id == AV_CODEC_ID_ATRAC3 ||
 +            s->streams[i]->codec->codec_id == AV_CODEC_ID_COOK ||
 +            s->streams[i]->codec->codec_id == AV_CODEC_ID_RA_288 ||
 +            s->streams[i]->codec->codec_id == AV_CODEC_ID_SIPR ||
 +            s->streams[i]->codec->codec_id == AV_CODEC_ID_RV10 ||
 +            s->streams[i]->codec->codec_id == AV_CODEC_ID_RV20) {
 +            av_log(s, AV_LOG_ERROR,
 +                   "The Matroska muxer does not yet support muxing %s\n",
 +                   avcodec_get_name(s->streams[i]->codec->codec_id));
 +            return AVERROR_PATCHWELCOME;
 +        }
 +
      mkv->tracks = av_mallocz(s->nb_streams * sizeof(*mkv->tracks));
      if (!mkv->tracks)
          return AVERROR(ENOMEM);
          put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
      }
  
 +    if (tag = av_dict_get(s->metadata, "creation_time", NULL, 0)) {
 +        // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
 +        int64_t date_utc = (ff_iso8601_to_unix_time(tag->value) - 978307200) * 1000000000;
 +        uint8_t date_utc_buf[8];
 +        AV_WB64(date_utc_buf, date_utc);
 +        put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
 +    }
 +
      // reserve space for the duration
      mkv->duration = 0;
      mkv->duration_offset = avio_tell(pb);
      if (mkv->cues == NULL)
          return AVERROR(ENOMEM);
  
+     if (pb->seekable && mkv->reserve_cues_space) {
+         mkv->cues_pos = avio_tell(pb);
+         put_ebml_void(pb, mkv->reserve_cues_space);
+     }
      av_init_packet(&mkv->cur_audio_pkt);
      mkv->cur_audio_pkt.size = 0;
 +    mkv->cluster_pos = -1;
  
      avio_flush(pb);
      return 0;
@@@ -1069,12 -1004,11 +1079,12 @@@ static int ass_get_duration(const uint8
      if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
                 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8)
          return 0;
 -    start = 3600000*sh + 60000*sm + 1000*ss + 10*sc;
 -    end   = 3600000*eh + 60000*em + 1000*es + 10*ec;
 +    start = 3600000LL*sh + 60000LL*sm + 1000LL*ss + 10LL*sc;
 +    end   = 3600000LL*eh + 60000LL*em + 1000LL*es + 10LL*ec;
      return end - start;
  }
  
 +#if FF_API_ASS_SSA
  static int mkv_write_ass_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
  {
      MatroskaMuxContext *mkv = s->priv_data;
  
      return max_duration;
  }
 +#endif
  
  static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
                              unsigned int blockid, AVPacket *pkt, int flags)
@@@ -1222,16 -1155,12 +1232,16 @@@ static int mkv_write_packet_internal(AV
      }
  
      if (!s->pb->seekable) {
 -        if (!mkv->dyn_bc)
 -            avio_open_dyn_buf(&mkv->dyn_bc);
 +        if (!mkv->dyn_bc) {
 +            if ((ret = avio_open_dyn_buf(&mkv->dyn_bc)) < 0) {
 +                av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n");
 +                return ret;
 +            }
 +        }
          pb = mkv->dyn_bc;
      }
  
 -    if (!mkv->cluster_pos) {
 +    if (mkv->cluster_pos == -1) {
          mkv->cluster_pos = avio_tell(s->pb);
          mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
          put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
  
      if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
          mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
 +#if FF_API_ASS_SSA
      } else if (codec->codec_id == AV_CODEC_ID_SSA) {
          duration = mkv_write_ass_blocks(s, pb, pkt);
 +#endif
      } else if (codec->codec_id == AV_CODEC_ID_SRT) {
          duration = mkv_write_srt_blocks(s, pb, pkt);
      } else {
          ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size));
 -        duration = pkt->convergence_duration;
 +        /* For backward compatibility, prefer convergence_duration. */
 +        if (pkt->convergence_duration > 0) {
 +            duration = pkt->convergence_duration;
 +        }
          mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0);
          put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
          end_ebml_master(pb, blockgroup);
@@@ -1277,14 -1201,14 +1287,14 @@@ static int mkv_write_packet(AVFormatCon
  
      // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
      // after 4k and on a keyframe
 -    if (mkv->cluster_pos &&
 +    if (mkv->cluster_pos != -1 &&
          ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000))
           ||                      cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000
           || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) {
          av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
                 " bytes, pts %" PRIu64 "\n", avio_tell(pb), ts);
          end_ebml_master(pb, mkv->cluster);
 -        mkv->cluster_pos = 0;
 +        mkv->cluster_pos = -1;
          if (mkv->dyn_bc)
              mkv_flush_dynbuf(s);
      }
@@@ -1330,13 -1254,34 +1340,34 @@@ static int mkv_write_trailer(AVFormatCo
      if (mkv->dyn_bc) {
          end_ebml_master(mkv->dyn_bc, mkv->cluster);
          mkv_flush_dynbuf(s);
 -    } else if (mkv->cluster_pos) {
 +    } else if (mkv->cluster_pos != -1) {
          end_ebml_master(pb, mkv->cluster);
      }
  
      if (pb->seekable) {
          if (mkv->cues->num_entries) {
-             cuespos = mkv_write_cues(pb, mkv->cues, mkv->tracks, s->nb_streams);
+             if (mkv->reserve_cues_space) {
+                 int64_t cues_end;
+                 currentpos = avio_tell(pb);
+                 avio_seek(pb, mkv->cues_pos, SEEK_SET);
 -                cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams);
++                cuespos = mkv_write_cues(pb, mkv->cues, mkv->tracks, s->nb_streams);
+                 cues_end = avio_tell(pb);
+                 if (cues_end > cuespos + mkv->reserve_cues_space) {
+                     av_log(s, AV_LOG_ERROR, "Insufficient space reserved for cues: %d "
+                            "(needed: %"PRId64").\n", mkv->reserve_cues_space,
+                            cues_end - cuespos);
+                     return AVERROR(EINVAL);
+                 }
+                 if (cues_end < cuespos + mkv->reserve_cues_space)
+                     put_ebml_void(pb, mkv->reserve_cues_space - (cues_end - cuespos));
+                 avio_seek(pb, currentpos, SEEK_SET);
+             } else {
 -                cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams);
++                cuespos = mkv_write_cues(pb, mkv->cues, mkv->tracks, s->nb_streams);
+             }
  
              ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES, cuespos);
              if (ret < 0) return ret;
@@@ -1377,34 -1322,22 +1408,49 @@@ static int mkv_query_codec(enum AVCodec
      return 0;
  }
  
 +const AVCodecTag additional_audio_tags[] = {
 +    { AV_CODEC_ID_ALAC,      0XFFFFFFFF },
 +    { AV_CODEC_ID_EAC3,      0XFFFFFFFF },
 +    { AV_CODEC_ID_MLP,       0xFFFFFFFF },
 +    { AV_CODEC_ID_OPUS,      0xFFFFFFFF },
 +    { AV_CODEC_ID_PCM_S16BE, 0xFFFFFFFF },
 +    { AV_CODEC_ID_PCM_S24BE, 0xFFFFFFFF },
 +    { AV_CODEC_ID_PCM_S32BE, 0xFFFFFFFF },
 +    { AV_CODEC_ID_QDM2,      0xFFFFFFFF },
 +    { AV_CODEC_ID_RA_144,    0xFFFFFFFF },
 +    { AV_CODEC_ID_RA_288,    0xFFFFFFFF },
 +    { AV_CODEC_ID_COOK,      0xFFFFFFFF },
 +    { AV_CODEC_ID_TRUEHD,    0xFFFFFFFF },
 +    { AV_CODEC_ID_WAVPACK,   0xFFFFFFFF },
 +    { AV_CODEC_ID_NONE,      0xFFFFFFFF }
 +};
 +
 +const AVCodecTag additional_video_tags[] = {
 +    { AV_CODEC_ID_PRORES,    0xFFFFFFFF },
 +    { AV_CODEC_ID_RV10,      0xFFFFFFFF },
 +    { AV_CODEC_ID_RV20,      0xFFFFFFFF },
 +    { AV_CODEC_ID_RV30,      0xFFFFFFFF },
 +    { AV_CODEC_ID_RV40,      0xFFFFFFFF },
 +    { AV_CODEC_ID_VP9,       0xFFFFFFFF },
 +    { AV_CODEC_ID_NONE,      0xFFFFFFFF }
 +};
 +
+ #define OFFSET(x) offsetof(MatroskaMuxContext, x)
+ #define FLAGS AV_OPT_FLAG_ENCODING_PARAM
+ static const AVOption options[] = {
+     { "reserve_index_space", "Reserve a given amount of space (in bytes) at the beginning "
+         "of the file for the index (cues).", OFFSET(reserve_cues_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
+     { NULL },
+ };
  #if CONFIG_MATROSKA_MUXER
+ static const AVClass matroska_class = {
+     .class_name = "matroska muxer",
+     .item_name  = av_default_item_name,
+     .option     = options,
+     .version    = LIBAVUTIL_VERSION_INT,
+ };
  AVOutputFormat ff_matroska_muxer = {
      .name              = "matroska",
      .long_name         = NULL_IF_CONFIG_SMALL("Matroska"),
      .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
                           AVFMT_TS_NONSTRICT,
      .codec_tag         = (const AVCodecTag* const []){
 -         ff_codec_bmp_tags, ff_codec_wav_tags, 0
 +         ff_codec_bmp_tags, ff_codec_wav_tags,
 +         additional_audio_tags, additional_video_tags, 0
      },
 +#if FF_API_ASS_SSA
      .subtitle_codec    = AV_CODEC_ID_SSA,
 +#else
 +    .subtitle_codec    = AV_CODEC_ID_ASS,
 +#endif
      .query_codec       = mkv_query_codec,
+     .priv_class        = &matroska_class,
  };
  #endif
  
  #if CONFIG_WEBM_MUXER
+ static const AVClass webm_class = {
+     .class_name = "webm muxer",
+     .item_name  = av_default_item_name,
+     .option     = options,
+     .version    = LIBAVUTIL_VERSION_INT,
+ };
  AVOutputFormat ff_webm_muxer = {
      .name              = "webm",
      .long_name         = NULL_IF_CONFIG_SMALL("WebM"),
      .write_trailer     = mkv_write_trailer,
      .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
                           AVFMT_TS_NONSTRICT,
+     .priv_class        = &webm_class,
  };
  #endif
  
  #if CONFIG_MATROSKA_AUDIO_MUXER
+ static const AVClass mka_class = {
+     .class_name = "matroska audio muxer",
+     .item_name  = av_default_item_name,
+     .option     = options,
+     .version    = LIBAVUTIL_VERSION_INT,
+ };
  AVOutputFormat ff_matroska_audio_muxer = {
      .name              = "matroska",
      .long_name         = NULL_IF_CONFIG_SMALL("Matroska"),
      .write_packet      = mkv_write_packet,
      .write_trailer     = mkv_write_trailer,
      .flags             = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
 -    .codec_tag         = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
 +    .codec_tag         = (const AVCodecTag* const []){
 +        ff_codec_wav_tags, additional_audio_tags, 0
 +    },
+     .priv_class        = &mka_class,
  };
  #endif
diff --combined libavformat/version.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Version macros.
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 55
 -#define LIBAVFORMAT_VERSION_MINOR  0
 -#define LIBAVFORMAT_VERSION_MICRO  1
 +#define LIBAVFORMAT_VERSION_MINOR  4
- #define LIBAVFORMAT_VERSION_MICRO 100
++#define LIBAVFORMAT_VERSION_MICRO 101
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \
   * the public API and may change, break or disappear at any time.
   */
  
 +#ifndef FF_API_OLD_AVIO
 +#define FF_API_OLD_AVIO                (LIBAVFORMAT_VERSION_MAJOR < 55)
 +#endif
 +#ifndef FF_API_PKT_DUMP
 +#define FF_API_PKT_DUMP                (LIBAVFORMAT_VERSION_MAJOR < 54)
 +#endif
 +#ifndef FF_API_ALLOC_OUTPUT_CONTEXT
 +#define FF_API_ALLOC_OUTPUT_CONTEXT    (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_FORMAT_PARAMETERS
 +#define FF_API_FORMAT_PARAMETERS       (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_NEW_STREAM
 +#define FF_API_NEW_STREAM              (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_SET_PTS_INFO
 +#define FF_API_SET_PTS_INFO            (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_CLOSE_INPUT_FILE
 +#define FF_API_CLOSE_INPUT_FILE        (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_READ_PACKET
 +#define FF_API_READ_PACKET             (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_ASS_SSA
 +#define FF_API_ASS_SSA                 (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_R_FRAME_RATE
 +#define FF_API_R_FRAME_RATE            1
 +#endif
  #endif /* AVFORMAT_VERSION_H */