Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 11 Jun 2013 07:36:01 +0000 (09:36 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 11 Jun 2013 07:36:34 +0000 (09:36 +0200)
* qatar/master:
  lavc: add a libwavpack encoder wrapper

Conflicts:
Changelog
doc/encoders.texi
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
configure
doc/encoders.texi
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/libwavpackenc.c
libavcodec/version.h

diff --cc 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.
 -- avconv -deinterlace option removed, the yadif filter should be used instead
 +- extractplanes filter
 +- avectorscope filter
 +- ADPCM DTK decoder
 +- ADP demuxer
 +- RSD demuxer
 +- RedSpark demuxer
 +- ADPCM IMA Radical decoder
 +- zmq filters
 +- DCT denoiser filter (dctdnoiz)
 +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
  - Apple Intermediate Codec decoder
  - Escape 130 video decoder
 +- FTP protocol support
 +- V4L2 output device
 +- 3D LUT filter (lut3d)
 +- SMPTE 302M audio encoder
  - support for slice multithreading in libavfilter
 +- Hald CLUT support (generation and filtering)
  - VC-1 interlaced B-frame support
  - support for WavPack muxing (raw and in Matroska)
 +- XVideo output device
 +- vignette filter
 +- True Audio (TTA) encoder
  - Go2Webinar decoder
 +- mcdeint filter ported from libmpcodecs
 +- sab filter ported from libmpcodecs
 +- ffprobe -show_chapters option
+ - WavPack encoding through libwavpack
  
  
 -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
 +- 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:
  
 -version 9_beta3:
 -- ashowinfo audio filter
 +- 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
diff --cc configure
+++ b/configure
@@@ -215,23 -192,15 +215,24 @@@ External library support
    --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
    --enable-libopus         enable Opus decoding via libopus [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
 +  --enable-libquvi         enable quvi input via libquvi [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
 +  --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
 +  --enable-libsoxr         enable Include libsoxr resampling [no]
    --enable-libspeex        enable Speex de/encoding via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
 +  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
 +  --enable-libv4l2         enable libv4l2/v4l-utils [no]
 +  --enable-libvidstab      enable video stabilization using vid.stab [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
 -  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
 +  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
 +                           native implementation exists [no]
    --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
+   --enable-libwavpack      enable wavpack encoding via libwavpack [no]
    --enable-libx264         enable H.264 encoding via x264 [no]
    --enable-libxavs         enable AVS encoding via xavs [no]
    --enable-libxvid         enable Xvid encoding via xvidcore,
@@@ -2011,12 -1792,10 +2013,13 @@@ libvpx_vp8_decoder_deps="libvpx
  libvpx_vp8_encoder_deps="libvpx"
  libvpx_vp9_decoder_deps="libvpx"
  libvpx_vp9_encoder_deps="libvpx"
+ libwavpack_encoder_deps="libwavpack"
  libx264_encoder_deps="libx264"
 +libx264rgb_encoder_deps="libx264"
  libxavs_encoder_deps="libxavs"
  libxvid_encoder_deps="libxvid"
 +libutvideo_decoder_deps="libutvideo"
 +libutvideo_encoder_deps="libutvideo"
  
  # demuxers / muxers
  ac3_demuxer_select="ac3_parser"
@@@ -4152,27 -3734,16 +4155,28 @@@ enabled libvorbis  && require  libvorbi
  enabled libvpx     && {
      enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
                                  die "ERROR: libvpx decoder version must be >=0.9.1"; }
 -    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
 -                                die "ERROR: libvpx encoder version must be >=0.9.6"; }
 +    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
 +                                die "ERROR: libvpx encoder version must be >=0.9.7"; }
      enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder;  }
      enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
+ enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
  enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 &&
                        { check_cpp_condition x264.h "X264_BUILD >= 118" ||
 -                        die "ERROR: libx264 version must be >= 0.118."; }
 +                        die "ERROR: libx264 must be installed and version must be >= 0.118."; }
  enabled libxavs    && require  libxavs xavs.h xavs_encoder_encode -lxavs
  enabled libxvid    && require  libxvid xvid.h xvid_global -lxvidcore
 +enabled libzmq     && require_pkg_config libzmq zmq.h zmq_ctx_new
 +enabled openal     && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
 +                        check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
 +                        die "ERROR: openal not found"; } &&
 +                      { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
 +                        die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
 +enabled opencl     && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL ||
 +                        check_lib2 CL/cl.h clEnqueueNDRangeKernel -lOpenCL ||
 +                        die "ERROR: opencl not found"; } &&
 +                      { check_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" ||
 +                        check_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" ||
 +                        die "ERROR: opencl must be installed and version must be 1.2 or compatible"; }
  enabled openssl    && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                          check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                          check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
@@@ -412,119 -412,35 +412,148 @@@ Selected by Encoder (default
  
  @end table
  
 +@section libmp3lame
 +
 +LAME (Lame Ain't an MP3 Encoder) MP3 encoder wrapper
 +
 +Requires the presence of the libmp3lame headers and library during
 +configuration. You need to explicitly configure the build with
 +@code{--enable-libmp3lame}.
 +
 +@subsection Option Mapping
 +
 +The following options are supported by the libmp3lame wrapper,
 +the LAME-equivalent options follow the FFmpeg ones.
 +
 +@multitable @columnfractions .2 .2
 +@item FFmpeg            @tab LAME
 +@item b                 @tab b
 +FFmpeg @code{b} option is expressed in bits/s, lame @code{bitrate}
 +in kilobits/s.
 +@item q                 @tab V
 +Quality setting for VBR.
 +@item compression_level @tab q
 +Algorithm quality. Valid options are integers from 0-9.
 +@item reservoir         @tab N.A.
 +Enable use of bit reservoir. LAME has this enabled by default.
 +@item joint_stereo      @tab -m j
 +Enables the encoder to use (on a frame by frame basis) either L/R
 +stereo or mid/side stereo.
 +@end multitable
 +
 +@section libtwolame
 +
 +TwoLAME MP2 encoder wrapper
 +
 +Requires the presence of the libtwolame headers and library during
 +configuration. You need to explicitly configure the build with
 +@code{--enable-libtwolame}.
 +
 +@subsection Options Mapping
 +
 +The following options are supported by the libtwolame wrapper. The
 +TwoLAME-equivalent options follow the FFmpeg ones and are in
 +parentheses.
 +
 +@table @option
 +@item b
 +(b) Set bitrate in bits/s. Note that FFmpeg @code{b} option is
 +expressed in bits/s, twolame @code{b} in kilobits/s. The default
 +value is 128k.
 +
 +@item q
 +(V) Set quality for experimental VBR support. Maximum value range is
 +from -50 to 50, useful range is from -10 to 10.
 +
 +@item mode
 +(mode) Set MPEG mode. Possible values:
 +
 +@table @samp
 +@item auto
 +Choose mode automatically based on the input. This is the default.
 +@item stereo
 +Stereo
 +@item joint_stereo
 +Joint stereo
 +@item dual_channel
 +Dual channel
 +@item mono
 +Mono
 +@end table
 +
 +@item psymodel
 +(psyc-mode) Set psychoacoustic model to use in encoding. The argument
 +must be an integer between -1 and 4, inclusive. The higher the value,
 +the better the quality. The default value is 3.
 +
 +@item energy_levels
 +(energy) Enable energy levels extensions when set to 1. The default
 +value is 0 (disabled).
 +
 +@item error_protection
 +(protect) Enable CRC error protection when set to 1. The default value
 +is 0 (disabled).
 +
 +@item copyright
 +(copyright) Set MPEG audio copyright flag when set to 1. The default
 +value is 0 (disabled).
 +
 +@item original
 +(original) Set MPEG audio original flag when set to 1. The default
 +value is 0 (disabled).
 +
 +@end table
 +
 +@section libvo-aacenc
 +
 +VisualOn AAC encoder
 +
 +Requires the presence of the libvo-aacenc headers and library during
 +configuration. You need to explicitly configure the build with
 +@code{--enable-libvo-aacenc --enable-version3}.
 +
 +@subsection Options
 +
 +The VisualOn AAC encoder only support encoding AAC-LC and up to 2
 +channels. It is also CBR-only. It is considered to be worse than the
 +native experimental FFmpeg AAC encoder.
 +
 +@table @option
 +
 +@item b
 +Bitrate.
 +
 +@end table
 +
+ @section libwavpack
+ A wrapper providing WavPack encoding through libwavpack.
+ Only lossless mode using 32-bit integer samples is supported currently.
+ The @option{compression_level} option can be used to control speed vs.
+ compression tradeoff, with the values mapped to libwavpack as follows:
+ @table @option
+ @item 0
+ Fast mode - corresponding to the wavpack @option{-f} option.
+ @item 1
+ Normal (default) settings.
+ @item 2
+ High quality - corresponding to the wavpack @option{-h} option.
+ @item 3
+ Very high quality - corresponding to the wavpack @option{-hh} option.
+ @item 4-8
+ Same as 3, but with extra processing enabled - corresponding to the wavpack
+ @option{-x} option. I.e. 4 is the same as @option{-x2} and 8 is the same as
+ @option{-x6}.
+ @end table
  @c man end AUDIO ENCODERS
  
  @chapter Video Encoders
@@@ -95,9 -79,17 +95,17 @@@ Go to @url{http://www.webmproject.org/
  installing the library. Then pass @code{--enable-libvpx} to configure to
  enable it.
  
+ @section libwavpack
+ Libav can make use of the libwavpack library for WavPack encoding.
+ Go to @url{http://www.wavpack.com/} and follow the instructions for
+ installing the library. Then pass @code{--enable-libwavpack} to configure to
+ enable it.
  @section x264
  
 -Libav can make use of the x264 library for H.264 encoding.
 +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
@@@ -905,11 -816,10 +913,12 @@@ following image formats are supported
  @item TrueHD                 @tab     @tab  X
      @tab Used in HD-DVD and Blu-Ray discs.
  @item TwinVQ (VQF flavor)    @tab     @tab  X
 +@item VIMA                   @tab     @tab  X
 +    @tab Used in LucasArts SMUSH animations.
  @item Vorbis                 @tab  E  @tab  X
      @tab A native but very primitive encoder exists.
- @item WavPack                @tab     @tab  X
+ @item WavPack                @tab  E  @tab  X
+     @tab supported through external library libwavpack
  @item Westwood Audio (SND1)  @tab     @tab  X
  @item Windows Media Audio 1  @tab  X  @tab  X
  @item Windows Media Audio 2  @tab  X  @tab  X
Simple merge
@@@ -488,27 -425,17 +488,28 @@@ void avcodec_register_all(void
      REGISTER_ENCDEC (LIBOPENJPEG,       libopenjpeg);
      REGISTER_ENCDEC (LIBOPUS,           libopus);
      REGISTER_ENCDEC (LIBSCHROEDINGER,   libschroedinger);
 +    REGISTER_ENCODER(LIBSHINE,          libshine);
      REGISTER_ENCDEC (LIBSPEEX,          libspeex);
 +    REGISTER_DECODER(LIBSTAGEFRIGHT_H264, libstagefright_h264);
      REGISTER_ENCODER(LIBTHEORA,         libtheora);
 +    REGISTER_ENCODER(LIBTWOLAME,        libtwolame);
 +    REGISTER_ENCDEC (LIBUTVIDEO,        libutvideo);
      REGISTER_ENCODER(LIBVO_AACENC,      libvo_aacenc);
      REGISTER_ENCODER(LIBVO_AMRWBENC,    libvo_amrwbenc);
 -    REGISTER_ENCODER(LIBVORBIS,         libvorbis);
 +    REGISTER_ENCDEC (LIBVORBIS,         libvorbis);
      REGISTER_ENCDEC (LIBVPX_VP8,        libvpx_vp8);
      REGISTER_ENCDEC (LIBVPX_VP9,        libvpx_vp9);
+     REGISTER_ENCODER(LIBWAVPACK,        libwavpack);
      REGISTER_ENCODER(LIBX264,           libx264);
 +    REGISTER_ENCODER(LIBX264RGB,        libx264rgb);
      REGISTER_ENCODER(LIBXAVS,           libxavs);
      REGISTER_ENCODER(LIBXVID,           libxvid);
 +    REGISTER_ENCODER(LIBAACPLUS,        libaacplus);
 +
 +    /* text */
 +    REGISTER_DECODER(BINTEXT,           bintext);
 +    REGISTER_DECODER(XBIN,              xbin);
 +    REGISTER_DECODER(IDF,               idf);
  
      /* parsers */
      REGISTER_PARSER(AAC,                aac);
index 0000000,34ec013..77d98a2
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,194 +1,194 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <wavpack/wavpack.h>
+ #include <string.h>
+ #include "libavutil/attributes.h"
+ #include "libavutil/opt.h"
+ #include "libavutil/samplefmt.h"
+ #include "audio_frame_queue.h"
+ #include "avcodec.h"
+ #include "internal.h"
+ #define WV_DEFAULT_BLOCK_SIZE 32768
+ typedef struct LibWavpackContext {
+     const AVClass *class;
+     WavpackContext *wv;
+     AudioFrameQueue afq;
+     AVPacket *pkt;
+     int user_size;
+     int got_output;
+ } LibWavpackContext;
+ static int wavpack_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
+                                 const AVFrame *frame, int *got_output)
+ {
+     LibWavpackContext *s = avctx->priv_data;
+     int ret;
+     s->got_output = 0;
+     s->pkt        = pkt;
+     s->user_size  = pkt->size;
+     if (frame) {
+         ret = ff_af_queue_add(&s->afq, frame);
+         if (ret < 0)
+             return ret;
+         ret = WavpackPackSamples(s->wv, (int32_t*)frame->data[0], frame->nb_samples);
+         if (!ret) {
+             av_log(avctx, AV_LOG_ERROR, "Error encoding a frame: %s\n",
+                    WavpackGetErrorMessage(s->wv));
+             return AVERROR_UNKNOWN;
+         }
+     }
+     if (!s->got_output &&
+         (!frame || frame->nb_samples < avctx->frame_size)) {
+         ret = WavpackFlushSamples(s->wv);
+         if (!ret) {
+             av_log(avctx, AV_LOG_ERROR, "Error flushing the encoder: %s\n",
+                    WavpackGetErrorMessage(s->wv));
+             return AVERROR_UNKNOWN;
+         }
+     }
+     if (s->got_output) {
+         ff_af_queue_remove(&s->afq, avctx->frame_size, &pkt->pts, &pkt->duration);
+         *got_output = 1;
+     }
+     return 0;
+ }
+ static int encode_callback(void *id, void *data, int32_t count)
+ {
+     AVCodecContext *avctx = id;
+     LibWavpackContext *s  = avctx->priv_data;
+     int ret, offset = s->pkt->size;
+     if (s->user_size) {
+         if (s->user_size - count < s->pkt->size) {
+             av_log(avctx, AV_LOG_ERROR, "Provided packet too small.\n");
+             return 0;
+         }
+         s->pkt->size += count;
+     } else {
+         ret = av_grow_packet(s->pkt, count);
+         if (ret < 0) {
+             av_log(avctx, AV_LOG_ERROR, "Error allocating output packet.\n");
+             return 0;
+         }
+     }
+     memcpy(s->pkt->data + offset, data, count);
+     s->got_output = 1;
+     return 1;
+ }
+ static av_cold int wavpack_encode_init(AVCodecContext *avctx)
+ {
+     LibWavpackContext *s = avctx->priv_data;
+     WavpackConfig config = { 0 };
+     int ret;
+     s->wv = WavpackOpenFileOutput(encode_callback, avctx, NULL);
+     if (!s->wv) {
+         av_log(avctx, AV_LOG_ERROR, "Error allocating the encoder.\n");
+         return AVERROR(ENOMEM);
+     }
+     if (!avctx->frame_size)
+         avctx->frame_size = WV_DEFAULT_BLOCK_SIZE;
+     config.bytes_per_sample = 4;
+     config.bits_per_sample  = 32;
+     config.block_samples    = avctx->frame_size;
+     config.channel_mask     = avctx->channel_layout;
+     config.num_channels     = avctx->channels;
+     config.sample_rate      = avctx->sample_rate;
+     if (avctx->compression_level != FF_COMPRESSION_DEFAULT) {
+         if (avctx->compression_level >= 3) {
+             config.flags |= CONFIG_VERY_HIGH_FLAG;
+             if      (avctx->compression_level >= 8)
+                 config.xmode = 6;
+             else if (avctx->compression_level >= 7)
+                 config.xmode = 5;
+             else if (avctx->compression_level >= 6)
+                 config.xmode = 4;
+             else if (avctx->compression_level >= 5)
+                 config.xmode = 3;
+             else if (avctx->compression_level >= 4)
+                 config.xmode = 2;
+         } else if (avctx->compression_level >= 2)
+             config.flags |= CONFIG_HIGH_FLAG;
+         else if (avctx->compression_level < 1)
+             config.flags |= CONFIG_FAST_FLAG;
+     }
+     ret = WavpackSetConfiguration(s->wv, &config, -1);
+     if (!ret)
+         goto fail;
+     ret = WavpackPackInit(s->wv);
+     if (!ret)
+         goto fail;
+     ff_af_queue_init(avctx, &s->afq);
+     return 0;
+ fail:
+     av_log(avctx, AV_LOG_ERROR, "Error configuring the encoder: %s.\n",
+            WavpackGetErrorMessage(s->wv));
+     WavpackCloseFile(s->wv);
+     return AVERROR_UNKNOWN;
+ }
+ static av_cold int wavpack_encode_close(AVCodecContext *avctx)
+ {
+     LibWavpackContext *s = avctx->priv_data;
+     WavpackCloseFile(s->wv);
+     ff_af_queue_close(&s->afq);
+     return 0;
+ }
+ AVCodec ff_libwavpack_encoder = {
+     .name           = "libwavpack",
+     .type           = AVMEDIA_TYPE_AUDIO,
+     .id             = AV_CODEC_ID_WAVPACK,
+     .priv_data_size = sizeof(LibWavpackContext),
+     .init           = wavpack_encode_init,
+     .encode2        = wavpack_encode_frame,
+     .close          = wavpack_encode_close,
+     .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME,
+     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32,
+                                                      AV_SAMPLE_FMT_NONE },
+ };
   * Libavcodec version macros.
   */
  
 +#include "libavutil/avutil.h"
 +
  #define LIBAVCODEC_VERSION_MAJOR 55
- #define LIBAVCODEC_VERSION_MINOR  15
 -#define LIBAVCODEC_VERSION_MINOR  9
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  16
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \